MySQL時間盲注的五種延時方法實現(xiàn)
MySQL時間盲注五種延時方法 (PWNHUB 非預期解)
延時注入函數(shù)
五種:sleep(),benchmark(t,exp),笛卡爾積,GET_LOCK() RLIKE正則
sleep()
sleep(x) select sleep(5);
benchmark() 重復執(zhí)行某表達式
benchmark(t,exp) select benchmark(count,expr),是重復執(zhí)行count次expr表達式,使得處理時間很長,來產(chǎn)生延遲, 比如select benchmark(1000000,encode("hello","good")); select benchmark( 5000000, md5( 'test' ));
笛卡爾積
笛卡爾積(因為連接表是一個很耗時的操作) AxB=A和B中每個元素的組合所組成的集合,就是連接表 SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C; select * from table_name A, table_name B select * from table_name A, table_name B,table_name C select count(*) from table_name A, table_name B,table_name C 表可以是同一張表
GET_LOCK() 加鎖
GET_LOCK(key,timeout) 需要兩個連接會話
RELEASE_LOCK(key) 鎖是否釋放,釋放了返回1
IS_FREE_LOCK(key) 返回當前連接ID,表示名稱為'xxxx'的鎖正在被使用。
key 鎖的名字,timeout加鎖等待時間,時間內(nèi)未加鎖成功則事件回滾。get_lock 加鎖成功返回1,
這個鎖是應用程序級別的,在不同的mysql會話之間使用,是名字鎖,不是鎖具體某個表名或字段,具體是鎖什么完全交給應用程序。它是一種獨占鎖,意味著哪個會話持有這個鎖,其他會話嘗試拿這個鎖的時候都會失敗。
session A select get_lock('test',1);
session B select get_lock('test',5);
可以指定表也可以不指定
直到關閉連接會話結(jié)束,鎖才會釋放,但不像redis那樣加了鎖只要不主動釋放就一直有。
但是當會話1 get_lock 后,未釋放。會話2 不get_lock 同一個key,或者就不get_lock,依然可以對數(shù)據(jù)進行任何操作,所以加鎖只是說人為的主觀的想要讓某些操作同時只有一個連接能進行操作,別的連接不調(diào)用get_lock加同一個鎖,那它不會受到任何影響,想干什么干什么。
session1
session2
get_lock:但是當會話1 get_lock 后,未釋放。會話2 不get_lock 同一個key,或者就不get_lock,依然可以對數(shù)據(jù)進行任何操作,所以加鎖只是說人為的主觀的想要讓某些操作同時只有一個連接能進行操作,別的連接不調(diào)用get_lock加同一個鎖,那它不會受到任何影響,想干什么干什么。
session1
session2
優(yōu)缺點分析 (1)這種方式對于更新所有列比較有效,但是得把查詢的語句也放在鎖內(nèi)執(zhí)行; (2)這種方式當客戶端無故斷線了會自動釋放鎖,比較好,不像redis鎖那樣,如果加完鎖斷了,那么鎖一直在; (3)這種方式是針對鎖內(nèi)的所有操作加鎖,并不針對特定表或特定行,所以使用了同一個Key的鎖但不同的操作都會共用一把鎖,會導致效率低下; (4)如果查詢語句放在鎖之前,則數(shù)據(jù)可能是舊的,更新之后會把查詢之后更新之前別的客戶端更新的數(shù)據(jù)覆蓋掉;
RLIKE REGEXP正則匹配
通過rpad
或repeat
構造長字符串,加以計算量大的pattern,通過repeat的參數(shù)可以控制延時長短。
select rpad('a',4999999,'a') RLIKE concat(repeat('(a.*)+',30),'b');
正則語法:
. : 匹配任意單個字符
* : 匹配0個或多個前一個得到的字符
[] : 匹配任意一個[]內(nèi)的字符,[ab]*可匹配空串、a、b、或者由任意個a和b組成的字符串。
^ : 匹配開頭,如^s匹配以s或者S開頭的字符串。
$ : 匹配結(jié)尾,如s$匹配以s結(jié)尾的字符串。
{n} : 匹配前一個字符反復n次。
RPAD(str,len,padstr)
用字符串 padstr對 str進行右邊填補直至它的長度達到 len個字符長度,然后返回 str。如果 str的長度長于 len',那么它將被截除到 len個字符。
mysql> SELECT RPAD('hi',5,'?'); -> 'hi???'
repeat(str,times) 復制字符串times次
⭐️尋找新的延遲函數(shù)
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'
以上代碼等同于 sleep(5)
到此這篇關于MySQL時間盲注的五種延時方法實現(xiàn)的文章就介紹到這了,更多相關MySQL 時間盲注 內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持本站!
版權聲明:本站文章來源標注為YINGSOO的內(nèi)容版權均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。