原题地址:https://merak-ctf.site/challenges#ez_bypass
首先从题目可以看出:easy_bypass,简单的绕过 我们打开题目地址,简单的展示了源码的一部分
I put something in F12 for you include 'flag.php'; $flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}'; if(isset($_GET['gg'])&&isset($_GET['id'])) { $id=$_GET['id']; $gg=$_GET['gg']; if (md5($id) === md5($gg) && $id !== $gg) { echo 'You got the first step'; if(isset($_POST['passwd'])) { $passwd=$_POST['passwd']; if (!is_numeric($passwd)) { if($passwd==1234567) { echo 'Good Job!'; highlight_file('flag.php'); die('By Retr_0'); } else { echo "can you think twice??"; } } else{ echo 'You can not get it !'; } } else{ die('only one way to get the flag'); } } else { echo "You are not a real hacker!"; } } else{ die('Please input first'); } }Please input first
我们将其格式化方便观察
I put something in F12 for you
include 'flag.php';
$flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';
if(isset($_GET['gg'])&&isset($_GET['id'])) {
$id=$_GET['id'];
$gg=$_GET['gg'];
if (md5($id) === md5($gg) && $id !== $gg) {
echo 'You got the first step';
if(isset($_POST['passwd'])) {
$passwd=$_POST['passwd'];
if (!is_numeric($passwd))
{
if($passwd==1234567)
{
echo 'Good Job!';
highlight_file('flag.php');
die('By Retr_0');
}
else
{
echo "can you think twice??";
}
}
else{
echo 'You can not get it !';
}
}
else{
die('only one way to get the flag');
}
}
else {
echo "You are not a real hacker!";
}
}
else{
die('Please input first');
}
}Please input first
很明显的看出是几层if语句套娃,只要一层一层解开,就会由最中间的highlight函数展示出flag 首先我们看第一层:
if(isset($_GET['gg'])&&isset($_GET['id']))
isset检测参数的存在,若两个条件都满足则执行if内代码,否则执行die('Please input first');
,这一步我们只需要简单的提交gg和id两个get参数即可,提交后返回的代码发生了改变
I put something in F12 for you
include 'flag.php';
$flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';
if(isset($_GET['gg'])&&isset($_GET['id'])) {
$id=$_GET['id'];
$gg=$_GET['gg'];
if (md5($id) === md5($gg) && $id !== $gg) {
echo 'You got the first step';
if(isset($_POST['passwd'])) {
$passwd=$_POST['passwd'];
if (!is_numeric($passwd))
{
if($passwd==1234567)
{
echo 'Good Job!';
highlight_file('flag.php');
die('By Retr_0');
}
else
{
echo "can you think twice??";
}
}
else{
echo 'You can not get it !';
}
}
else{
die('only one way to get the flag');
}
}
else {
echo "You are not a real hacker!";
}
}
else{
die('Please input first');
}
}You are not a real hacker!
证明绕过了第一层,接下来解决第二层中间将gg和id的值赋给了变量gg和id第二层的判断条件为
if (md5($id) === md5($gg) && $id !== $gg)
这段语句需要同时满足两个条件,首先第一个条件md5(id) === md5(gg),需要id和gg的MD5值“全等”(“===”表示数值和类型完全相同),本来随便提交两个相同的值即可,但是同时还需满足第二个条件id !== gg,这个条件中的“!==”表示“不全等”(值相同但类型不同),故第一个条件的方法无法使用,这时候我们需要利用md5函数本身的特性,传递两个值不同但无法用来比较的数据类型,这里可以通过数组也就是gg[]和id[]来绕过,于是我们通过get提交?gg[]=1&id[]=2如图,虽然这里报错了,不过不影响,成功绕过第二层解决,接下来解决第三层和第四层中间将POST参数passwd的值赋给了变量
if (!is_numeric($passwd))
第四层的判断条件为
if($passwd==1234567)
其中的is_numeric函数的作用是检测变量是否为数字或数字字符串,是则返回ture,反之。不过要注意的是if语句条件中的“!”,if判断语句是通过判断括号内的值是否为0来决定是否执行下面的语句
打个比方,假设a=0,如果if(a)成立执行if里的语句,那么if(!a)不成立不执行if里的语句
条件$passwd==1234567需要变量$passwd的值等于1234567,但不需要全等(参考第一层)
综上,我们需要通过POST提交一段使$passwd不为数字或数字字符串的值
用hackbar通过POST提交$passwd=1234567+任意字符
即可
flag:
MRCTF{f684b6ef-e9e4-4cab-b250-a522b7c6a3f0}