WHCSRL 技术网

联合注入小技巧

被一只小恐龙催更了!!!

啊啊啊,这是昨天的更!!!

呜呜呜,别催了!!!!

  1. PHP常见过滤函数

    • str_replace

      对字符串进行替换

      str_replace(find,replace,string,count)
      
      • 1
      参数描述
      find必需。规定要查找的值
      replace必需。规定替换find中的值的值
      string必需。规定被搜索的字符串。
      count酷炫对替换数进行计数的变量

      在PHP 5.0 的版本新增了count。在PHP4.3之前,该函数的find和replace参数都为数组时讲会遇到麻烦

      例子:

      <?php
      $arr=array("union","sleeep");
      $sql="select * from admin where union id =1";
      print_r(str_replace($arr,"",$sql,$i));
      echo "<br>";
      echo $i;
      ?>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

      显示

      在这里插入图片描述

    • preg_replace

      对字符串进行替换

      preg_replace(正则表达式,replace,string)
      
      • 1

      例子:

      $sql=preg_replace('/union|sleep/','',$sql);
      
      • 1

      在这里插入图片描述

      • 正常情况下preg_replace可以通过大小写进行绕过,但是当模式分割符后面出现标记i是则不能绕过

        if(preg_replace('/union|sleep/i',$sql)){
            echo "no,no,no";
            exit();
        }else{
            echo $sql;
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
    • preg_match

      对字符串进行匹配,存在则为正

      preg_match(正则表达式,字符串)
      
      • 1

      例子:

      if(preg_match('/union|sleep/',$sql)){
          echo "no,no,no";
          exit();
      }else{
          echo $sql;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
  2. 绕过技巧

    1. 大小写绕过

      对于str_replacepreg_replace可以通过大小写进行绕过

      例如:union替换为Union

    2. 双写绕过

      原理:在使用preg_replace函数过程中,默认情况下只进行一次匹配。因此如果匹配到字符串替换为空的情况,就可以双写绕过

      例子

      $sql= preg_replace('/union|sleep/i','',$sql);
      
      • 1

      以上代码,可以使用i表示到小写全部匹配,此时无法使用双写绕过。但是由于preg_replace默认只匹配一次过滤字符,因此可以使用双写绕过

      例如:union替换为uniunionon

      preg_math会将中间的union进行过滤

    3. 过滤单引号绕过 十六进制

      基础:在Mysql数据库中的SQL语句,对于字符串数据必须使用引号。但是对于字符串来说,mysql也识别字符串中每个字符对应地ASCLL码地16进制,此时可以使用0x16进制替换字符串。从而绕过引号对于字符串地限制

      addslashes() //该函数返回在预定义字符之前添加反斜杠地字符串。
      
      • 1

      预定义字符:

      单引号(’)

      双引号(")

      反斜杠()

      NULL

      该函数可用于为储存在数据库中地字符串以及数据库查询语句准备字符串。

      或者在 php.ini配置文件中,开启 magic_quotes_gpc选项,此时对于数字型注入来说,如果需要进行数据库中数据获取,需要使用十六进制进行绕过。但是对于字符型注入来说,就需要进行逃逸引号的操作。

    4. 宽字节注入原理与利用

      基础:如果数据库中存储数据使用的编码方式是GBK,那么由于用户输入的内容会进行双字节的组合,会导致用户输入的字节与反斜杠组合,从而逃逸引号。

      宽字节注入可以说是一种逃逸引号的技巧,利用双字节组合导致注入产生。

      在这里插入图片描述

      主要有一种情况下是无法使用联合查询注入利用方式:preg_math('/union/i'),完全过滤

推荐阅读