1.3 HTTP安全

当我们使用浏览器输入网址,按下<Enter>键的那一刹那,浏览器就会代替我们发出HTTP请求。在这个过程中扮演着重要角色的就是HTTP。本节会介绍HTTP安全方面的知识。

1.3.1 URL编码的基本概念

在日常的HTTP请求中,除了可见字符之外还存在不可见字符,如回车、Tab,或者存在特殊意义的字符,如&(URL中用于分割参数)、#(HTML中的锚点)、?(开始传参的符号)等。这部分数据无法直接手工输入,但是如果在解题时必须要输入这些特殊字符该如何去做呢?这时候就要用到“URL编码”了。URL编码会将这些字符转换成%+16进制的ASCII码。

例如,对于#这个字符,对应的URL编码过程如图1-3所示。

图1-3 URL编码转换过程

假设我们直接输入“#”,会被浏览器当作是一个锚点(有特殊意义),如图1-4所示。

图1-4 直接输入“#”的情况

而输入“%23”,经过浏览器自动URL解码后,会被解析成普通的#字符,如图1-5所示。

在CTF中,如SQL注入、反序列化、命令执行等题目中常常会有特殊或者不可见字符,所以经常会用到URL编码。

图1-5 输入“%23”的情况

1.3.2 UA头伪造漏洞的概念及利用方法

UA头,全称User-Agent。每个HTTP请求中都会携带UA头。这个头会包含我们所使用的操作系统版本、CPU、浏览器类型等。

对其进行说明。

• Windows NT 10.0;Win64;x64:表示Win10 64位操作系统。

• Chrome/91.0.4472.11:谷歌浏览器版本号。

那么UA头起到什么作用呢?

在Web开发中,一般会根据UA头来判断客户端是用什么设备或者什么浏览器访问来进行页面适配,或者说禁止某些浏览器访问。

大家平时在上网时应该都遇到过这个情况,在访问某些网页时,这些网页会提示“请从微信客户端打开链接”,这里就用到了UA头,从微信访问的UA头中有一些特征(关键字符)。通过判断这个UA头中是否含有微信客户端的特征来判断用户是否是从微信客户端访问的。

那么怎么来获取这个UA头呢。这里需要一个工具——ncat(网络工具中的瑞士军刀)。该文件已附在随书资源中,大家可以进行下载。

使用命令nc-l 4567,监听本地的4567端口,然后从微信中访问http://127.0.0.1:4567。此时就能抓取到HTTP请求了,如图1-6所示。

图1-6 监听演示

在Linux下也同理。

回到上面监听到的结果上。观察UA头部分。发现和微信有关的有两个:

MicroMessenger是微信内置浏览器的UA,WindowsWechat说明是Windows微信。

那么该如何修改UA来访问呢。这里要用到一个工具——BurpSuite。同样也在随书资源中提供。

设置好BurpSuite之后,进行抓包操作,如图1-7所示。

或者使用命令行工具指定UA头:

图1-7 BurpSuite修改UA头

curl是一个发起HTTP请求的工具。有各种参数,如下。

• -i:显示返回的HTTP请求。

• -X:指定HTTP请求模式(GET/POST/xxxx)。

• -d:POST数据。

• -F:文件上传。

• -H:指定HTTP头。

• --cookie:指定HTTP请求的Cookie。

还有很多参数,大家可以自行了解。

1.3.3 返回头分析方法

HTTP请求分为请求和响应,那么我们能从响应中获取哪些信息呢?

curl-v域名或者BurpSuite抓取返回包可获得下面这样的请求包字串:

从这个返回包中,可以看到HTTP状态码、响应的时间、中间件信息和Cookie。

1) HTTP状态码(例子中是200):

• 1xx代表信息,服务器收到请求,需要请求者继续执行操作。

• 2xx代表成功,操作被成功接收并处理。

• 3xx代表重定向,需要进一步的操作以完成请求。

• 4xx代表客户端错误,请求包含语法错误或无法完成请求。

• 5xx代表服务器错误,服务器在处理请求的过程中发生了错误。

2)响应时间(Date):

CTF流量分析中可以看具体时间,如黑客在几点几分操作之类。

3)中间件信息(Server):

从返回结果中可以知道目标使用的是Apache中间件,版本为2.4.29,且操作系统为Ubuntu。那么在之后的渗透过程中,我们就可以利用这些信息去测试对应的漏洞。

4)Cookie:

可以修改Cookie的值,或许会有越权之类的漏洞。

1.3.4 来源伪造漏洞的概念及利用方法

HTTP请求头中还会携带一个Referer,那么这个请求头是用来做什么的呢?Referer头会告诉服务器用户是从哪个页面过来的。例如,我们从百度单击一个链接之后跳转到其他网站,那么此时Referer就会带上当前的URL,相当于告诉服务器:我是从百度跳转过来访问你的,如图1-8所示。

图1-8 访问百度时的Referer

举个例子,在部分CTF题目中,只有一句话“are you from google”时就要加一个Referer: https://www.google.com/,说明自己是从google过来的。

1.3.5 案例解析——[极客大挑战2019]HTTP

接下来让我们看“[极客大挑战2019]HTTP”这道题。

打开题目只有一个界面。F12发现了一个Secret. php。访问后有一句话It doesn't come 'from https://www.Sycsecret.com'。

猜测题目需要我们从https://www.Sycsecret.com来访问。这时候就需要添加一个Referer头,这里使用BurpSuite来修改Referer头,如图1-9所示。

图1-9 BurpSuite修改Referer头

下一步让我们使用“Syclover”browser,而HTTP中带有浏览器信息的就是UA头,所以这里修改UA头,如图1-10所示。

图1-10 BurpSuite修改User-Agent头

接下来,只允许本地访问。常见的可以用于伪造IP的请求头有X-Forwarded-For、X-Client。这里我们再次添加一个X-Forwarded-For头后,成功拿到Flag,如图1-11所示。

图1-11 添加XFF头之后获得Flag