在上一节教程中,我们安装了kali linux,这是一个内置了许多安全工具的Linux发行版系统,收到许多安全从业者的广泛欢迎。
这节课我们要用到的Burpsuite就已经在kali里内置好了。这是什么工具?
Burp Suite 是用于攻击web 应用程序的集成平台。它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程。所有的工具都共享一个能处理并显示HTTP 消息,持久性,认证,代理,日志,警报的一个强大的可扩展的框架。
Burp Suite是一款信息安全从业人员必备的集 成型的渗透测试工具,它采用自动测试和半自动测试的方式,通过拦截HTTP/HTTPS的web数据包,充当浏览器和相关应用程序的中间人,进行拦截、修改、重放数据包进行测试,是web安全人员的一把必备的瑞士军刀。
简单来说就是一个工具箱,集成了很多对Web特攻的工具。在后面的学习过程中,我们会经常用到它。
接下来讲一下bp中Proxy模块的基础使用
- Intercept按钮,字面意思上看是“拦截”,功能是拦截从浏览器发送到服务器的请求报文。(听不懂没关系,下面的HTTP协议部分会讲解)
- Open browser按钮,用于启动bp内置的浏览器(内置的原因是方便拦截请求,接下来也会讲)。
那么我们如何拦截一个报文呢?先点击Open browser启动内置浏览器,再点一下Intercept按钮,使其变为Intercept is on状态。
在浏览器的地址栏随便输入一个网址(这里选择百度)
然后按下回车访问网址,能看到bp中出现了一大段文字,即被拦截的我们的浏览器发送到百度服务器的请求报文。
我们可以随便对报文内容进行增删改。
在报文部分按右键,会看到许多选项,我们后面会慢慢讲解,这里暂时不需要深究。
接下来进入本章的重头戏————HTTP协议
先放一个严谨的定义
HTTP(Hypertext Transfer Protocol)是一种用于分布式、协作式和超媒体信息系统的应用层协议,其最常见的用途是作为万维网(WWW)上的数据传输协议。HTTP 是一个无状态的请求/响应协议,客户端(通常是浏览器)发起请求,服务器提供响应。请求和响应都包含格式化的数据,包括请求方法(如 GET、POST)、状态码(如 200、404)、头部字段以及消息体等。HTTP 主要用于传输超文本(如 HTML),但也可传输其他类型的数据。
HTTP 协议的设计遵循以下原则:
无状态:每个请求都是独立的,服务器不保存请求间的上下文。
灵活性:可以通过头部字段指定数据格式、缓存控制、内容编码等。
可靠性:使用传输层协议 TCP,确保数据传输的可靠性。
可扩展性:可以通过新增头字段或使用不同的请求方法,支持新的功能。
HTTP 有多个版本,其中最常见的是 HTTP/1.1 和 HTTP/2,最新的版本是 HTTP/3,它在传输层使用了基于 UDP 的 QUIC 协议以提升性能。
不过我猜大家不会喜欢看这个,接下来放出一个通俗易懂的解释
HTTP(超文本传输协议)是一种用于浏览网页的通信协议,好比网络上的“信使”,负责在你的浏览器和网站服务器之间传递信息。
当你在浏览器中输入一个网址时,浏览器就会发出一个HTTP请求,像在对网站服务器说:“请把这个网页给我。” 服务器收到这个请求后,会把网页的内容(包括文字、图片等)打包成一个HTTP响应,发送回你的浏览器,然后你就能看到完整的网页了。
HTTP协议的特点是“无状态”,也就是说它不记得你是谁,每次请求都是独立的。它也常用于传递网页信息,比如表单、按钮等用户交互的数据,帮助用户访问和操作各种网站。
我们来详细解释下
先来看一下web应用的基本架构
左边圈指的是你的浏览器,右边圈指的是你要访问的目标网站的服务器(如www.baidu.com)。HTTP协议则是规定了两者之间如何传递信息的一种标准。
为什么会出现HTTP协议?可以这么理解:
小A、小B、小C要去图书馆借书
小A这么跟图书管理员描述想借的书:呃呃,它是一本红色封面,作者姓柳,大概厚400页的这么一本书
小B这么跟图书管理员描述想借的书:名字记不清了,只记得包含计算机这几个字,是个精装本
小B这么跟图书管理员描述想借的书:こんにちは、そうです、私が借りたい本はxxxxxxxです
图书管理员:......Stop!你们一人一个说话方式,听的我太乱了,这样,我给你们一人一份表格,按照里面规定的内容填好交给我。
HTTP就是类似的一个规则,它按照规则告诉“图书馆员”(服务器)你想要的内容,然后服务器按照这个规则把网页送到你(浏览器)面前。可以理解成秦始皇统一度量衡,让大家都按照一个标准发送请求,方便服务器去处理(不然一家浏览器一个标准,服务器要炸毛了)。
理解了为什么会需要HTTP协议以及HTTP协议的本质为一种规则后,接下来看看这套规则具体规定了什么
我们抓下请求报文(靶机登陆页面)
请求行、请求头、请求体是什么?先来看下定义:
请求行(Request Line):
方法:如 GET、POST、PUT、DELETE等,指定要执行的操作。
请求 URI(统一资源标识符):请求的资源路径,通常包括主机名、端口号(如果非默认)、路径和查询字符串。
HTTP 版本:如 HTTP/1.1 或 HTTP/2。
请求头(Request Headers):
包含了客户端环境信息、请求体的大小(如果有)、客户端支持的压缩类型等。
常见的请求头包括Host、User-Agent、Accept、Accept-Encoding、Content-Length等。
请求体(可选):
在某些类型的HTTP请求(如 POST 和 PUT)中,请求体包含要发送给服务器的数据。
接下来结合上面那个报文的内容来详细讲解
首先是请求行
POST /hack_test/login.php HTTP/1.1
这里有三个部分:POST和/hack_test/login.php和HTTP/1.1,我们逐一来看
POST是HTTP方法之一,表示客户端想要“提交”数据到服务器。像是在网上填写一张表单然后点击“提交”按钮。
/hack_test/login.php是客户端想要访问的目标地址。我们的目标网址是http://39.105.24.101/hack_test/login.php,其中http://39.105.24.101可以理解成一栋大楼,里面包含了无数个办公室,如abc、def等。
我们的hack_test自然也是办公室之一,http://39.105.24.101/hack_test像是在大楼里指定了名叫hack_test的办公室。
要找到一个指定的人的话,指定到办公室自然还不够,还需要人名,所以我们要加上最后的:login.php,变成http://39.105.24.101/hack_test/login.php,相当于大楼的hack_test办公室找一个名叫login.php的人,服务器找到后,将这个人的信息(网页)返回给你。
HTTP/1.1是指的HTTP协议版本为1.1,这里不需要深究
综上,这个请求行可以理解成:你站在一个大楼的前台,拿着一份填好的表单(POST),对前台说:“我要去 hack_test 办公室给 login.php 先生递交这份表单,按照 HTTP/1.1 的规则来处理。”
接下来是请求头
Host: 39.105.24.101
Content-Length: 29
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://39.105.24.101
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.93 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://39.105.24.101/hack_test/login.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: authToken=114514; PHPSESSID=090vle308073mjlethng7jeln6
Connection: close
书接上回,你对前台说完“我要去 hack_test 办公室给 login.php 先生递交这份表单,按照 HTTP/1.1 的规则来处理。” 前台说“好的,请填一份访客登记表,方便我们和login.php先生处理信息”
请求头中的Host、Content-Length、Content-Type等字段内容,即“访客登记表”中要求你填写的部分
这些信息能够告知服务器你发出的请求的细节,如Content-Length字段标明了你发送的数据有多长,方便服务器决定是否要处理,怎么处理;Content-Type字段表示发送的数据类型,告诉服务器你的数据是什么格式的,好让服务器正确理解。诸如此类。
请求头部字段可以理解成发给服务器的一张“指南卡”,包含了关于这次请求的所有必要信息,帮助服务器更准确地处理你所发出的请求和返回你需要的数据。
最后是请求体
username=guest&password=12356
上文中不是说你要向login.php先生交一份表单(文件)嘛?请求体就是你文件的实际内容,login.php先生看了你提交的表单“嗯...username是guest,password是12356....想起来了,老板说过有这么一号人来着,OK,验证通过”,通过验证后,login.php先生会交给你老板事先嘱咐好的物品(登陆成功的网页)。
到此,整个HTTP请求报文解释完毕。
我们知道了HTTP协议中规定了请求方法(即例子中的POST方法)、URL结构(即/hack_test/login.php这个路径)、请求和响应格式(报文中需要包含请求行、请求头、请求体)、头部字段(请求头中的一个个字段)等等,并且通过HTTP请求报文的解释看到了这一系列规定究竟是怎么个样子。
更详细的解释可以看
web基础之HTTP协议讲解及sql注入初识的0-12分钟部分及菜鸟教程_HTTP
待续,先睡觉了
Comments | NOTHING