• 网络安全从入门到精通(第九章-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

  • 相关阅读:
    vuejs组件交互
    markdown table语法
    vue循环中的v-show
    apache跨域
    sublime text执行PHP代码
    PHP语法
    方法(method)和函数(function)有什么区别?
    PHP MVC单入口
    phpstudy部署thinkPHP
    MACD判断定背离,底背离
  • 原文地址:https://www.cnblogs.com/xz25/p/12758987.html
Copyright © 2020-2023  润新知