前言

在研究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 中

image.png

如果对subContentType 匹配到了 multipart/mixed,就会获取subBoundary,然后进入下一轮判断。

image.png

Boundary 是从传入的contentType中进行解析获取的,以; 作为分割后按 = 解析成key与value,并添入params,然后从中获取boundary的值。

image.png

之后将boundary重新设置,注意,这里的boundary要与之前的长度一致,修改成了

-----------------------------38964880814406057921247982088

image.png

进入下一轮循环,

由于改变了boundary

image.png

所以解析新的boundary中的内容

-----------------------------38964880814406057921247982088
Content-Disposition: form-data; filename="iedsex.jsp"
Content-Type: application/octet-stream

123
-----------------------------38964880814406057921247982088--

image.png

这里由于this.currentFieldName 设置了,所以进入else分支

由于elese分支中的field已经指定了为上一步骤的field,所以直接传入filename即可,不需要name。

下面便是正常的解析了,

image.png
image.png

我们甚至可以让正常的boundary解析一个文件,指定的boundary再解析一个文件

image.png

image.png

或者将其伪装成另一个文件包上传的内容

image.png
image.png

结束

可能与RFC规范有关 https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html

未再继续研究其他语言。