关于METINF5.3漏洞引发的变量覆盖漏洞

一.$$引起的变量覆盖漏洞,
在这里插入图片描述

1、Include 调用了flag.php文件(调用文件还可以有require_once()或者require());
2、 2 00 , _200, 200,_403 定义两个参数,以及参数值。
3、判断访问页面的方法是否为post方法和有没有参数flag。
4、再接着两个foreach函数遍历数组函数,然后再将获取到的数组键名作为变量,数组中的键值作为变量的值。
5、还有一个if判断语句,判断用post方法传输的数据是不是和 f l a g 的 值 相 同 , 如 果 相 同 , 输 出 f l a g 。 6 、 最 后 输 出 flag的值相同,如果相同,输出flag。 6、最后输出 flagflag6_200的内容。
我们可以看到第一个foreach遍历中,

foreach ($_GET as $key => $value)
$$key = $$value

这里出现了 $$key = $$value,传入的键值 会 当 做 变 量 , 例 如 , 我 们 传 入 2 00 = f l a g , 经 过 处 理 后 变 成 会当做变量,例如,我们传入_200=flag,经过处理后变成 200=flag,_200= f l a g , 则 flag,则 flag,_200的值被覆盖为$flag的值。
第二个foreach遍历,

foreach ($_POST as $key => $value)
    $$key = $value;

出现了$$key = $value;如post方法传入flag=abc,则处理后变成$flag=abc。这样就造成将我们需要获取的flag的值给覆盖掉了。

所以如果在CTF中获得flag,我们需要先将 f l a g 的 值 覆 盖 flag的值覆盖 flag_200或 4 03 的 值 , 然 后 输 出 _403的值,然后输出 403_200或$_403。
二,Extract()函数引起的变量覆盖漏洞
该函数使用键名当做变量名,键值当做变量值,如果有相同的变量名,则默认覆盖原有的变量值。
在这里插入图片描述

1、文件将get方法传输进来的值通过extrace()函数处理。
2、通过两个if语句分别判断是否存在gift变量,和变量gift的值和变量content的值是否相等。变量content的值是通过读取变量test的值获取到的。如果两个变量相等输出flag。如果不相等,输出错误。

G E T [ ‘ t e s t ’ ] = ’ a ’ , 处 理 后 GET[‘test’]=’a’,处理后 GET[test]=a,test=a,覆盖了原来的空,即 t e s t = " " , 此 时 只 需 test="",此时只需 test="",gift=a,可以实现 g i f t = gift= gift=content;成功拿到flag。

三,Parse_str()函数引起的变量覆盖漏洞

parse_str() 函数用于把查询字符串解析到变量中,如果没有array 参数,则由该函数设置的变量将覆盖已存在的同名变量。 极度不建议 在没有 array参数的情况下使用此函数,并且在 PHP 7.2 中将废弃不设置参数的行为。此函数没有返回值
<?php

       error_reporting(0);

       if (empty($_GET['id'])) 
      {
            show_source(__FILE__);
            die();
      } 
      else 
     {
            include (‘flag.php’);
            $a = “www.OPENCTF.com 
            $id = $_GET['id'];
            @parse_str($id);
            if ($a[0] != ‘QNKCDZO’ && md5($a[0]) == md5(‘QNKCDZO’)) 
           {
                 echo $flag;
           } 
           else 
           {
                 exit(‘其实很简单其实并不难!’);
           }

       }

?>

1.@parse_str($id)把查询字符串解析到变量中,没有使用array选项,若有同名变量,将原来的覆盖。我们可以用?id=a[0]将原来的$a的值给覆盖掉。

2.$a[0] != ‘QNKCDZO‘ && md5($a[0]) == md5(‘QNKCDZO‘)判断 a [ 0 ] 的 值 不 是 Q N K C D Z O 并 且 a[0]的值不是QNKCDZO并且 a[0]QNKCDZOa[0]的MD5值要和QNKCDZO的MD5值相同。

因为主要介绍变量覆盖,所以接下来的解题方法就不说了。核心思路就是用?id=a[0]=********覆盖$a的值满足后续要求。

学习自:https://www.cnblogs.com/bmjoker/p/9025351.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值