Less-32 寬位元組
<!--
下午整了半天Less-29~31,愣是沒調好jsp環境,只好跳過。
難受.jpg
!-->
Less-32:
核心語句:
各種回顯均存在。
第一句話指定了字符集為gbk。
chech_addslaches 函式是個很強的過濾:
在第二行和第三行,
它通過在前面加一個反斜槓將其轉義的方式,遮蔽了單引號和雙引號。經過測試,被轉義後的單雙引號出現在sql語句中不會引起任何報錯。
在第一行,
它把所有單獨出現的反斜槓變成了兩個反斜槓,也相當於將其轉義了。
這是怎麼做到的呢?
preg_quote()將裡面內容中的特殊字元前加一個反斜槓構成轉義,以便這些字元能被原樣抓走。
在這裡,'/'. preg_quote('\\') .'/' 等效於'/\\\\/' 或 '/\\\\/'
更廣泛的,正則表示式特殊字元一般有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
小圓點連線是一種PHP常用寫法,在PHP程式碼審計中也會經常出現。
至於後面為什麼需要六個反斜槓:
首先,三個反斜槓起轉義另外三個反斜槓的作用;正則抓到了三個反斜槓。
再次,觀察以下輸出:
二、四個反斜槓較好理解;
三個反斜槓的時候,前兩個反斜活了一個,由於不存在\a轉義,第三個反斜也活下來了。
如果那個字母是f、n、t這類的,就不太行了;但這種情況其實根本輸不進來。
(還是有點迷糊的;但先這麼理解吧)
對於本題,我們採用寬位元組注入。
字符集也叫字元編碼,是一種將符號轉換為十六進位制數的轉換關係。
ASCII編碼:單位元組編碼
gbk編碼:單位元組和雙位元組編碼,若第一位元組在0x00-0x7F範圍內,就為單位元組,和 ASCII 保持一致。0x80不作為第一位元組使用。雙位元組的第一位元組範圍是0x81-0xFE。
utf-8編碼:多節編碼,若第一位元組在0x00-0x7F範圍內,就為單位元組,和 ASCII 保持一致。其它字元用二至四個位元組變長表示。
寬位元組就是兩個及以上的位元組。
由此,構造:(%27是單引號,%5c是反斜槓)
(1)%aa%27
經過過濾:%aa%5c%27
aa大於7f,提示這是個雙位元組。
解碼結果:猏'
(2)%aa%5c%27
經過過濾:%aa%5c%5c%5c%27
解碼結果:猏\\' ;兩個反斜等於沒有。
於是,單引號被解放出來了。
(解碼:http://www.mytju.com/classcode/tools/urldecode_gb2312.asp;brup的decoder好像不頂用?)
本題一種payload:?id=-1%df%27 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+