CTF Web安全

SIYUCMS后台模板注入分析

Posted on 2020-11-28,2 min read

这个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。
直接传

下一篇: 安洵杯Writeup→