• PHP_Code_Challenge-7-$$变量覆盖


    题目

    <?php
    include "flag.php";
    $_403 = "Access Denied";
    $_200 = "Welcome Admin";
    if ($_SERVER["REQUEST_METHOD"] != "POST")
        die("BugsBunnyCTF is here :p...");
    if ( !isset($_POST["flag"]) )
        die($_403);
    foreach ($_GET as $key => $value)
        $$key = $$value;
    foreach ($_POST as $key => $value)
        $$key = $value;
    if ( $_POST["flag"] !== $flag )
        die($_403);
    echo "This is your flag : ". $flag . "
    ";
    die($_200);
    

    分析

    if ($_SERVER["REQUEST_METHOD"] != "POST")
        die("BugsBunnyCTF is here :p...");
    

    请求方式需为POST

    if ( !isset($_POST["flag"]) )
        die($_403);
    

    需要POST一个名为flag的变量

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

    $$,变量覆盖
    第一个foreach处,能将任意变量的值赋予任意变量
    第二个foreach处,能将输入的值赋予任意变量

    if ( $_POST["flag"] !== $flag )
        die($_403);
    echo "This is your flag : ". $flag . "
    ";
    die($_200);
    

    $_POST["flag"]如果与$flag不完全相等,即值和类型都比较时,输出$_403
    如果完全相等,则输出$flag$_200

    试着POST了一发试试

    显然flag不是这个1
    看回上面的变量覆盖,foreach ($_POST as $key => $value)$$key = $value;
    当只POST一个值为1的变量flag,$$key = $valu=>$flag = 1,使可能原本存在的变量$flag被赋值为1,即真实的flag被修改为变量flag的值,由于前面的两个if,这是无法被改变的
    所以,需要在真实的flag被修改前将其值给其他变量并能输出出来
    能输出的只有die($_403);die($_200);,所以思路是利用变量覆盖在flag被改前将真实的$flag的值覆盖$_403$_200并输出
    而能利用变量覆盖将一个变量的值覆盖其他变量的地方只有第一个foreach处

    知识点

    $$变量覆盖


    解法

    $_200

    将真实的flag覆盖$_200并输出$_200

    $_GET['_200']='flag';
    $_POST['flag']=1;

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

    相当于$_200=$flag,将真flag给了$_200

    foreach ($_POST as $key => $value)
        $$key = $value;
    if ( $_POST["flag"] !== $flag )
        die($_403);
    

    $flag被修改为1,与$_POST['flag']等值等类型,不满足$_POST["flag"] !== $flag

    echo "This is your flag : ". $flag . "
    ";
    die($_200);
    

    输出$_200即输出真flag

    $_403

    将真实的flag覆盖$_403并构造使$_403能输出

    $_GET['_403']=flag&$_GET["_POST['flag']"]=2
    $_POST['flag']=1;

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

    相当于$_403=$flag,将真flag给了$_403,以及$_POST['flag']=$2$2不存在,即$_POST['flag']为空[实际代码应该会报错]

    foreach ($_POST as $key => $value)
        $$key = $value;
    if ( $_POST["flag"] !== $flag )
        die($_403);
    

    $flag被修改为1,与$_POST['flag']不等,满足$_POST["flag"] !== $flag,输出$_403

  • 相关阅读:
    在Ubuntu 桌面版 12.04 LTS安装并运行SSH
    将Tp-link无线路由器桥接到Dlink无线路由器上
    如何解决Win7将任务栏程序自动分组的困扰
    安装Ubuntu 桌面版 12.04 LTS 过程之记录
    #lspci | grep Eth
    做技术不能人云亦云
    如何使用FF的Firebug组件中的net工具查看页面元素加载消耗时间
    在Fedora8上安装使用ActiveMQ5.8
    多态继承中的内存图解 && 多态中的对象变化的内存图解
    孔子装爹案例_帮助理解多态的成员访问特点及转型
  • 原文地址:https://www.cnblogs.com/Rain99-/p/12638275.html
Copyright © 2020-2023  润新知