在測試一次注入的時候發現過濾了逗號 所以找到這個思路
第一次遇到的時候是看key哥挖洞 ?遇到后就想記錄下來
正文
過濾了逗號 ?利用join來逐步查詢
select*from(select 1)a join (select 2)b join (select 3)c;
例如下圖
逐步查詢user()
user() @@basedir
user() @@basedir version()
也可以和mid函數組合使用
mysql報錯信息
利用方法是使用數學運算函數在子查詢中報錯,比如exp函數(參考?EXP(X)), ?MySQL會把子查詢的中間結果暴露出來。
select exp(~(select*from(select user())a))
可以看到子查詢的結果出來了
這樣我們就得到了當前user()是root@localhost。
exp(x)函數的作用:
取常數e的x次方,其中,e是自然對數的底。
~x 是一個一元運算符,將x按位取補。
這條查詢會出錯,是因為exp(x)的參數x過大,超過了數值范圍。分解到子查詢,就是:
1.?(select*from(select user())a) 得到字符串 root@localhost
2. 表達式’root@localhost’被轉換為0,按位取補之后得到一個非常的大數,它是MySQL中最大的無符號整數:
3. exp無法計算e的18446744073709551615次方,最終報錯,但是MySQL把前面 1) 中子查詢的臨時結果暴露出來了
了解了MySQL的這個特點,其實我們就還可以精心構造其他的一元運算符,讓MySQL查詢在沒有逗號的情況下報錯
比如:
select !(select*from(select user())x)-~0;
原因如下:
select 1 – 18446744073709551615;
這個例子是bigint超過數值范圍,手法類似。