标签:CTF | isset() | MD5加密 | 代码审计
提示:四星题目开始加大难度了~仔细想想吧~
if (isset($_GET['a']) and isset($_GET['b'])) {
if ($_GET['a'] != $_GET['b']){
if (md5($_GET['a']) === md5($_GET['b']))
die('Flag: '.$flag);
}else{
print 'Wrong.';
}
}
代码解释
if (isset($_GET['a']) and isset($_GET['b'])) {}
如果 传参的值存在并且值不是 NULL 则返回 TRUE,否则返回 FALSE。
如果一次传入多个参数,那么 isset() 只有在全部参数都以被设置时返回 TRUE 计算过程从左至右,中途遇到没有设置的变量时就会立即停止。
也就是说GET传参的参数a和b必须存在且值不能为NULL,只要满足条件就能执行if里边的语句了。
if ($_GET['a'] != $_GET['b']){}
这句的意思是如果传参a的值和传参b的值不相等就可以执行if里边的语句了,否则就输出"Wrong"。
if (md5($_GET['a']) === md5($_GET['b'])) die('Flag: '.$flag);
这句话的意思是传参a的值和b的值都先经过md5加密的值要求严格相等。
md5是不能处理数组的,md5(数组)会返回null,所以md5(a[])==null,md5(b[])==null,md5(a[])===md5(b[]) --> null === null 返回true,这样就得到flag了。
因此向GET传参两个名为a、b的不相等的数组,从而导致md5()均返回空,于是得到flag
Payload:?a[]=1&b[]=2
Flag: flag{dq80g_fjdk456rwr47jl}
打赏我,让我更有动力~
© 2016 - 2023 掌控者 All Rights Reserved.