### 简要描述: 看了一下你们以往对漏洞的态度,以及我上一个提交的漏洞的情况,来个狠的,希望不要再忽略了,希望给20 rank。 官方demo已shell。这是第1发。 ### 详细说明: 问题仍然出现在头像上传处。 finecms头像上传代码沿用的phpcms,多的不说,直接看代码吧。 /member/controllers/Account.php 第412行: ``` /** * 上传头像处理 * 传入头像压缩包,解压到指定文件夹后删除非图片文件 */ public function upload() { if (!isset($GLOBALS['HTTP_RAW_POST_DATA'])) { exit('环境不支持'); } $dir = FCPATH.'member/uploadfile/member/'.$this->uid.'/'; // 创建图片存储文件夹 if (!file_exists($dir)) { mkdir($dir, 0777, true); } $filename = $dir.'avatar.zip'; // 存储flashpost图片 file_put_contents($filename, $GLOBALS['HTTP_RAW_POST_DATA']); // 解压缩文件 $this->load->library('Pclzip'); $this->pclzip->PclFile($filename); if ($this->pclzip->extract(PCLZIP_OPT_PATH, $dir, PCLZIP_OPT_REPLACE_NEWER) == 0) { exit($this->pclzip->zip(true)); } ``` 看到倒数第3行,这是解压的操作。熟悉phpcms那个洞的同学应该知道,上传头像的时候先是本地flash对头像进行处理、压缩以后上传,后端进行解压。解压以后删除所有非法文件。 如代码所示,解压如果遇到错误的话,就exit。 所以,如果我们构造一个压缩包,让解压发生错误,但其中的部分内容又能够解压出来,就能exit出这个程序,就不会删除非法文件,我们的shell就能留下来。 思路就这样,利用方法及demo证明见下方。 ### 漏洞证明: 首先构造压缩包。...
### 简要描述: 看了一下你们以往对漏洞的态度,以及我上一个提交的漏洞的情况,来个狠的,希望不要再忽略了,希望给20 rank。 官方demo已shell。这是第1发。 ### 详细说明: 问题仍然出现在头像上传处。 finecms头像上传代码沿用的phpcms,多的不说,直接看代码吧。 /member/controllers/Account.php 第412行: ``` /** * 上传头像处理 * 传入头像压缩包,解压到指定文件夹后删除非图片文件 */ public function upload() { if (!isset($GLOBALS['HTTP_RAW_POST_DATA'])) { exit('环境不支持'); } $dir = FCPATH.'member/uploadfile/member/'.$this->uid.'/'; // 创建图片存储文件夹 if (!file_exists($dir)) { mkdir($dir, 0777, true); } $filename = $dir.'avatar.zip'; // 存储flashpost图片 file_put_contents($filename, $GLOBALS['HTTP_RAW_POST_DATA']); // 解压缩文件 $this->load->library('Pclzip'); $this->pclzip->PclFile($filename); if ($this->pclzip->extract(PCLZIP_OPT_PATH, $dir, PCLZIP_OPT_REPLACE_NEWER) == 0) { exit($this->pclzip->zip(true)); } ``` 看到倒数第3行,这是解压的操作。熟悉phpcms那个洞的同学应该知道,上传头像的时候先是本地flash对头像进行处理、压缩以后上传,后端进行解压。解压以后删除所有非法文件。 如代码所示,解压如果遇到错误的话,就exit。 所以,如果我们构造一个压缩包,让解压发生错误,但其中的部分内容又能够解压出来,就能exit出这个程序,就不会删除非法文件,我们的shell就能留下来。 思路就这样,利用方法及demo证明见下方。 ### 漏洞证明: 首先构造压缩包。 准备7个php文件,直接打包: [<img src="https://images.seebug.org/upload/201406/08234916c65ea35ac9fdb0b975f2e460d5470d22.jpg" alt="01.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201406/08234916c65ea35ac9fdb0b975f2e460d5470d22.jpg) 打包好的1.zip,用UltraEdit打开编辑,将结尾处的6.php修改类似下图,保存: [<img src="https://images.seebug.org/upload/201406/082352096c22277fd9eb0f5142d58f24f3610abe.jpg" alt="002.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201406/082352096c22277fd9eb0f5142d58f24f3610abe.jpg) 我们直接用winrar解压就能发现报错了,但文件却正常地解压了出来: [<img src="https://images.seebug.org/upload/201406/08235405d8f4f02ef1c695ca08a096835112c1c6.jpg" alt="003.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201406/08235405d8f4f02ef1c695ca08a096835112c1c6.jpg) 要的就是这个效果。 接下来,上传。注册一个账号,登录以后来到头像上传处。选择正常图片抓包,将数据包修改成刚才生成的那个zip: [<img src="https://images.seebug.org/upload/201406/0823585130ed528a9af3096ae6adb3b09890e474.jpg" alt="004.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201406/0823585130ed528a9af3096ae6adb3b09890e474.jpg) 发送会发现返回包报错了: [<img src="https://images.seebug.org/upload/201406/082359383ca560825da66ee358aa0ea219982f0d.jpg" alt="005.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201406/082359383ca560825da66ee358aa0ea219982f0d.jpg) 报错了没关系,直接根据目录结构即可找到上传的这个shell,在/member/uploadfile/member/你的uid/3.php 其中,1/2/3/4/5/6/7都试一下,根据有些可能没解压出来。 demo站phpinfo证明:http://v2.finecms.net/member/uploadfile/member/639/3.php