Author: vspiders
Blog: http://blog.csdn.net/vspiders
前言
还是要从bugku上的一道实战题目说起,其实事后才发现,自己在错误的道路上越走越远,故有此文。
0x01 官方思路
题目地址:http://120.24.86.145:9006
一波目录扫描,发现1.zip
文件,果断下载解压,是网站源码。其中有包含flag
的文件名flag-asd.txt
,访问之即得答案。
0x02 漏洞搜集
事实上大多数人都会从这里开始,首先搜集科威盒子相关漏洞信息,主要有以下两个:
0x03 审计之旅
因为代码就功能层逻辑结构比较简单,先是通篇扫了一下,主要发现几个鸡肋漏洞。
admin/skin_edit.php
页面。<?php
require_once 'inc.php';
...
$type = !empty( $_GET['type'] ) ? trim( $_GET['type'] ) : "";
$name = !empty( $_GET['name'] ) ? trim( $_GET['name'] ) : "";
...
} elseif( $type == "ok" )
{
$path = ROOT.'/templates/'.$name.'/'.$_GET['aa'].'.tpl';
file_put_contents( $path ,$_POST['content']);
$templates->assign("msg","修改模板成功!");
$templates->display( templates ( 'msg.tpl' ) );
}
?>
type、name
和aa
变量均可控,因此可以修改任意模版文件。
这里存在一个小tips,由于路径可控,可以利用windows下的命名规则绕过上传,比如上传aa=1.php:
,windows下会生成1.php
但是却无法写入文件,但是P牛写过在IIS下,可以利用<<<
向写入内容。
templates_c
目录下发现大量php文件,并且里面内容为模板信息。再次点燃希望。我先是测试了直接向tpl文件中写入php代码,但它在编译时会过滤<?php、?>等敏感字符,就js加载php也被过滤掉了,这里尝试后未解。
0x03 峰回路转
在审计的过程中,include/smarty/Smarty_Compiler.class.php
编译文件中的模版tags处理函数引起了我的兴趣,主要代码如下:
function _compile_tag($template_tag)
{
....
switch ($tag_command) {
case 'include':
return $this->_compile_include_tag($tag_args);
case 'include_php':
return $this->_compile_include_php_tag($tag_args);
...
主要意思是如果模板文件中出现include_php
标签,则会调用文件包含函数。后面就不做过多分析,就是将任意文件进行include()
包含,从而引发文件包含漏洞。
0x04 漏洞利用
首先上传一个test.tpl
文件,注意文件路径,这里以/admin/
为例,内容为php执行代码:
<?php phpinfo();?>
再修改/admin/templates/index.tpl
文件为,构造include_php
标签为:
<!--Kw[include_php file="test.tpl"]-->
访问/admin/index.php
,即加载恶意执行代码
0x05 后记
也没有必要提供什么修复方案了,反正科威好像早就关门了。主要是学习下审计,锻炼下能力吧。