无意间发现建站之星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;
在对服务器权限进行设置^_^