代码审计
进入环境又是代码审计
<?php
error_reporting(0);
header("Content-type:text/html;charset=utf-8");
if(isset($_POST['gdou'])&&isset($_POST['ctf'])){
$b=$_POST['ctf'];
$a=$_POST['gdou'];
if($_POST['gdou']!=$_POST['ctf'] && md5($a)===md5($b)){
if(isset($_COOKIE['cookie'])){
if ($_COOKIE['cookie']=='j0k3r'){
if(isset($_GET['aaa']) && isset($_GET['bbb'])){
$aaa=$_GET['aaa'];
$bbb=$_GET['bbb'];
if($aaa==114514 && $bbb==114514 && $aaa!=$bbb){
$give = 'cancanwordflag';
$get ='hacker!';
if(isset($_GET['flag']) && isset($_POST['flag'])){
die($give);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
die($get);
}
foreach ($_POST as $key => $value) {
$$key = $value;
}
foreach ($_GET as $key => $value) {
$$key = $$value;
}
echo $flag;
}else{
echo "洗洗睡吧";
}
}else{
echo "行不行啊细狗";
}
}
}
else {
echo '菜菜';
}
}else{
echo "就这?";
}
}else{
echo "别来沾边";
}
?>
1. 第一行代码`error_reporting(0);`用于禁止错误报告。
2. 第二行代码设置了响应头部,告诉浏览器使用UTF-8编码显示内容。
接下来,代码使用条件语句检查`$_POST['gdou']`和`$_POST['ctf']`是否被设置。如果两个变量都被设置了,就进入下一层判断。如果不满足就回显别来沾边
在第四行代码,代码将`$_POST['ctf']`和`$_POST['gdou']`赋值给变量`$b`和`$a`。
接下来,代码使用条件语句检查`$_POST['gdou']`和`$_POST['ctf']`是否不相等,并且它们的MD5散列值是否相等。如果满足这两个条件,就进入下一层判断。如果不满足就回显就这?
这个很好绕过,我们可以直接采取数组绕过,MD5不能解析数组会返回null
代码检查一个名为`$_COOKIE['cookie']`的cookie是否被设置,并且它的值等于`'j0k3r'`。如果满足这个条件,就进入下一层判断。否则回显菜菜
代码检查`$_GET['aaa']`和`$_GET['bbb']`是否被设置。如果满足这个条件,就进入下一层判断。否则回显行不行啊细狗
然后将`$_GET['aaa']`和`$_GET['bbb']`的值分别赋给变量`$aaa`和`$bbb`。
对`$aaa`和`$bbb`的值进行了判断,要求它们必须都等于`114514`并且不相等。如果满足这个条件,分别将字符串`'cancanwordflag'`和`'hacker!'`赋值给变量`$give`和`$get`。
这个也很好绕过,因为在进行等于判断的时候利用的是php弱比较,所以我们可以设置114514和114514a绕过
代码检查`$_GET['flag']`和`$_POST['flag']`是否被设置。如果满足这个条件,就分别返回`$give`和`$get`的值,并结束脚本的执行。
接下来,使用两个`foreach`循环遍历`$_POST`和`$_GET`数组,$$key用于创建与数组键名相同的变量,变量值为数组的值。
`$key`和`$value`分别代表数组元素的键和值。每次循环,`$key`和`$value`会被分别赋值为当前数组元素的键和值。
13. 最后,代码输出`$flag`的值。但是前面并没有设定flag结合foreach循环和前面判断语句的含义,这里是要传参一个flag=flag才回回显最终的flag信息,但是这里有对flag的传参进行了限制,但是也只对flag的传参进行了限制
也就是说,对于其他变量的传参并没有做任何限制,那么我们可以先将另一个变量的参数设置为flag,再赋值给flag变量作为flag变量的参数
$a=flag&flag=$a
最终payload