上传流程
上传流程以及对应的检测点
- 前端选择文件,点击上传
- JavaScript检测
- Flash AS检测
- 浏览器形成
POST MultPart
报文发送到服务器- WAF拦截
- IPS拦截
- 服务器中间件接收报文,解析后交给相关后端代码处理
- 扩展名检测
- 文件格式检测
MIME Type
检测- 内容检测(同WAF/IDS)
- 后端代码将文件内容写入临时文件中(PHP特有)
- 文件重命名
- 杀毒软件查杀
- 写入到文件后,文件名为原有文件名或以一定规则生成的文件名
- 无执行权限
- 未知文件路径
当文件上传点未对上传的文件进行严格的验证和过滤时,就容易造成任意文件上传,包括上传动态文件,如asp/php/jsp
等。如果上传的目录没有限制执行权限,导致上传的动态文件可以正常执行并可以访问,即存在上传漏洞的必要条件是:
- 存在上传点
- 可以上传动态文件
- 可以访问到上传的动态文件,即知道文件路径
- 上传目录有执行权限,并且上传的文件可执行
检测绕过
客户端检测
- 直接使用Burp等抓包软件进行修改重发,前端限制相当于没有
服务端检测
MIME Type
通常是白名单限制,常见白名单如下:
扩展名 | MIME Type |
---|---|
jpg | image/jpeg |
png | image/png |
txt | text/plain |
zip | application/zip |
doc | application/msword |
文件内容
简单文件头检测:文件头的起始部分一般开头标记文件类型,如GIF
的文件头位GIF89a
或GIF87a
GIF89a<?php phpinfo(); ?>
完整文件结构检测:通过调用图像函数进行检测文件是否为图像,需要文件内容保持相对完整,所以无法通过添加头部进行绕过
代码语言:javascript复制# 将普通图片1.jpg 和 木马文件shell.php ,合并成木马图片2.jpg
$ copy /b 1,jpg shell.php 2.jpg
- 恶意文件内容检测:检测提交内容中是否包含WebShell等数据
- 绕过方法:
- 使用Kali自带的强混淆的
weevely
进行尝试:https://github.com/sunge/Weevely - 尝试开源的WebShell收集项目:https://github.com/tennc/webshell
- 使用Kali自带的强混淆的
- 绕过方法:
图片重绘
Web应用调用GD图形库对上传的文件进行了文件转换,即时图片与文件合并,也会将尾部转换掉,无法通过前面的方法上传WebShell
- 思路:通过对比经过转换的图片,找出转换前后未变化的部分,将该部分替换为WebShell
11111111111111[xxxxxxxxxxx]11111111111111 # 转换前
22222222222222[xxxxxxxxxxx]22222222222222 # 转换后
# 此时将[xxxxxxxxxxx]部分替换为Webshell
11111111111111[<?php phpinfo(); ?>]11111111111111
- 参考:https://www.freebuf.com/articles/web/54086.html
- 工具:https://github.com/RickGray/Bypass-PHP-GD-Process-To-RCE
php codeinj.php demo.gif "<?php phpinfo();?>"
Tricks
- 文件参数多
filename
属性:文件上传过程中,如果WAF拦截一些扩展名,可以通过Burp
抓包,添加多个filename
属性
Content-Disposition: form-data; name="upfile"; filename="phpinfo.png"; filename="phpinfo.php";
- 目录可控时,可以尝试使用目录穿越
../
Content-Disposition: form-data; name="UPLOAD_DIR";
file/../../
# 如果过滤连续的 ../,可以在中间插入./进行绕过
file/.././../
在线解压缩搭配文件软链接
代码语言:javascript复制$ ln -s /etc/passwd a
# 可通过ls -l检查
$ ls -l
... a -> /etc/passwd
代码语言:javascript复制$ zip --symlinks 1.zip a
常见木马
- 一句话木马,即整个shell代码量只有一行,一般是系统执行函数
- 小马,体积小,容易隐藏,隐蔽性强。不过功能也少,一般只有上传等功能。
- 大马,代码量和功能比小马多,一般会进行二次编码加密,防止被安全防火墙/入侵检测系统检测。大马体积比较大,隐蔽性不好,而大多代码如不加密很容易被杀毒软件检测出来。但是功能多,一般包括提权命令、磁盘管理、数据库连接等。
基本木马
简单变形
图片马
搜索某目录下文件是否含有木马
解析漏洞
木马文件就算被成功上传,如果没有被Web容器以脚本文件解析执行,也不会对服务器造成威胁。所以往往在利用文件上传漏洞时,会与Web容器的解析漏洞配合使用,以保证上传的恶意代码被成功执行。
Apache
后缀解析漏洞
- Apache是从右到左开始判断解析文件后缀,如果为不可识别解析,则继续往左判断。如
shell.php.abc.rar
,其中.abc
和.rar
这两种后缀都不可识别解析,继续往左就是shell.php
,则此时该文件就被Apache解析成PHP文件
htaccess文件解析漏洞
- 如果
.htaccess
可被执行且可被上传,那么可以在其中写入以下代码。然后上传shell.jpg
图片马,此时该木马将被解析为php
<FilesMatch "shell.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
IIS
IIS6.0解析漏洞
影响版本:IIS 5.x ~ 6.0
- 目录解析漏洞:在网站下建立
xxx.asp
文件夹,该文件夹内任何后缀的文件都将被IIS当做asp脚本文件来解析并执行 - 文件解析漏洞:文件名分号后面不被解析,如
shell.asp;.jpg
,会被看成shell.asp
。可通过抓包改包绕过上传的后缀白名单 - 其它:默认可执行文件除了
.asp
,还有.asa/.cer/.cdx
IIS7
影响版本:IIS7.0 / IIS7.5 / Nginx<8.03
畸形解析漏洞:在默认Fast-CGI
开启的情况下,上传一个1.jpg
文件,内容如下。然后去访问1.jpg/.php
,那么就会在该目录下生成一个shell.php
文件
Nginx
空字节代码执行漏洞
Nginx<=0.7.65 / Nginx<=0.8.37
- 在图片
1.jpg
中嵌入PHP代码,然后通过访问1.jpg .php
来执行其中代码
文件名逻辑漏洞(CVE-2013-4547)
影响版本:Nginx 0.8.41~1.4.3 / 1.5.0~1.5.7
- 上传一个以空格
abc.jpg
,当访问abc.jpg .php
时,其中UrlDecode
,此时会将前面的图片文件当做PHP执行。
PHP FastCGI取值错误解析漏洞
前提条件:网站开启了
cgi.fix_pathinfo
并且未设置security.limit_extensions
- 开启了
cgi.fix_pathinfo
后,如果所执行文件不存在,则会向前递归解析,继续查找上一级文件是否存在- 如:
index.php/abc/xxx
- 如:
- 未设置
security.limit_extensions
,该选项用于限制可执行的文件类型- 如:
abc.jpg/.php
- 如:
- 假设网站满足以上条件,当访问
http://www.xxx.com/1.jpg/xxx.php
时,页面返回的是将1.jpg
按php解析的结果。由于xxx.php
是不存在的文件,PHP则会向前递归解析,造成解析漏洞。
上传漏洞
filepath漏洞
- 可用于突破自动命名规则
- 改变文件上传路径:如
filepath
默认路径为/upload/
,将其修改为/upload/x.asp/
,配合IIS6目录解析漏洞使用,需要一定的权限,否则无法成功创建目录。 - 直接改变文件名称:将默认路径
/upload/
修改为/upload/x.asp;.abc.jpg
- 改变文件上传路径:如