1. 程式人生 > 其它 >Less-32 寬位元組

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() --+