登陸一下好麼?
阿新 • • 發佈:2019-02-13
這個題過濾了絕大多數東西,然而留下了最關鍵的單引號。
但真只剩下單引號可用了還真搞不定,參考別人wp後學到了兩種方法:
(1)雙等號繞過。
假設sql語句如下:
select * from user where username='使用者名稱' and password='密碼'
現在我們知道單引號和等號沒有被過濾(這個題目是隻過濾指定字元,測試一下就知道哪些被過濾了),那麼可以用一下payload:
username=p'='&password=p'='
帶入到sql語句可以看到就變成了:
select * from user where username='p'='' and password='p'=' '
先看前面username那一塊,由於兩個等號是從左往右計算的,username=‘p’不存在就會返回0(false),而0=''則會返回1,這樣where後面計算結果就變成了1 and 1,這樣最後就會把資料表中所有的資料挑出來。
sql裡面弱型別的比較,以下情況都會為true:
1='1'
1='1.0'
1='1後接字母(再後面有數字也可以)'
0='除了非0數字開頭的字串'
(2)利用mysql資料型別轉換特性以及特殊截斷符號“%00;”:
select * from table where username=0;
select * from table where username='a'+0;
這兩句均會返回庫中所有元組,就是說如果一個字元型別的變數接收到一個整形變數且值為0的時候,就會返回庫中所有元組(第二句'a'+0會進行強制型別轉換,最後結果還是0)
其次,mysql的註釋符號除了-- + , # ,/**/之外,還有;%00。
利用這兩點,構造如下payload:
username=a'+0;%00&password=
就可以成功繞過了。