在HTTP请求报文中,请求头是我们需要重点了解的部分。请求头主要用于向网站发送客户端的一些信息,请求头中的字段非常多,并且都遵循着固定格式。不过并不是在每个请求报文中都要包含所有的字段,而是针对不同的网站,从不同的客户端所发出的HTTP请求头中的信息都是不相同的。
在这里并不准备集中介绍这些字段,而是随着课程的进展,将逐步对请求头中的一些常用字段展开介绍。
请求头中的常规字段
有些字段在绝大多数的请求头中都会存在,属于常规字段。比如下面所列举的几个字段:
(1) Host,所要访问网站的域名或IP地址以及端口号。
(2) Accept,客户端可以接收哪些MIME类型的消息。
MIME类型用来设定某种扩展名文件的打开方式,当具有该扩展名的文件被访问时,浏览器会自动使用指定的应用程序来打开,如jpg图片的MIME为image/jpeg。
比如Accept:text/html,表示客户端希望接收HTML文本。而如果是Accept:text/plain,则表示客户端只能接收纯文本,网站不能向它发送图片、视频等信息。
(3) Accept-Language,指定客户端可以接收的语言。
如果请求消息中没有设置这个域,默认是任何语言都可以接收。该项也可以作为用户地区的判断依据。
(4) User-Agent,客户端操作系统和浏览器的信息。
比如从Firefox浏览器发出的HTTP请求中的User-Agent字段的值:
利用curl发出的HTTP请求中的User-Agent字段的值:
网站通过User-Agent字段可以判断客户端操作系统和浏览器的类型,从而展示对应的页面,也可以通过UA来判断客户端的访问是否合法,是用户访问还是程序访问等。
上面所列举的几个字段,User-Agent非常重要,后面结合具体应用,还将展开详细介绍。至于其它几个字段,以及那些没有介绍的字段,由于在Web安全中较少涉及,这里就不一一列举了。
伪造客户端IP地址
这里首先需要明确一个问题,请求头中的所有字段都是可以修改的,这也是在Web安全中经常需要执行的操作。
另外,我们还可以根据需要在请求头中添加一些字段。
有些字段在请求头中可能平常很少出现,但是对于Web安全又非常重要,那么我们就可以根据需要在请求头中添加这些字段。
这其中最为常见的操作就是在请求头中添加“X-FORWARDED-FOR”字段,从而来伪造客户端的IP地址。
下面还是结合一个CTF例题来具体说明。
Bugku-Web-程序员本地网站
打开题目后,给出提示:“请从本地访问!”。
什么叫本地访问?这是我们首先需要搞清楚的一个概念。
以我们在CentOS虚拟机中搭建的DVWA网站为例,我们平时都是在真机中,通过Windows系统中的浏览器去访问这个网站。
假设CentOS虚拟机的IP是192.168.80.50,那么我们在浏览器中输入URL:http://192.168.80.50就可以访问到网站。
在客户端上通过网络访问服务器中的网站,这种方式称为远程访问。
如果我们直接在CentOS虚拟机中访问在这台服务器上的网站,这种方式就称为本地访问。
本地访问,既可以像客户端远程访问那样使用服务器的IP,比如http://192.168.80.50,也可以使用回环地址127.0.0.1,比如http://127.0.0.1。
很明显,回环地址只能用于本地访问。所以对于这个题目,要求我们从本地访问,也就是要求我们使用127.0.0.1这个地址去访问网站。
为什么要限制网站只能从本地访问呢?这是因为网站中的某些版块可能安全要求比较高(比如后台管理版块),要对这些版块进行操作,只允许在服务器本地进行。所以这个题目就是提出这样一种要求。
但我们在客户端肯定是无法实现对这个网站的本地访问的,这时就可以伪造客户端IP。如果我们把客户端的IP伪造成127.0.0.1,那么即使仍是通过服务器的IP去访问网站,但网站依然会认为我们是在本地访问。
修改请求头还是需要借助于Burpsuite,在Burpsuite中拦截请求报文并发送到Repeater模块,然后在请求头中添加X-Forwarded-For字段,并把值设置为127.0.0.1:
将修改后的请求报文发送出去,就从响应报文中得到flag:
利用浏览器插件伪造IP
在了解了HTTP协议的基本概念,并掌握了相关操作之后,我们终于可以继续对靶机进行操作了。
靶机中的网站同样要求只能在本地访问:
而且在源码的注释中,明确提示我们可以使用x-forwarded-for:
下面我们同样利用Burpsuite来修改x-forwarded-for的值,发现响应报文是一个302跳转,点击“Follow redirection“跟随跳转:
成功返回了网站主页面:
但是接下来对网站的访问都要求修改客户端IP,这样用Burpsuite操作起来就有些麻烦了。我们可以在Firefox浏览器中安装一个插件“x-forwarded-for Header”,通过这个插件也可以修改请求报文中的x-forwarded-for。
安装完插件后,设置要修改的客户端IP。这样我们只要点击了这个插件,那么所有从这个浏览器发出的请求报文中都是使用了经过伪造的IP。
这下就可以正常访问网站了,可以发现这是Alice所在的Ceban Corp公司的网站,下面我们将接着去寻找网站中是否存在漏洞。