主要观点总结
本文介绍了针对POST参数的 multipart/form-data 的WAF Bypass技术。
关键观点总结
关键观点1: multipart/form-data 的用途和背景
为了解决上传文件场景下文件内容较大且内置字符不可控的问题,RFC1867为HTTP协议添加了此功能。常见的浏览器都支持此规范。
关键观点2: WAF与PHP在处理multipart/form-data时的差异
Nginx不解析multipart/form-data的body部分,由PHP来解析,导致WAF获取的内容可能与后端的PHP不一致。
关键观点3: 绕过WAF的几种方法
通过添加特定字符或构造特定的Content-Disposition来绕过WAF的检测。
关键观点4: 文件扩展名绕过的思路和方法
介绍在WAF解析到filename参数时,如何通过协议和后端解析的层面绕过文件扩展名的检测。
文章预览
本文介绍的思路主要围绕针对于 POST 参数的 multipart/form-data 进行讨论。 multipart/form-data 是为了解决上传文件场景下文件内容较大且内置字符不可控的问题。在最初的 http 协议中,并没有上传文件方面的功能。RFC1867 为 HTTP 协议添加了这个能力。常见的浏览器都已经支持。按照此规范将用户指定的文件发送到服务器,可以按照此规范解析出用户发送来的文件。 HTTP 传输的内容通过 boundary 进行了分割,以 --boundary 开始,并以 --boundary-- 结尾。 multipart/form-data 格式也是可以传递 POST 参数的。对于 Nginx + PHP 的架构,Nginx 实际上是不负责解析 multipart/form-data 的 body 部分的,而是交由 PHP 来解析,因此 WAF 所获取的内容就很有可能与后端的 PHP 发生不一致。 通过一个简单的脚本来验证上面的说法。 echo file_get_contents ("php://input"); echo '$_POST Content\n'; echo
………………………………