任意文件上传getshell漏洞在
C:\phpStudy\WWW\apps\public\Lib\Action\AttachAction.class.php中的ajaxUpload函数
![](https://images.seebug.org/contribute/50950f87-9c95-4363-a0d7-afcf0d52d53c-w331s)
可以看到第192行
$options['allow_exts'] = t(jiemi($_REQUEST['exts']));
获取了变量exts,然后经过jiemi函数的处理,jiemi函数在
C:\phpStudy\WWW\src\vendor\zhiyicx\thinksns-old-code\src\OpenSociax\functions.inc.php中
![](https://images.seebug.org/contribute/d89c9e91-4046-4009-9c37-48f5cd39875f-w331s)
又调用了tsauthcode函数,该函数也在该文件中,截图该函数最后一行
![](https://images.seebug.org/contribute/c191eabd-5d73-4f7c-9c4e-b67fa2ba6c88-w331s)
可以看到return $keyc.str_replace('=', '', base64_encode($result));
如果我们的输入的参数为空,那么返回的也是空值
回到
$options['allow_exts'] = t(jiemi($_REQUEST['exts']));
中,如果我们输入的exts变量值为空,那么$options[‘allow_exts’]也就是空值
程序接着往下走
![](https://images.seebug.org/contribute/ec2eea7a-5d61-4f9d-90a9-bf52c08f0f62-w331s)
在第201行,调用了upload函数,在
C:\phpStudy\WWW\src\vendor\zhiyicx\thinksns-old-code\src\addons\model\AttachModel.class.php中
![](https://images.seebug.org/contribute/f4633a0f-709a-48b7-948c-b8b046d55f1d-w331s)
因为我们的$options[‘allow_exts’]如果是空值,那么这里的$input_options[‘allow_exts’]也就是空值了。
![](https://images.seebug.org/contribute/1eccb039-14c3-4907-988f-b387a5838e41-w331s)
其中第202行,会合并$default_options数组和$input_options数组,$default_options[‘allow_exts’]不为空,而$input_options[‘allow_exts’]为空,经过array_merge函数的处理,会造成变量覆盖的漏洞,最终$options[‘allow_exts’]也就被覆盖为空了。
![](https://images.seebug.org/contribute/1a1a97e0-a3a6-4c26-b4ea-5119695e603c-w331s)
程序走到第209行,跟进localUpload函数,在
C:\phpStudy\WWW\src\vendor\zhiyicx\thinksns-old-code\src\addons\model\AttachModel.class.php中
![](https://images.seebug.org/contribute/eaa7154a-a8c8-4fcd-8fde-ad700839ba09-w331s)
可以看到会实例化一个UploadFile类,如果$options[‘allow_exts’]为空,那么根据类UploadFile的定义,public $allowExts = array();,$allowExts将会是空值
在第300行,$upload->upload()调用upload函数进行文件上传,upload函数在
C:\phpStudy\WWW\src\vendor\zhiyicx\thinksns-old-code\src\addons\library\UploadFile.class.php中
![](https://images.seebug.org/contribute/83a3cf54-a442-4b37-9587-b88717f8e9c8-w331s)
会获取上传文件的后缀$file['extension'] = $this->getExt($file['name']);
然后检查上传文件是否合法
if (!$this->check($file)) {
跟进check函数,在
C:\phpStudy\WWW\src\vendor\zhiyicx\thinksns-old-code\src\addons\library\UploadFile.class.php中
![](https://images.seebug.org/contribute/231a2e7b-c440-46e7-b360-4f497be31760-w331s)
可以看到第432行,检查了文件类型是否合法,在C:\phpStudy\WWW\src\vendor\zhiyicx\thinksns-old-code\src\addons\library\UploadFile.class.php中,
![](https://images.seebug.org/contribute/19c605b9-b731-4d86-9a38-a34db5e1b9a3-w331s)
可以看到可以看到判断上传文件后缀是否为php、php3、exe等等,可以用.PHP来进行大写绕过。同时因为我们构造的this->allowExts为空,所以可以绕过
if (!empty($this->allowExts)) {
的判断,直接return true;
返回true之后,就是文件的正常保存了,可以任意上传文件来getshell
直接看证明:
构造一个表单进行文件上传
![](https://images.seebug.org/contribute/6619eff8-a5a9-4e14-becf-2b21f4787413-w331s)
然后burp进行抓包,改包
因为有防csrf 的,所以要改一下referer为http://localhost/index.php
改文件后缀名为大写的PHP
![](https://images.seebug.org/contribute/9d104fa3-0488-4057-805b-5bd00b33bfdc-w331s)
![](https://images.seebug.org/contribute/7b87a562-2414-426f-a32c-afa83702427c-w331s)
可以直接看到保存的路径为2017/6/21/16,文件名为594a319c46ce9bd2634f.PHP
![](https://images.seebug.org/contribute/ebef48a9-82b7-482e-937f-5bc43300fd53-w331s)
成功getshell
暂无评论