摘要:本篇填坑冕臭,補上關于報錯注入與延時注入
報錯注入
需要了解的“函數(shù)”:
- rand():產(chǎn)生0到1之間的隨機數(shù)
- floor():向下取整,即舍掉小數(shù)部分
- concat():拼接數(shù)據(jù)泽艘,將括號中的字符(串)進行拼接
- group by子句:與SELECT語句結合一起使用,將相同的數(shù)據(jù)分成一組
- count():查詢記錄數(shù)(對行數(shù)求和)
用法演示
1.select的作用
2.concat的作用(0x3a是十六進制的冒號)
3.表中有多少條記錄,查詢結果將返回多少條記錄
4.count()的作用
5.配置一個別名
6.隨機數(shù)的使用(rand()乘上2,再經(jīng)向下取整趟妥,則會隨機產(chǎn)生0和1兩個數(shù))
6.分組AND分組+統(tǒng)計的作用
可以看到出現(xiàn)報錯了,但是同樣的語句第一次報錯佣蓉,第二次沒有報錯披摄,已經(jīng)初見端倪了
報錯原理
在MySQL中,當遇到select count(*) from tables group by x;
語句的時候會建立一個虛擬表
當我們讀取第一條數(shù)據(jù)的時候(隨機數(shù),rand()*2贞让,為0或1)周崭,假設為0,虛擬表中并不存在這個主鍵喳张,這時將向虛擬表中插入該條數(shù)據(jù)续镇,而此時又將產(chǎn)生隨機數(shù),若為1销部,則插入1摸航,為0,則插入0舅桩。
令我們插入的值為1酱虎,讀取第二條數(shù)據(jù),假如為1擂涛,虛擬表中存在1读串,則1的count值+1。若讀取的第二條數(shù)據(jù)位0撒妈,虛擬表中不存在恢暖,則將向虛擬表中插入數(shù)據(jù),這時隨機數(shù)再次發(fā)揮作用狰右,若插入的值為1杰捂,與第一次插入的值沖突(主鍵是不能重復的),將會返回duplicate key
錯誤挟阻,這個錯誤會披露一些關鍵信息琼娘;若插入的為0,則順利插入附鸽。
令我們插入的數(shù)為0脱拼,也就到了讀取第三條數(shù)據(jù)的時候,無論是0或是1坷备,虛擬表中都存在熄浓,將會是count+1的操作。
所以我們可以看到省撑,報錯的幾率是有的赌蔑,有沒有可能讓它必報錯的呢?那就需要讓我們的隨機數(shù)不再“隨機”竟秫,而是產(chǎn)生特定的序列娃惯,通過上面的分析我們可以思考一下什么樣的序列可以“必報錯”。
不錯正是回文的序列肥败,下面給出的是對rand()
函數(shù)提供不同的種子趾浅,產(chǎn)生的隨機數(shù)的序列愕提。通過觀察,不難發(fā)現(xiàn)0,4,8,11這幾個種子產(chǎn)生的前四位是回文的皿哨,也就意味著當以這幾個整型數(shù)據(jù)傳入rand()函數(shù)作為種子時將會必報錯浅侨。
rand(0)*2:0110110011
rand(1)*2:0100011000
rand(2)*2:1011001001
rand(3)*2:1001100110
rand(4)*2:0110111111
rand(5)*2:0100011100
rand(6)*2:1011100000
rand(7)*2:1001100001
rand(8)*2:0110011010
rand(9)*2:0100110111
rand(10)*2:1011100100
rand(11):1001001101
上面,不傳入種子時的隨機數(shù)隨機報錯证膨;下面如输,傳入種子為4的偽隨機數(shù)必報錯
那么可以總結我們的公式了。
公式
select 1 from (select count(*),concat(floor(rand(0)*2),(select (select(our_sql_sentence)) from information_schema.tables limit 0,1))x from information_schema.tables group by x)a
參考文章:報錯型sql注入原理分析
基于報錯的SQL注入
SQL報錯型盲注教程(原理全剖析)
延時注入
MySQL中有一個函數(shù):sleep(value)
央勒,可以讓服務器沉睡value
秒不见;例如:select * from users where id=1 and sleep(3);
那么服務器將沉睡3秒后再執(zhí)行select查詢。
結合if(expr1,expr2,expr3)
其中崔步,expr1是判斷條件脖祈,條件為true則執(zhí)行expr2,條件為false則執(zhí)行expr3刷晋。
舉一個簡單的例子:?id=1' and if(1=1,sleep(5),3)--+
其中1=1為真,則執(zhí)行sleep函數(shù)捆毫,我們能明顯感覺到服務器的相應時間怕吴;同理宴卖,1=1可以換成我們在bool 盲注時類似的語句,通過觀察服務器相應的時間來判斷條件是否為真捏悬。
另一個函數(shù),BENCHMARK(count, expr)
润梯,函數(shù)重復count
次執(zhí)行expr
过牙;這個函數(shù)還有一個作用是用來返回服務器執(zhí)行的時間,常用來分析性能纺铭。
我們可以利用它第一個重復執(zhí)行的功能代替sleep(用于被過濾的時候)寇钉,常將count
設置為10000000,結合if舶赔,與sleep類似扫倡。