文章爲自我記錄,相關原理還是得自己查呀
其中一點點內容轉載於此文 sql注入繞過技巧
利用場景: 網站對客戶端輸入(傳入的參數)的引號等字符進行了轉義(轉義之後這些符號就無效了,這些符號也不會成爲代碼的一部分了,你原先的注入就無效了)
網站數據庫採用了gbk編碼
gbk是雙字節編碼,ascii爲單字節編碼,所以寬字節注入的思路也就產生了—
加入%df 這樣的編碼,讓系統轉義加入的""符號被喫掉,這樣的話就留下了你需要的單引號 '
所以又可以按照原來的方法注入了
舉個栗子:傳入參數id=1' or 1=1--+
進行試探
失敗:id=1\' or 1=1--+
但是我們這樣傳入參數 id=1%df' or 1=1--+
就可以了:id=1[]' or 1=1--+
[]是一個奇怪的gbk編碼的字符 注入成功
練習一下
sqli-labs Less33 bypass Addslashes()
Addslashes()是用來將字符串中的預定義字符(單引號,雙引號,反斜槓等)轉義的
然後要走流程測試
1.?id=1'
此處給出了hint:輸入的1’被轉義成了1’ ,十六進制是315C27 也就是多了5C 聯想寬字節注入
2.進行寬字節的繞過
?id=1%df'
有報錯了
3.因爲出現了報錯,所以可以使用報錯注入,之前提到的xpath報錯注入,也可以union聯合注入,拿到庫名,表名,字段名…
然後中間小白又遇到問題了,如何繞過單引號什麼的???可以用16進制編碼繞過,網上搜方法(面向搜索引擎):利用16進制的話就不需要輸入引號啦
會使用到引號的地方一般是在最後的where子句中。如下面的一條sql語句,這條語句就是一個簡單的用來查選得到users表中所有字段的一條語句:
select column_name from information_schema.tables where table_name="users"
這個時候如果引號被過濾了,那麼上面的where子句就無法使用了。那麼遇到這樣的問題就要使用十六進制來處理這個問題了。
users的十六進制的字符串是7573657273。那麼最後的sql語句就變爲了:
select column_name from information_schema.tables where table_name=0x7573657273
比如users轉16進製爲7573657273,記得加上標誌0x~~