0.题前介绍(亦可在基础知识一栏寻找)
一个完整的 HTTP 请求一般由以下几部分组成:
请求行 包括 HTTP 方法(如 GET、POST)、目标 URL 和 HTTP 协议版本。 示例: GET /api/resource HTTP/1.1
请求头(Headers) 是附加在请求中的键值对,用来传递关于客户端、服务器或请求本身的元信息,例如认证信息、内容类型、语言等。
请求体(Body) 包含需要发送给服务器的数据,一般在 POST、PUT 请求中用到,GET 请求通常没有请求体。
请求头的功能
请求头主要用来补充和说明请求的额外信息,常见的请求头包括:
Host:目标服务器的域名或 IP 地址。
User-Agent:客户端的标识信息,例如浏览器类型、版本等。
Authorization:认证信息,比如 Bearer token。
Content-Type:说明请求体数据的格式,如 application/json。
Accept:表明客户端期望的响应数据类型,如 text/html 或 application/json。
Cookie:发送给服务器的 Cookie 数据。
请求信息的组成:
请求行
请求头
(可选)请求体
也可以参考这个帖子。
1.工具下载
在做这道题之前,我们需要先下载一个对于网安学习非常有用的工具:Burp Suite。
它是什么?是用于攻击web 应用程序的集成平台。包含了许多工具。Burp Suite为这些工具设计了许多接口,以加快攻击应用程序的过程。所有工具都共享一个请求,并能处理对应的HTTP 消息、持久性、认证、代理、日志、警报。
关于Burp Suite工具的具体学习可以参考前辈们的帖子,你的界面可能会与教程有些许不同。这里仅作参考。
然后,我们需要再下载一个重要的火狐浏览器插件:Foxyproxy。FoxyProxy是一个专为Firefox浏览器设计的高级的代理管理工具。它与BurpSuite结合使用可以优化网络安全实践。
2. Level 1
我们创建实例,可以得到这样一个提示:
除了GET和POST,还有HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT、PATCH、COPY、MOVE、LINK、UNLINK、WRAPPED等请求方法。
这里我们以HEAD方法为例。
HEAD方法与GET请求类似,但HEAD请求不会返回响应体,仅返回HTTP头信息。这常用于检查资源是否存在而不加载资源。主要用于获取远程服务器上文件的信息,而不返回文件本身的内容。
通俗点讲,HEAD 方法不像 GET 方法那样会返回整个网页的具体内容。而只会返回头信息,像该资源的状态码、内容类型最后修改时间等元数据,通过这些头部信息,客户端就能提前知晓资源的一些基本情况。
接下来我们配置一下Foxyproxy。
打开插件,点击 “选项” ,进入设置界面。然后点击 “Proxies”(代理) 。接着在 Hostname(域名) 一栏输入127.0.0.1 。在 “端口” 一栏输入 8080。
这一系列步骤的主要目的是在 Foxyproxy 插件中配置代理服务器的相关参数,使得通过该插件进行网络访问时能够将请求转发到指定的代理服务器地址和端口。我们在 “Hostname(域名)” 一栏输入 127.0.0.1,意味着我们把请求转发到了本地回环地址(也就是我们自己的计算机上)。这意味着代理服务器是在本地计算机上运行的。这样配置可以将网络请求先发送到本地计算机上的Burp suite进行处理,而不是直接发送到目标网站。“8080”端口是一个常见端口,这里不赘述。
我们点击Save,回到Level1,然后启动Foxyproxy。点击我们设置的代理。
(特别提醒:每次运用完插件后需要把插件关闭 (每用一次关一次!!!),否则代理会覆盖正常的访问,导致我们无法访问新网页!)
然后再打开Burpsuite,“新建临时项目”,然后一直点击"下一个",”确认“,来到主界面。
这个工具的学习在这里不提。我们点击”代理“,”拦截已关闭“来开启拦截。
这一步的原理主要是:Foxyproxy把我们浏览器的网络访问请求转发到我们自己的计算机上,Burpsuite再对这些访问进行拦截。
我们可以看到,界面上出现了来自目标网站的请求。方法为 ”GET“ 。那么,怎么把这方法改成”HEAD“呢?
我们右键选中这个请求,点击 ”发送到Repeater(重放器)“
(重放器的作用:放出指定请求,记录响应结果。)
我们会看到如下界面:
这是一个使用GET方法的HTTP请求报文。
GET /level1 HTTP/1.1
Host: 127.0.0.1:60220
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Referer: http://127.0.0.1:60220/
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Priority: u=0, i
它的具体解释可以参考这个帖子,也可以参考前面的介绍。
在这里,我们只需要知道:
第一行表示客户端希望从服务器获取位于/level1这个路径下的资源。
第二行指定了请求要发送到的目标主机地址以及端口号。
我们直接将开头的“GET”改成“HEAD”,然后点击发送,得到如下响应结果:
返回的头信息如下:
HTTP/1.1 302 FOUND
//中间省略
Location: /ChA11enge2
开头的“302”是HTTP状态码。它的意思是“临时重定向”。意味着这个网页的地址暂时转为了“Location”所在的地址。即/ChA11enge2。
因此,Level 2 的网址就是:http://127.0.0.1:60220/ChA11enge2。
2.1.(扩展:为什么不能用GET方法?)
我们已经知道:302状态码意味着”临时重定向“。而在浏览器中,GET在遇到302状态码时遵循这样一套逻辑:
首先,浏览器会把请求传送到原先的网页,并在此遇到302状态码,302状态码会把响应包(这响应包里就有重定向后的地址)传回给浏览器,告知浏览器需要向重定向后的地址再次发送GET请求;
然后,浏览器会再发送一次请求到302状态码重定向到的地址,并最终返回重定向地址内的资源。
我们使用Burpsuite工具拦截了第二次请求,并在重放器内单独放出第一次请求,导致浏览器无法使用GET方法得到重定向地址的资源。所以我们得到的响应结果就只有原网页的结果。
但在使用HEAD方法时,服务器不会返回资源的主体数据,只返回响应头,即资源的“元信息”。所以GET会把302状态码直接返回给响应,不会涉及响应包的问题。
3.Level 2
我们可以得到这样的界面:
Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。
我们可以使用Hackbar插件向网站直接插入Cookie。调出Hackbar,点击“Load URL”, 选择“Cookie”。
然后在下方新增的"C"栏填入“redrocker=true”,点击“Execute”,即可自动跳转到 Level 3 的网页:
http://127.0.0.1:60220/TRRYY3。
4. Level 3
我们可以看到这个界面:
先说XFF是什么。同Host,User-Agent一样,XFF(X-Forwarded-For)也是一个HTTP请求头字段。它的作用是识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址。 也就是说,XFF相当于“通关文牒”上的“身份证号码”。它记录了我们的IP地址。
而XFF伪造,就是把XFF请求头改变,以隐藏自己的真实IP的一种伪造方式。
我们打开Burpsuite,拦截浏览器对/TRRYY3的访问请求,随后点击右侧 “Inspector(检查器)” 中的 “请求头” 选项,点击下方的 “+” 号,添加名为 “X-Forwarded-For”(注意大小写),值为 127.0.0.1 的请求头。
点击添加,我们会得到这样的请求:
GET /TRRYY3 HTTP/1.1
Host: 127.0.0.1:57072
//中间省略
X-Forwarded-For: 127.0.0.1
随后我们发送请求,得到了这样的响应结果:
HTTP/1.1 302 FOUND
//中间省略
Location: /FINAL4
//后面省略
在这里,我们通过添加一个值为“127.0.0.1”的XFF请求头,让服务器误以为这条请求是从开发网站的本地计算机上发出的(也就是说,我们把自己伪装成了网站的开发人员),因此向我们敞开了大门。这便是XFF伪造的简单运用。XFF伪造是CTF竞赛中经常会用到的基本方法,了解这种方法,知道如何防范这种方法,有利于我们的网络安全学习。
这里给出“如何防范XFF伪造”的参考文章。
我们同时发现,GET方法在此时又找到了302状态码,得到了重定向的地址/FINAL4。这是为什么呢?这是出题人直接把最后一个网站放到了响应包里,相当于为我们开了条捷径。实际上,即使没有这条捷径,我们仍然可以根据上面的流程,用HEAD方法解决问题。
所以最终的目标就是:127.0.0.1:60220/FINAL4。
我们访问这个网站,可以看到如下界面:
所以,这道题的flag就是
flag{HTTP_Request_Modification}
学到了什么?
- HTTP 请求的基本格式
- Foxyproxy插件和Burpsuite工具的基础操作;
- GET方法和HEAD方法的不同;
- Cookie是什么以及怎么向网站传递Cookie;
- XFF与XFF伪造;
网络安全是一门很深的学科。我们不仅要做到“知其然”,更要做到“知其所以然”。在这个阶段,所有人都有可能感到自己在操控一架高度自动的外星飞船。学而不思则罔。我们要破除迷惑——这也是我写作的初心。