网络安全从入门到精通(第九章-2) 变量覆盖漏洞

本文内容:

  • 什么是变量覆盖
  • 函数解析

1,什么是变量覆盖:

  1.变量覆盖:

    指的是可以利用我们的传参值替换程序原有的变量值。

    举例:

      $a = 123;

      $a = 124;

      echo $a;

      运行结果:输出124,这就是变量覆盖。

  2.怎么寻找变量覆盖?

    导致变量覆盖漏洞的场景有:

      特殊符号,如$$使用不当。

      estract()函数使用不当[常见]。

      parse_str()函数使用不当[常见]。

      import_request_variables()使用不当。

      开启列全局变量注册。

    变量覆盖有的时候可以直接让我们获取Webshell,拿到服务器权限。

2,函数解析:

  1.extract()函数:

    作用:将数组中的数据变成变量。

    举例:      

      <?php
      $a = "1";
      $my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
      extract($my_array);
      echo "$a = $a; $b = $b; $c = $c";
      ?>

    运行结果:$a = Cat; $b = Dog; $c = Horse

    CTF实例:     

      <?php
      $flag = "flag(12345)";
      extract($_GET);
      if(isset($gift)){
      $conetnt=trim($test);
      if($gift==$content){
      echo 'flag is'.$flag
      }}

    解析:

      isset是判断$gift是否存在且不能够为空。

      trim是将$test值的空格去掉。

      $test在extract上边,就可以通过GET传参text=123,将原来的test值覆盖掉。

      还需传参gift,让它符合if语句条件。

      所以答案:?test=123&gift123

  2.parse_str()函数:

    作用:将查询字符串解析到变量中。

    实例:    

      <?php
      parse_str("name=aaaa&&age=60");
      echo $name."<br>";
      echo $age;
      ?>

    运行结果:aaaa和60 ,parse_str("name=Bill&age=60") 相当于完成了$name ='aaaa'和$age ='60'

    如果在parse_str中可以直接传参的话,也可以覆盖变量。     

      <?php
      $a=$_GET['id']
      parse_str("$a");
      echo $name."<br>";
      echo $age;
      ?>

  3.特殊符号$$:

    $$导致的变量覆盖问题在CRF代码审计题目中经常在foreach中出现,如一下示例代码,使用foreach来遍历数组中的值。

    然后再将获取数组键名作为变量,数组中的值作为变量的值,因此就产生了变量覆盖漏洞。

    请求?name-test会将$name的值覆盖,变为test。

    例题:

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

    解析:

      addslashes:一个函数,起到了魔术引号的作用,在每个双引号之前加反斜杠。

      foreach遍历数组。

      会接受GET参数、POST参数、COOKIE参数,将接收参数依次放入$_request也可以看作:$_request=$_GET+$_POST+6$_COOKIE

      $_key=>$_value 这是个数组解析,实际上就是键值分离,$_ket=键名,$_value=键值

      正常而言$a = 1是一个定值,但是因为$$_key的缘故,当我传参a=2;那么$$_key=addslashes($_value);就变为了$a = 2 .

      举个简单的例子:       

        $ a = 'b';
        $ b = 'zx';
        echo $$a;
        运行结果:zx

      解析:

        解释:$$a--->$b-->zx

        session_start

原文地址:https://www.cnblogs.com/xz25/p/12758987.html