• PHP变量覆盖漏洞小结


    前言

    变量覆盖漏洞是需要我们需要值得注意的一个漏洞,下面就对变量覆盖漏洞进行一个小总结。

    变量覆盖概述

    变量覆盖指的是可以用我们自定义的参数值替换程序原有的变量值,通常需要结合程序的其他功能来实现完整攻击。那么它是如何引起的?其实,大多数变量覆盖漏洞是函数使用不当导致的。比如extract()函数和parse_str()。还有一个函数是import_request_variables(),它是在没有开启全局变量注册的时候,调用这个函数相当于开启了全局变量注册,在PHP5.4之后,这个函数被取消了。还有一种是利用$$的方式来注册变量,但是没有验证已有变量,导致被覆盖。

    extract()函数使用不当导致变量覆盖

    函数结构:
    int extract( array &$var_array[, int $extract_type = EXTR_OVERWRITE[, string $prefix = NULL]] )
    再看一下PHP手册对这个函数的说明

    说的通俗点就是将数组中的键值对注册成变量。extract()函数想要变量覆盖,需要一定的条件。它最多允许三个参数,用表格说明一下这三个参数:

    由上图可知,该函数有三种情况会覆盖掉已有变量。下面用一段简单的代码来加深印象。

    <?php
    $b=2;
    $a=array('b'=>'123');
    extract($a);
    echo $b;
    ?>
    

    原来$b=2,经过extract()函数对$a处理后,$b被成功覆盖为123。

    parse_str()函数使用不当导致变量覆盖

    parse_str()函数的作用是解析字符串并且注册成变量,它在注册变量之前不会验证当前变量是否存在,所以会直接覆盖掉原有变量。函数说明如下:
    void parse_str( string $str[, array &$arr] )
    函数有两个参数,第一个是必须的,代表要解析注册成变量的字符串,比如“a=1”经过parse_str()函数后会注册$a并复制为1,第二个参数是一个数组,当第二个参数存在时,注册的变量会放到这个数组里,如果原来有相同的键值,则会覆盖掉它。
    用一段简单的代码加深印象:

    <?php
    $b=2;
    parse_str($b=321);
    print_r($b);
    ?>
    

    我们发现$b的值被覆盖为321。

    $$变量覆盖

    先看引起覆盖的一小段代码:

    <?php
    $a=1;
    foreach (array('_COOKIE','_POST','_GET') as $_request){
        foreach ($$_request as $_key =>$_value){
            $$_key = addslashes($_value);
        }
    }
    echo $a;
    ?>
    

    它为什么会导致变量覆盖呢?重点在$$符号,从代码中,我们可以看出$_key为COOKIR、POST、GET中的参数,如果我们提交?a=3,那么$key的值就为3,还有一个$在a的前面,结合起来就是$a=addslashes($_value),所以会覆盖原有a的值。上面的代码我们执行一下,如下图,发现a被覆盖成由GET方式传的8。

    变量覆盖防范

    变量覆盖最常见的漏洞点是做变量注册时没有验证变量是否存在。所以想要防范,推荐使用原始的变量数组,如$_GET、$_POST等,或者在注册变量前一定要验证变量是否存在。

  • 相关阅读:
    webpack配置之代码优化
    react组件生命周期
    javascript记住用户名和登录密码
    ajax异步请求原理和过程
    深入理解ajax系列第五篇——进度事件
    ajax多次请求,只执行最后一次的方法
    CentOS6.8下MySQL MHA架构搭建笔记
    HTTP状态码
    什么是 Redis 事务?原理是什么?
    Redis 通讯协议是什么?有什么特点?
  • 原文地址:https://www.cnblogs.com/lxfweb/p/13721370.html
Copyright © 2020-2023  润新知