# 漏洞类型

# 常规类

扫描获取上传;会员中心上传;后台系统上传;各种途径

# 解析漏洞

apache;IIS6/7.X;nginx。IIS/7.X 和 nginx 是几乎一样的

# Apache

未知扩展名解析漏洞;AddHandler 导致的解析漏洞;HTTPD 换行解析漏洞

# 未知扩展名解析漏洞

apache 的解析漏洞依赖于一个特性,apache 默认一个文件可以有多个以点分割的后缀,当最右边的后缀无法识别(不在 mime.types 文件内),则继续向左识别,直到识别到合法后缀才进行解析

x.php.xxx.yyy
识别最后的 yyy,如果不识别,就向前解析,直到识别
利用场景:
如果对方中间件 apache 属于低版本,我们可以利用这个文件上传上传一个不识别的文件后缀,利用解析漏洞规则成功解析文件,其中后门代码被触发

实战中可以上传 rar,owf 等文件进行利用,如果上传 phpinfo.php.jpg,即使文件名中有.php 也会直接解析为.jpg,因为 apache 认识.jpg,停止继续向左识别

# Nginx

Nginx 配置文件错误导致的解析漏洞;Nginx 字节任意代码执行漏洞;等等

# Nginx 配置文件错误导致的解析漏洞

对于任意文件名,在后面添加 /xxx.php(xxx 为任意字符)后,即可将文件作为 php 解析。

例:info.jpg 后面加上 /xxx.php,会将 info.jpg 以 php 解析。

# CMS 漏洞

已知 cms 源码

# 编辑器漏洞

fckeditor;ckeditor;kindeditor

# CVE 漏洞

CVE-2019-12615;CVE-2015-5254

# 验证 / 绕过

# 前端

js 类防护,前端验证代码可以直接删除

# 后端

# 黑名单

大小写绕过;点绕过;空格绕过;配合解析漏洞绕过;双后缀名绕过

# 特殊解析后缀

php3,php5 也可以解析为 php 同时不被拦截

# .htaccess 解析

.htaccess 文件中,用 filematch 函数进行对文件名的匹配

1
2
3
<FilesMatch "\.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

这段代码的意思是,如果上传的文件名中有.jpg 这串字符,就以 php 文件来执行这个文件,由于网站没有对.htaccess 文件进行过滤,所以可以通过上传.htaccess 文件来对后续上传的文件进行一个绕过

# ::$DATA 绕过

在 window 的时候如果文件名加::$DATA 会把::$DATA 之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA 之前的文件名,他的目的就是不检查后缀名

例如:“phpinfo.php::$DATA"Windows 会自动去掉末尾的::$DATA 变成"phpinfo.php”

# 循环过滤

有的验证代码只会验证一次,而不会循环验证

比如将 php 替换为空,在只有一次循环的情况下,‘a.php’会被替换为’a.’
‘a.pphphp’就会被替换为’a.php’
而多次循环不会出现这种情况

# 白名单

# MIME 绕过

修改文件类型

# %00 截断

我们上传 1.php%00.jpg 时,首先后缀名是合法的 jpg 格式,可以绕过前端的检测。上传到后端后,后端判断文件名后缀的函数会认为其是一个.jpg 格式的文件,可以躲过白名单检测。但是在保存文件时,保存文件时处理文件名的函数在遇到 %00 字符认为这是终止符,于是丢弃后面的.jpg,于是我们上传的 1.php%00.jpg 文件最终会被写入 1.php 文件中并存储在服务端
条件:
php<5.3.4
文件上传路径可控

…/upload/phpinfo.php%00/8220201011144424.jpg
实际上传的为 phpinfo.php 而不是.jpg

如果是以 post 形式上传要将 %00 url 解码一下,get 会自动解码 post 不会

# 其他

# 二次渲染下的条件竞争

由于有些网站的二次渲染,文件在上传之后会首先直接上传到缓存当中,然后再重新对文件进行验证,如果文件有害就删除,无害则进行二次渲染。

而在计算机中,最小的运算调度单位是线程,而每个线程又依附于一个进程,条件竞争则是多进程或多线程对一个共享资源操作,因为操作顺序不受控的时候所产生的问题。比如当我们在打开一个文档的时候,我们要对其进行删除操作,系统会提示当前程序正在运行无法删除

那么我们可以利用这一点,进行恶意文件的上传

我们可以利用 bp 的爆破工具不断上传一个文件,同时我们又不断发送访问这个文件的请求,如果这个文件被我们访问成功了,那么后台就无法删除这个文件,实现木马的上传

文件头检测

突破 getimagesize

# 路径重命名

当上传文件的时,有的系统会自动重命名这个文件,然后保存在对应的路径下
UPLOAD_PATH . ‘/’ .$file_name;
那么我们可以这样写
upload/upload-19.php/.
代码在验证的时候验证的是 upload-19.php/. 而不是 upload-19.php,这样就绕过了对 php 的验证,而保存的时候还是只会保存 php 文件

# WAF 绕过

# 数据溢出 - 防匹配(xxx…)

在数据包填入大量无关数据导致 waf 功能失效

# 符号变异 - 防匹配(’ " ;)

比如文件名为 "a.php",可以把双引号去掉一个,写成 "a.php,不要后面的双引号;或者直接去掉双引号;或者可以写成"a".php;"a"a.php

# 数据截断 - 防匹配(%00; 换行)

“a.php"写成"a.php%00.jpg” or “a.php::$DATA.jpg” or “a.php;.jpg” or “a.jpg;.php”
这些不一定都能绕过,但也有可能绕过,具体情况具体分析判断
换行就是写成
“a
.
p
h
p”

# 重复数据 - 防匹配(参数多次)

在 filename="a.php" 之前,填入大量的其他 filename,比如

filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“b.jpg”;filename=“a.php”;

或者将数据包整个一段填入 filename 中

Content-Disposition: form-data; name=“upload_file” filename=“x.php”
Content-Type: image/jpeg
写成
Content-Disposition: form-data; name=“upload_file”
filename="Content-Disposition: form-data; name=“upload_file"x.php”
Content-Type: image/jpeg

就是将 filename 之前的一段当作 filename 的值填入进去,类似于递归,数据包层面上看表面上是给了值,但实际上没有真正的值,但安全狗会认为已经有值填入了

或者还可以这样写

Content-Disposition: form-data; name=“upload_file” filename=“x.php”
Content-Type: image/jpeg
写成
Content-Disposition: form-data; name=“upload_file”
filename=“Content-Type: image/jpeg;x.php”
Content-Type: image/jpeg
这里要注意,a.php 前要加分号,安全狗会认为到分号就结尾了,斜杠也可以起到类似于分号的作用,也就是说这里也可以写成 filename=“Content-Type: image/jpeg/x.php” 或者 filename=“Content-Type: image/jpegx/.php”

# Fuzz

用 bp 导入 fuzz 字典进行爆破,但是因为速度太快可能会被拦截。也可以自己写字典然后倒入到里面去尝试,重要的是思路

# 安全修复

后端验证:采用服务端验证模式
后缀检测:基于黑名单,白名单过滤
MIMEM 检测:基于上传自带类型检测
内容检测: 文件头,完整性检测

自带函数过滤:参考 uploadlabs 函数
自定义函数过滤:function check_file ()
WAF 防护产品:宝塔,云盾,安全公司产品等