挖了的坑总是要填的,文件上传总结来了~
漏洞介绍
正常的业务中,常常都会有上传头像、上传附件的功能,但往往会由于缺少对于文件的检验或检验不充分,使得攻击者可以上传具有动态执行能力的脚本,并通过各种方法使其解析,从而拿到一个可以执行系统命令的接口(通常叫做webshell),从而进行其他操作,这就是文件上传漏洞。
漏洞危害
- 拿到webshell执行系统命令
- 提权获取管理员权限
- 打开突破口,由外网向内网突破
- 数据库等敏感数据获取
- 域环境及后渗透等操作
防御原理与攻击方式
1. 前端JS校验
- 防御原理:通过js来校验上传的文件名是否合法,如果不合法则不允许上传
- 攻击方式:修改js代码/禁用js/传合法后缀然后抓包修改
2. MIME类型检测
防御原理:在上传文件时,http的请求头会出现content-type字段来标识所上传的文件类型,通过检测此字段来校验文件是否合法
攻击方式:上传合法文件然后抓包修改文件后缀/直接修改content-type字段
1 | png --> image/png |
3. 目录路经检测
黑名单
- 防御原理:不允许哪种文件上传
- 攻击方式:如下列举
大小写
- windows不区分大小写,Linux区分大小写,因为可以尝试各种大小写来绕过,只要能够解析即可
特殊扩展
- php规定了可以解析的特殊后缀,可以尝试如phtml、php3、php5、phps等
文件名.或文件名空格
- windows下默认是会把文件最后的点和空格给去掉的,所以可以尝试后缀+空格或者后缀+点来进行绕过
0x00截断
- php的底层是C语言实现的,C语言字符串的结束标志是\0,十六进制为%00,在php中如果遇见%00,在有的版本中是可以截断的,以此突破
双写绕过
- 若只是进行了简单的黑名单单次略去,可以双写绕过
.htaccess攻击
- apache自定义解析文件.htaccess,可以解析特殊后缀和特殊文件名
1 | <FilesMatch "filename"> |
.user.ini攻击
- 也是php的解析配置文件,但不仅可以用于Apache,还可以用于nginx,利用时需要目录下至少存在一个php文件
1 | auto_prepend_file=5.pass |
文件流特性绕过
- windows文件流特性,可以通过文件名.php::$DATA来尝试绕过
解析漏洞
参考解析漏洞链接
白名单
- 防御原理:只允许那种后缀的文件通过
- 攻击方式:列举如下
00截断
- php的底层是C语言实现的,C语言字符串的结束标志是\0,十六进制为%00,在php中如果遇见%00,在有的版本中是可以截断的,以此突破
解析漏洞
- 参考解析漏洞链接
5.文件内容检测
- 防御方式:检测文件的特定特征,来判断文件是否合法
文件幻数检测
- 防御原理:检测文件幻数(文件头)以判断文件是否合法
- 攻击方式:伪造文件头计即可
文件相关信息检测
- 防御原理:通过getimagesize()等信息来检测文件尺寸等是否合法
- 突破原理:查什么伪造什么即可
文件加载检测
相关API/函数检查
- 防御原理:调用相关的API和函数来判断文件是否安全
- 突破方式:空白区填充代码
二次渲染
- 防御原理:将上传的文件重新渲染生成图片
- 突破方式:空白区填充代码/直接攻击加载器
6.解析攻击
IIS
IIS6.0目录解析漏洞和文件解析漏洞
目录解析漏洞和文件解析漏洞
- 目录解析漏洞:*.asp命名的文件夹内的文件都当做asp
- 文件解析漏洞:*.asp;.jpg这种文件;及之后会被忽略,最终解析为asp
- .asp .cer .asa .cdx都可能被解析
IIS7.0&7.5畸形解析漏洞
条件
- 运行在fash-cgi模式
- php.ini的cgi.fix_pathinfo=1
文件/.php会被当做php来执行,和php对于文件的解析顺序有关,以/分隔,从后向前判断是否存在,存在就当做php代码来执行
Apache解析漏洞
- 多后缀解析漏洞(与解析顺序有关)
- 特殊后缀解析漏洞(配置不当,如phtml、php3、php5等)
- 自定义解析文件(.htaccess/.user.ini)
- CVE-2017-15715(%0a换行符绕过黑名单)
nginx解析漏洞
- 畸形解析漏洞:文件/.php会被当做php来执行,和php对于文件的解析顺序有关,以/分隔,从后向前判断是否存在,存在就当做php代码来执行
- %00截断(严格来说是php配置的漏洞,nginx版本要求0.5、0.6、0.7<=0.7.65、0.8 <= 0.8.37 )
- CVE-2013-4547(非编码空格绕过后缀名限制,版本要求0.8.41~1.4.3,1.5.x <= 1.5.7)
- 配置不当导致路径穿越
Tricks
压缩包可以上传的话,可以尝试通过phar或者zip伪协议来解析
条件竞争也有可能存在
以post方式向任意php文件发送请求时,会生成临时文件,若知道临时文件位置,可竞争包含尝试getshell
move_uploaded_file()会忽略掉文件末尾的/.
可以尝试数组突破限制
本文作者:
yd0ng
本文链接: https://yd0ng.github.io/2020/04/10/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E6%80%BB%E7%BB%93/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
本文链接: https://yd0ng.github.io/2020/04/10/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E6%80%BB%E7%BB%93/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!