一、burpsuite抓取html登陆数据包
1、先写一个html格式的登陆页面
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这是标签</title>
</head>
<body>
<hr>
<!-- 登陆表单 -->
<form action="http://127.0.0.1/login/" method="post">
<input type="text" name="username" value="输入账号"><br>
<input type="password" name="password" value="输入密码"><br>
<input type="submit" name="login" value="登陆"><br>
</form>
<!--
action表示提交到哪个服务器地址
method表示请求方式
input表示这是一个输入框
type表示输入框的类型,text文本;password密码;submit提交
name是固定写法,name的值“username”"password""login"相当于一个自定义的变量
value是固定写法,value的值是用户要输入的内容,用户输入的内容和name的值会形成key=value的键值对,不如用户输入xiaoming,那么username=xiaoming
-->
</body>
</html>
2、通过burpsuiet抓包分析登陆数据包内容(post)
POST /login/ HTTP/1.1 # 请求方式为post 请求目录为/login/ 使用的协议http1.1
Host: 127.0.0.1 # 请求服务器地址
Content-Length: 63 # 表示http请求或响应中整个请求包或响应包的大小,单位字节
Cache-Control: max-age=0 #是用于控制缓存策略的字段。max - age=0 表示客户端希望获取最新的资源,不使用本地缓存
sec-ch-ua: "Chromium";v="131", "Not_A Brand";v="24" # 向服务器提供有关客户端浏览器的信息
sec-ch-ua-mobile: ?0 # 告知服务器客户端是否为移动设备。?0 表示客户端为桌面设备
sec-ch-ua-platform: "macOS" # 告知服务器客户端使用的系统是macos
Accept-Language: zh-CN,zh;q=0.9 #告知服务器客户端希望接收的语言
Origin: null # 用于告知服务器该url请求的来源
Content-Type: application/x-www-form-urlencoded # 该字段用于指定请求消息体的 MIME 类型(见下文)
Upgrade-Insecure-Requests: 1 #这个字段用于提示服务器,如果有可用的安全版本(如 HTTPS),客户端希望将当前的 HTTP 请求升级为安全的 HTTPS 请求。1 表示客户端有此升级请求的意愿
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/131.0.6778.140 Safari/537.36 告知服务器发起请求的客户端使用的浏览器信息,系统环境
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,i 告知服务器客户端能够接受的响应内容类型
Sec-Fetch-Site: cross-site 见下文
Sec-Fetch-Mode: navigate 字段用于说明请求的模式。navigate 表示这是一个导航请求,通常是用户在浏览器中点击链接、输入地址等操作触发的页面导航请求
Sec-Fetch-User: ?1 用于指示请求是否是由用户主动操作触发的。?1 表示这个请求是由用户主动发起的
Sec-Fetch-Dest: document 指定请求的预期目标资源类型。document 表示请求的目标是一个完整的 HTML 文档
Accept-Encoding: gzip, deflate, br 这里客户端表示支持 gzip、deflate 和 br(Brotli)这三种压缩算法。
Connection: keep-alive 字段用于控制客户端和服务器之间的连接方式。keep-alive 表示客户端希望在完成当前请求后,保持与服务器的 TCP 连接,以便后续的请求可以复用该连接,减少建立新连接的开销,提高通信效率。
username=xiaoming&password=xiaoming123&login=%E7%99%BB%E9%99%86 # username/password/login对应html中的name字段,xiaoming/xiaoming123/=%E7%99...对应html中的value字段
-----------------------------------------
MIME 类型由两部分组成,中间用斜杠(/)分隔,格式为 主类型/子类型
主类型:描述数据的大致类别,常见的主类型有 text(文本)、image(图像)、audio(音频)、video(视频)、application(应用程序数据)等。
子类型:进一步明确主类型下的具体格式,例如 text 主类型下的 html、plain 子类型,分别表示 HTML 文本和纯文本。
Sec-Fetch-Site :是一个安全相关的请求头字段,用于指示请求的源站与目标站之间的关系。cross-site 表示请求是跨站请求,即请求的源站和目标站的域名、协议或端口不同。服务器可以根据这个信息来实施相应的安全策略,例如进行跨站请求的验证和防护。
3、如果是get方式抓到的包就是这样的
GET /login/?username=xiaomig&password=%E8%BE%93%E5%85%A5%E5%AF%86%E7%A0%81&login=%E7%99%BB%E9%99%86 HTTP/1.1
Host: 127.0.0.1
sec-ch-ua: "Chromium";v="131", "Not_A Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.6778.140 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
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
二、burpsuite抓取html上传数据包
1、先写一个html的上传页面
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这是标签</title>
</head>
<body>
<hr>
<!-- 上传表单 -->
<form action="http://127.0.0.1/login/" method="post" enctype="multipart/form-data">
<input type="file" name="fileupload" value="请选择文件"><br>
<input type="submit" value="上传"><br>
</form>
<!--
-->
</body>
</html>
2、burpsuite抓包内容如下
POST /login/ HTTP/1.1
Host: 127.0.0.1
Content-Length: 413
Cache-Control: max-age=0
sec-ch-ua: "Chromium";v="131", "Not_A Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Accept-Language: zh-CN,zh;q=0.9
Origin: null
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarycpXVTLg50ApccN7m # 服务器会根据boundary的内容用来提取用户提交的表单、图片、登陆内容
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.6778.140 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
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
------WebKitFormBoundarycpXVTLg50ApccN7m # 这是用户提交的文件内容,name和filename是固定写法,会把redme.md赋值给fileupload进行存储,当服务器调用fileupload时就能拿到redme.md的内容
Content-Disposition: form-data; name="fileupload"; filename="redme.md"
Content-Type: application/octet-stream
这是redme.md的内容
------WebKitFormBoundarycpXVTLg50ApccN7m # 这是用户的登陆内容
Content - Disposition: form-data; name="name"
张三
------WebKitFormBoundarycpXVTLg50ApccN7m # 这是提交的图片内容,会把example.jpg赋值给uploadFile进行存储
Content - Disposition: form-data; name="uploadFile"; filename="example.jpg"
Content - Type: image/jpeg
(这里是图片的二进制数据)
------WebKitFormBoundarycpXVTLg50ApccN7m-- # 这是提交的表单或登陆页面的结束
------------------------------------------------
如果篡改了 boundary 的内容,服务器将使用错误的边界字符串去解析请求体,比如:
边界混淆攻击
攻击者可以精心构造一个篡改后的 boundary,使得服务器在解析请求体时产生混淆。例如,通过构造特殊的边界字符串,让服务器错误地将恶意数据解析为合法的表单字段或文件内容,从而绕过服务器的输入验证机制。
拒绝服务(DoS)攻击
攻击者可以故意篡改 boundary 为一个非常复杂或异常的字符串,使服务器在解析请求体时消耗大量的计算资源和时间,甚至陷入无限循环,最终导致服务器无法正常处理其他请求,实现拒绝服务攻击。
为了防止因 boundary 被篡改而引发的安全问题,服务器通常会采取以下措施:
严格的输入验证:服务器会对 Content - Type 头中的 boundary 进行格式验证,确保其符合预期的格式要求。例如,检查边界字符串是否包含非法字符、长度是否在合理范围内等。
错误处理和日志记录:当服务器发现 boundary 格式异常或无法正确解析请求体时,会记录详细的错误日志,并返回明确的错误信息给客户端,同时不会对异常请求进行进一步处理,避免潜在的安全风险。