文件上传漏洞总结
文件上传漏洞
记录时间 2022/02/09
IIS 5.x/6.0 解析漏洞
Nginx 解析漏洞
在低版本的Nginx中存在一个由 PHP-CGI
导致的文件解析漏洞。
在PHP的配置文件中有一个关键选项cgi.fix_pathinfo
在本机中位于php.ini
配置文件中,默认开启。
当URL中有不存在的文件时,PHP就会默认向前解析。
漏洞利用流程:
-
访问 www.xx.com/phpinfo.jpg/1.php
(1.php不存在)。
-
会按照php的格式解析
phpinfo.jpg
。
Apache 1.x/2.x 解析漏洞
Apache从右至左开始判断后缀,跳过非识别后缀,直到找到可以识别的后缀为止📍,然后利用识别到的后缀进行解析。
漏洞利用流程:
- 上传
shell.php.test
; - 访问
shell.php.test
,服务器就会按照php格式解析shell.php.test
文件(test后缀无法识别,因此第一个可识别后缀为php)
前端验证绕过
条件:网站或CMS仅在前端使用JavaScript来校验。
漏洞利用流程:
- 通过Burp Suite抓包,修改内容后放行。
- 通过Chrome禁止/删除js代码。
利用BWAPP
靶场进行复现:
针对页面进行元素检查,并删除对应js代码以达到前端验证绕过的效果:
.htaccess绕过
什么是.htaccess
?
.htaccess
文件(分布式配置文件)提供了一种方式,使得配置文件可以随文件夹不同而不同,其所放置的文件夹及所有子文件夹都会受此影响,其语法同apache
主配置文件。
它提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。
作为用户,所能使用的命令受到限制。
管理员可以通过Apache的AllowOverride指令来设置。
.htaccess文件是用于apache服务器下的控制文件访问的配置文件,因此Nginx下是不会生效的
.htaccess可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档、文件的跳转等功能。
如何利用.htaccess
?
场景:启用了.htaccess
文件的网站,使用此文件类型来绕过限制较为全面的黑名单过滤。
思考🤔:
-
为什么不能绕过限制较全面的白名单过滤?
白名单限制了哪些文件可以上传,因此没办法进行文件类型的绕过。
-
如何实操来绕过黑名单过滤?
- 上传一个
.htaccess
文件,文件内容设置为【AddType application/x-httpd-php .test】。 - 上传一句话木马,文件名设置为
shell.test
。 - 访问
shell.test
即可执行一句话木马。
- 上传一个
大小写绕过
这是一种比较简单的绕过方式,针对黑名单策略。
上传php的一句话木马,上传一个pHp即可。
思考🤔:
-
php等同于pHp吗?
不等同。
-
为什么可以解析呢?
跟web server的配置有关,Windows平台文件后缀名大小写不敏感,因此可以采用该方式进行绕过;Linux平台文件后缀名大小写敏感,因此不可以采用该方式绕过。
图中为Kali操作系统。
关于Linux+Apache服务器URL区分大小写问题
Linux服务器的大小写敏感有时候很不方便,在地址栏里一定要输入准确的URL才能访问,对搜索引擎和用户不是很友好,那么如何解决LINUX服务器URL的大小写问题,今天同步碰到一个问题,在浏览器地址栏中输入URL地址时,必须要区分大小写才能正常访问页面,网站服务器是Linux+Apache,造成此现象主要原因是缺少speling
模块,因此只要在相应的系统里加载就可以了。(来源网络)
进阶姿势
Windows文件流特性绕过
文件流只适用于Windows环境下,比如站点禁止上传扩展名为.php的文件,那我们通过文件流的方式,将文件的扩展名修改为.php::$DATA,就可以成功绕过过滤,而对于windows系统来说这就是一个普通的文件,依旧会被作为php文件解析
什么是Windows文件流?
NTFS
文件系统实现了多文件流特性,NTFS
环境一个文件默认使用的是未命名的文件流,同时可创建其他命名的文件流,Windows资源管理器默认不显示出文件的命名文件流,这些命名的文件流在功能上和默认使用的未命名文件流一致,甚至可以用来启动程序。
测试:
echo 111 > test.txt:111.txt;
echo test > test.txt;
echo 222 > test.txt::$data;
注:一定在cmd
中执行,powershell
中执行会有问题
-
桌面生成了一个
test.txt
文件,但文件为空 -
桌面无变化,
test.txt
文件不再是0字节并且内容成功写入
-
test.txt
文件内容已经被修改
由此说明,平时我们新建文件并修改是通过默认文件流$data
写入的,同时我们也可以自己指定文件流进行写入操作。可以利用操作数据流来进行文件后缀检测的bypass。
截断绕过
%00截断是和php版本有关联型的,是5.2.x版本的一个漏洞,php5.3.24代码中已经修复,修复的代码位于ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER函数的开始处
一种利用编码的绕过方式,更多被应用于绕过白名单策略的防御。
例
关键代码解析:
$file_ext = substr($_FILES['upload_file']['name'], strrpos($_FILES['upload_file']['name'],'.')+1); //将.后的文件后缀名取出来
if (in_array( $file_ext, $ext_arr )) {
$temp_file = $_FILES['upload_file']['tmp_name']; //创立临时文件
$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis")."."$file_ext; //post方式传入文件保存路径,文件名是基于时间的随机文件名
}
后面采用保存文件的时候,是路径拼接的形式,而路径又是从前端获取,所以我们可以采用在路径上截断。(两个可控输入点)
strrpos() 函数查找字符串在另一字符串中最后一次出现的位置(区分大小写)
漏洞利用流程:
- 设置
save_path=../upload/a.php%00
- 上传一句话JPG图片马
文件头检测绕过
png
文件头:89 50 4E 0D
jpg
文件头:FF D8 FF DB
gif
文件头:47 49 46 38
因为存在一个对文件头的检测,因此我们可以采用将payload
附着在目标文件末尾的方式来绕过对于文件头的检测。
条件竞争
总结
源码审计
源码审计方向看文件上传漏洞
Fuzz
利用Burp Suite
中的Intruder
模块,进行fuzz:
- 选择fuzz的位置;
- 准备payload;
- 准备fuzz用的字典。
防御措施
- 文件类型检测:
白名单
优于黑名单
- 使用安全的函数进行编程
- 熟悉业务环境的OS、Web Server 配置
- 遵守安全开发规范,使用安全的配置选项
记录时间 2022/2/27
本文来自博客园,作者:sherlson,转载请注明原文链接:https://www.cnblogs.com/sherlson/articles/15941677.html