posts - 241,  comments - 116,  trackbacks - 0

          JAVA出了漏洞,CVE-2010-4476,會導致拒絕服務攻擊。大家能從公告上,看到這樣一段代碼,挺長的。意思是只有開發人員寫出這樣的代碼,才會對服務器造成影響。 人人

          我們肯定會首先考慮,這么長的代碼,究竟有多少開發會傻乎乎的寫出來?而我們究竟打不打補丁呢?其實作者知道,目前還有很多公司沒有打補丁,不過沒關系,等會兒你就要打了。

          先看看官方給出的代碼。


          Send a Java Program Into An Infinite Loop
          Compile this program and run it; the program will hang (at least it does on a 32-bit system with the latest JRE/JDK):
          class runhang {
          public static void main(String[] args) {
          System.out.println(“Test:”);
          double d = Double.parseDouble(“2.2250738585072012e-308″);
          System.out.println(“Value: ” + d);
          }
          }
          —————————————————————————————————————-
          Send the Java Compiler Into An Infinite Loop
          Try to compile this program; the compiler will hang:
          class compilehang {
          public static void main(String[] args) {
          double d = 2.2250738585072012e-308;
          System.out.println(“Value: ” + d);
          }
          }

          以上代碼,其實舉了兩個例子,首先簡化一下代碼:


          這段代碼會在編譯時掛掉:
          double d = 2.2250738585072012e-308;
          這段代碼會在運行時掛掉:
          double d = Double.parseDouble(“2.2250738585072012e-308″);

          作者很奇怪后面的System.out是啥意思,按照實際測試以及官方原理,這句壓根不會執行,樓上都已經“無限循環”了,怎么可能走下來呢?不過這個不重要。債務追討
          下文所說的漏洞,是指假設我們的開發人員寫了“XXX”的代碼,攻擊者就可能攻擊我們服務器。
          我們來逆推攻擊過程,從漏洞的角度上說,只有程序傳入的值,由用戶控制,才會導致漏洞觸發,畢竟開發不會直接寫這個值。而編譯中掛掉,幾乎不可能存在,很難有正常的業務需要用戶提交代碼,讓服務器編譯執行。所以,漏洞的產生只會出在這一句上:

          這段代碼會在運行時掛掉:
          double d = Double.parseDouble(“2.2250738585072012e-308″);

          那么再次逆推,要求這個值有用戶控制,如果環境是java web application,開發想寫出有漏洞的代碼,必須這樣搞:

          這段代碼會在運行時掛掉:
          double d = Double.parseDouble(request.getParameter(“double”));

          于是,程序就”hang!”(其實我不知道這個詞的意思),掛了,從表面上看不出來,但是實際上你的CPU會立刻100%,當前線程走不下去,頁面 卡死,不給你任何響應。當然,其他頁面也許會好,因為web容器是多線程的,可惜已經有人100%CPU了,頁面速度可想而知。
          很多人,就考慮到了這段,除非開發人員真的寫了這樣的代碼,否則很難出現漏洞,所以沒有打補丁。
          Java web在很多年前,都已經開始走框架路線了,我們熟知的spring mvc、struts2、webwork等等,甚至還有一些公司自己實現框架,比如阿里巴巴公司的開源框架webx(宣傳一下 http://code.taobao.org/project/view/401/)。在這樣的框架中,開發人員更不可能自己去做轉義,這都是框架自己 負責的。是不是意味著,漏洞不可能存在呢?
          這恰恰是最可怕的地方,這些框架沒有讓開發人員參與類型轉義,用戶本來提交的是一個String的2.2250738585072012e-308,框架會自動轉義類型為Double,經測試,所有的框架都有自動類型轉義(否則框架意義何在啊)。
          開發什么都不需要做,只要在action中有一個對象,對象中有一個字段類型為double,或許他都不需要定義對象,其他開發早定義好了,他只需要寫一個action。比如:

          //訂單處理action
          public class OrderAction extends ActionSupport{
          //訂單對象
          public Order order;
          public String execute(){
          return SUCCESS;
          }
          }
          //Order對象的內容
          Public class Order{
          //前面還有其他字段,這里只說Double類型的。
          Double money;
          }

          這就“hang”了。我們可以寫個掃描器,那么會有哪些字段通常被定義為double呢?掃描器自己去抓頁面,抓回來的input,如果為user.name,我們就猜測 user對象中可能存在money,可能存在score、point等,然后讓它們等于那個值,自動提交。這等于掛字典,猜測對象中可能存在的 double類型字段。

          有沒有線上的例子呢?
          posted on 2011-04-26 09:35 墻頭草 閱讀(279) 評論(0)  編輯  收藏

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


          網站導航:
           
          人人游戲網 軟件開發網 貨運專家
          主站蜘蛛池模板: 镇坪县| 泾川县| 崇明县| 长宁区| 新乡县| 辽中县| 桐庐县| 五莲县| 年辖:市辖区| 乌兰浩特市| 朝阳县| 赣州市| 晋州市| 马龙县| 金溪县| 曲周县| 永川市| 肥城市| 介休市| 永福县| 扎兰屯市| 台东县| 罗田县| 西畴县| 阿巴嘎旗| 宜昌市| 富源县| 冀州市| 巴彦淖尔市| 南丹县| 石渠县| 铜川市| 美姑县| 额敏县| 格尔木市| 望奎县| 吉木萨尔县| 浑源县| 两当县| 梓潼县| 绥宁县|