1. 程式人生 > >SQL註入防禦繞過

SQL註入防禦繞過

cto 配置 use 註入 rep ase 什麽是 pro cli

一、寬字節註入
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

mysql會對url提交的編碼進行自動轉換
例如: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註入防禦繞過