首页 > 渗透测试 > 建站之星sitestar v2.5文件包含漏洞利用及修复
2013
05-10

建站之星sitestar v2.5文件包含漏洞利用及修复

无意间发现建站之星sitestar 的一鸡肋文件包含漏洞,WVS扫描一朋友的网站,发现提示有以下文件包含漏洞

index.php?_a=fullist&_m=../../../../../../../../../../etc/passwd%00.jpg

admin/index.php?_a=admin_list&_m=../../../../../../../../../../etc/passwd%00.jpg

测试改漏洞影响版本有建站之星sitestar v2.5、sitestar v2.6

查看index.php文件,代码如下:

<?php
define(‘IN_CONTEXT’, 1);
include_once(‘load.php’);
?>

继续跟进load.php, 变量_m相关语句如下:

$act =& ParamHolder::get(‘_m’);
switch ($act) {
case ‘mod_order’:
include_once(P_INC.’/china_ds_data.php’);
break;
case ‘mod_auth’:
case ‘mod_message’:
include_once(P_LIB.’/rand_math.php’);
break;
}

继续跟进 ParamHolder::get是如何实现的,具体漏洞文件是在library\param.php,代码如下:

193 class ParamHolder {
194 /**
195 * Retrieve parameter
196 *
197 * @access public
198 * @static
199 * @param string $key_path The context path for retrieving data
200 * @param mixed $value The default data as fallback
201 * @param int $scope The parameter context
202 * @return mixed
203 */
204 public static function &get($key_path, $default = false, $scope = PS_ALL) {
205 switch ($scope) {
206 case PS_GET:
207 $rs =& ParamParser::retrive($_GET, $key_path, $default); //可输入变量$_GET 可能存在安全威胁
208 break;
209 case PS_POST:
210 $rs =& ParamParser::retrive($_POST, $key_path, $default); //可输入变量$_POST 可能存在安全威胁
211 break;
212 case PS_COOKIE:
213 $rs =& ParamParser::retrive($_COOKIE, $key_path, $default); //可输入变量$_COOKIE 可能存在安全威胁
214 break;
215 case PS_FILES:
216 $rs =& ParamParser::retrive($_FILES, $key_path, $default); //可输入变量$_FILES 可能存在安全威胁
217 /**
218 * get upload file type
219 */
220 if (isset($rs[“tmp_name”]) && !is_array($rs[“tmp_name”]) && !empty($rs[“tmp_name”])) {
221 $ftype = ParamParser::file_type($rs[“tmp_name”]);
222 if ($ftype == ‘unknown’) die(__(‘Upload file type error,please retry!’));
223 }
224 break;
225 case PS_MANUAL:
226 $rs =& ManualParamHolder::get($key_path, $default);
227 break;
228 case PS_ALL:
229 if (ParamParser::has($_GET, $key_path)) { //可输入变量$_GET 可能存在安全威胁
230 $rs =& ParamParser::retrive($_GET, $key_path, $default); //可输入变量$_GET 可能存在安全威胁
231 } else if (ParamParser::has($_POST, $key_path)) { //可输入变量$_POST 可能存在安全威胁
232 $rs =& ParamParser::retrive($_POST, $key_path, $default); //可输入变量$_POST 可能存在安全威胁
233 } else if (ParamParser::has($_COOKIE, $key_path)) { //可输入变量$_COOKIE 可能存在安全威胁
234 $rs =& ParamParser::retrive($_COOKIE, $key_path, $default); //可输入变量$_COOKIE 可能存在安全威胁
235 } else if (ParamParser::has($_FILES, $key_path)) { //可输入变量$_FILES 可能存在安全威胁
236 $rs =& ParamParser::retrive($_FILES, $key_path, $default); //可输入变量$_FILES 可能存在安全威胁
237 } else if (ManualParamHolder::has($key_path)) {
238 $rs =& ManualParamHolder::get($key_path, $default);
239 } else {
240 $rs = $default;
241 }
242 break;
243 default:
244 $rs = $default;
245 }
246 return $rs;
247 }
248 }

可以看到没有对输入变量做任何的过滤判断等,导致本地包含漏洞的出现。

针对朋友网站的环境等修复方案如下:

对$rs进行过滤,return $rs;前加如下代码:

$rs = str_replace(“.”,”_”,$rs);

return $rs;

在对服务器权限进行设置^_^

菜鸟文章,欢迎拍砖!感谢Seay的代码审计工具,感谢依楼听雨童鞋对漏洞分析和修复建议~

最后编辑:
作者:admin
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。