posts - 241,  comments - 116,  trackbacks - 0

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

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

          先看看官方給出的代碼。


          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是啥意思,按照實際測試以及官方原理,這句壓根不會執(zhí)行,樓上都已經(jīng)“無限循環(huán)”了,怎么可能走下來呢?不過這個不重要。債務(wù)追討
          下文所說的漏洞,是指假設(shè)我們的開發(fā)人員寫了“XXX”的代碼,攻擊者就可能攻擊我們服務(wù)器。
          我們來逆推攻擊過程,從漏洞的角度上說,只有程序傳入的值,由用戶控制,才會導(dǎo)致漏洞觸發(fā),畢竟開發(fā)不會直接寫這個值。而編譯中掛掉,幾乎不可能存在,很難有正常的業(yè)務(wù)需要用戶提交代碼,讓服務(wù)器編譯執(zhí)行。所以,漏洞的產(chǎn)生只會出在這一句上:

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

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

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

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

          //訂單處理action
          public class OrderAction extends ActionSupport{
          //訂單對象
          public Order order;
          public String execute(){
          return SUCCESS;
          }
          }
          //Order對象的內(nèi)容
          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)  編輯  收藏

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


          網(wǎng)站導(dǎo)航:
           
          人人游戲網(wǎng) 軟件開發(fā)網(wǎng) 貨運專家
          主站蜘蛛池模板: 巴南区| 增城市| 广南县| 望都县| 河源市| 邮箱| 鄂托克旗| 麻城市| 巫溪县| 礼泉县| 新和县| 乳源| 嘉峪关市| 元朗区| 翁牛特旗| 廊坊市| 大关县| 宣恩县| 峡江县| 富阳市| 女性| 绩溪县| 昌江| 阜南县| 新兴县| 包头市| 岳西县| 河北区| 长春市| 昌都县| 二连浩特市| 修文县| 普陀区| 宜春市| 兴业县| 玉山县| 仪征市| 乐陵市| 谷城县| 唐河县| 松滋市|