SQL註入防禦繞過
1、什麽是寬字節
GB2312、GBK、GB18030、BIG5等這些都是常說的寬字節,實際為兩字節
2、寬字節註入原理
防禦:將 ‘ 轉換為 \‘
繞過:將 \ 消滅
mysql在使用GBK編碼的時候,會認為兩個字符為一個漢字
\ 編碼為 %5c
‘ 編碼為%27
%df%5c mysql會認為是一個漢字
構造:
%df‘ %df\‘ %df%5c%27 其中%df%5c將成為一個漢字專為 漢字‘ 從而繞過了/的轉義
註:前一個ascii碼大於128才能到漢字的範圍
註入方法:在註入點後鍵入%df,然後按照正常的註入流程開始註入
工具註入方法:
在註入點後面手動添加%df即可 (沒成功。。。)
白盒測試:
1、查看mysql編碼是否為GBK
2、是否使用preg_replace把單引號替換成 \‘
3、是否使用addslashes進行轉義
4、是否使用mysql_real_escape_string進行轉義
寬字節防禦
1、使用UTF-8,避免寬字節
不僅GBK、韓文、日文等等都是寬字節,都有可能存在諸如漏洞
2、mysql_real_escape_string, mysql_set_charset(‘gbk‘,$conn);
3、可以設置參數, character_set_client=binary
二、二次編碼註入
在url中可能出現一些特殊字符,如= & ; +
為了避免沖突,需要轉移
index.php?id=1&name=admin&pwd=123
例如:url中的%3d,mysql會自動轉為=
寬字節和二次編碼註入:
是在面對php代碼或配置,對輸入的‘(單引號)進行轉義的時候,在處理用戶輸入數據時存在問題,可以繞過轉義
二次編碼註入是由於兩次編碼轉義沖突導致出現的註入點
註入方法:在註入點後鍵入%2527,然後按照正常的註入流程開始註入
白盒測試
1、是否使用urldecode函數
2、urldecode函數是否在轉義方法之後
三、二次註入
第一步, 插入惡意數據
保留了原來的數據,插入到數據庫
第二步,引用惡意數據
在將數據存入到了數據庫中之後,開發者未經驗證,直接引用
例如修改密碼
輸入admin‘#
在修改密碼過程中,將會修改admin的密碼
select concat_ws(0x7e,username,password) from security
四、Waf繞過原理分析
sql註入是***測試與waf防禦最激烈的戰場
1、白盒繞過
1)大小寫變形
2)等價替換:and -> &&, or -> ||
3)。。。
2、黑盒繞過
一、架構層繞過
1) 尋找源站
2)利用同網段
3)利用邊界漏洞
二、資源限制角度繞過
1、POST大BODY
三、協議層面繞過WAF的檢測
1、協議未覆蓋繞過WAF
*請求方式變換 get -> post
*content-type變換
2、參數汙染
index.php?id=1&id=2
id=1
id=2
waf可能只檢測id=1
四、規則層面的繞過
1、sql註釋符繞過
level-1 union/**/select
level-2 union/*ajlsjdlf*/select
2 空白符繞過
mysql空白符:%09,%0A。。。
正則空白符: %09,%0A
example-1:union%250Cselect
3函數分分割符號
在函數和數據中間引入一些內容
concat%2520(
concat/**/(
concat%250c(
4 浮點數詞法解析
select * from users where id=8E0union select 1,2,3,4
5 利用error-based進行sql註入:error-based sql註入函數非常容易被忽略
extractvalue(1, concat(0x5c,md5(3)));
updatexml(1,concat(0x5d,md5(3)),1);
6 mysql特殊語法
select{x table_name}from{x information_schema.tables};
五、Fuzz繞過waf
1、註釋符繞過
*先測試最基本的: union/**/select
*再測試中間引入特殊字:union/*aaaa%01bbs*/select
*最後測試註釋長度:union/*aaaaaaaaaaaaaaaa*/select
最基本的模式
union/*something*/select
將空格替換為/*sldfj$%^&*/
特殊函數 xx() 替換為 xx/*sldfj$%^&*/()
六、SQLmap waf繞過腳本編寫
SQL註入防禦繞過