这个CMS是在DMCTF中出的题。总共就两步。
1。www.zip泄露sql。找到后台管理员密码。
2。后台能编辑模板。文件名啥的没过滤。能任意编辑文件。但是这题我修改了源码。对传入值不能有<?出现。
赛后想了下。。。貌似还是可以通过htaccess的反斜杠配合base64编码的文件绕黑名单😂
这里预期解是模板注入,后端过滤如下
在这个模板中。他解析变量是
{$a}
解析成
<?php echo htmlentities($a);>
所以。这不就是一把梭吗。没任何过滤。直接执行代码就行
跟下解析标签的逻辑
在thinkphp/library/think/Template.php的parse方法中找到解析变量的方法
这个方法的参数$content
就是我们xxx.html的模板内容
跟进
进入parseVarFunction方法中。
然后进入switch语句。匹配到default。注意这里只是把变量的值带进入。和拼接别无两样。
最后执行了
$varStr = $name;
return $varStr;
然后拼接语句。形成一个php代码
最后。他对我们传入的模板代码。进行替换
把{$a}。替换成了解析后的<?php echo htmlentities($a);?>
$content = str_replace($match[0], $str, $content);
整理下流程
输入{$a}
正则解析模板,匹配出$a
然后拼接变成"$a|htmlentities"
进入switch语句。拼接变成"htmlentities($a)"
然后解析完毕。和php标签进行拼接。成为<?php echo htmlentities($a);?>
最后把传入的模板替换成解析后的代码
后面呢。就是把这些php代码再次解析。就形成了代码执行。
这里我做了黑名单。但是。。随便绕。
比如$_GET[1]($_GET[2])
或者GLOBALS啥的。都可以
所以这题没给出源码。。可以黑盒做。模板编辑处。可以看到下面有{$axxxx}
的写法
然后写个{$a}
。就可以得到报错
看到$a直接拼接在模板中。然后就想着动态执行。构造exp了
另外。后台可以修改后缀phtml。
直接传