zoukankan      html  css  js  c++  java
  • 二次urldecode注入

      宽字节注入和二次urldecode注入同属于编码注入       

      PHP中常用过滤函数如addslashes()、mysql_real_escape_string()、mysql_escape_string()或者使用魔术引号GPC开关来防止注入,原理都是给单引号(’)、双引号(”)、反斜杠()和NULL等特殊字符前面加上反斜杠来进行转义。

      但是这些函数在遇到urldecode()函数时,就会因为二次解码引发注入。urldecode()函数是对已编码的URL进行解码。引发注入的原因其实很简单,PHP本身在处理提交的数据之前会进行一次解码,例如/test.php?id=1这个URL,我们构造字符串/test.php?id=1%2527,PHP第一次解码,%25解码成了%,于是url变成了/test.php?id=%27;然后urldecode()函数又进行了一次解码,%27解码成了’,于是最终URL变成了/test.php?id=1’,单引号引发了注入。rawurldecode()也会产生同样的问题,因此这两个函数需要慎用。

    代码演示:

     1 <?php
     2     header("Content-Type: text/html; charset=utf-8");
     3  
     4     $conn = mysql_connect('localhost', 'root', 'root');
     5     mysql_select_db("test", $conn);
     6     //mysql_query("SET NAMES 'gbk'", $conn);
     7  
     8     $id = mysql_real_escape_string($_GET['id']);
     9     $id = urldecode($id);
    10     $sql = "select * from test where id='$id'";
    11     $query = mysql_query($sql, $conn);
    12     if($query == True)
    13     {
    14         $result = mysql_fetch_array($query);
    15         $user = $result["user"];
    16         $email = $result["email"];
    17  
    18         print_r('用户名: ' . $user . '<br />');
    19         print_r('邮  箱: ' . $email . '<br />');
    20         print_r('<br />SQL语句:' . $sql);
    21     }
    22  
    23     mysql_close($conn);
    24 ?>

    因为mysql_real_escape_string()是在urldecode()之前,所以并不能过滤由于urldecode()产生的单引号。

    普通的注入会被转义掉:

    于是构造URL编码引发注入:

     ps:

    $id = mysql_real_escape_string($_GET['id']);  //这里进行了一次解码,1%2527 --> 1%27

    $id = urldecode($id);  //这里进行二次解码

  • 相关阅读:
    Docker+geoserver发布shp地图服务
    Docker中运行命令时提示:Cannot connect to the Docker daemony...以及设置docker开机启动
    Docker在服务器之间怎样导入导出镜像(服务器之间容器复制)
    Docker+Tomcat+geoserver+shp发布地图服务
    Windows中将文件压缩成linux支持的tar.gz格式的压缩包
    Docker怎样提交镜像(把容器打成镜像)
    Docker中宿主机与容器之间互传文件(docker cp的方式)
    移动零
    旋转数组
    有序数组的平方
  • 原文地址:https://www.cnblogs.com/zzjdbk/p/12986079.html
Copyright © 2011-2022 走看看