WEB通用漏洞-文件上传
WEB通用漏洞-文件上传
阅读须知
建议配合本博客的CTFSHOW-文件上传系列进行阅读。
前置知识
后门代码需要用特定格式后缀解析,不能以图片后缀解析脚本后门代码(解析漏洞除外)
如:jpg图片里面有php后门代码,不能被触发,所以连接不上后门
如果是图片后缀解析脚本代码,一般会利用:文件包含漏洞、中间件解析漏洞、.user.ini和htaccess
目的
我们通过文件上传漏洞,将后门程序上传到服务器上,通过连接此后门程序,得到shell(webshell)。
产生的地方?
- 代码本身
- 第三方插件(编辑器)/框架
- 中间件
测试思路
- 看中间件本身是否存在解析漏洞
- 看文件上传功能由谁实现?
- 编辑器:直接到网上寻找该编辑器是否出现过安全漏洞,以便于进一步处理。
- 自己实现:有源码就白盒测试,看代码逻辑,抓包测试。没有源码就黑盒测试。
黑盒/白盒测试思路
黑盒:寻找一切存在文件上传的功能应用
- 个人用户中心是否存在文件上传功能?
- 后台管理系统是否存在文件上传功能?
- 字典目录扫描探针文件上传构造地址
- 有些网站的文件上传功能都会写在一个脚本文件中。例如:upload.php,因此,如果你可以扫描网站目录,探针到这个文件,进行进一步分析也是可以的。
- 字典目录扫描探针编辑器目录构造地址
- 有些网站会使用第三方的编辑器来实现文件上传功能,编辑器一般都会放到网站的目录下,因此,如果你可以扫描目录,探针到这个编辑器所在位置的话,也是可以进一步分析的。
白盒:看三点=>中间件、编辑器、功能代码
- 中间件直接看语言环境常见搭配
- 编辑器直接看目录架构或搜索关键字
- 功能代码直接看源码应用或搜索关键字
检测(从代码本身角度看待文件上传漏洞)
检测层面
- 前端
- 将检测代码写到前端,用户可以直接看到源代码。易于绕过。换句话说,用户可以直接更改前端代码的逻辑,来完成绕过。因此,检测代码写到前端不可靠。
- 后端
- 将检测代码写到服务器,用户无法直接看到源代码。相比前端,不易于绕过。用户需要发包,将文件发送到服务端,服务端再去做检测,是否允许文件上传。
检测内容(最常用)
对于所上传的文件,通常都根据如下内容判断是否允许上传:
- 检查文件头(标识是否是该类文件)
- 我们可以用记事本打开电脑中的任何GIF文件,发现每一个GIF文件上都会有一个GIF89a这样的标识,这个标识就是文件头。那也就是说,只要文件内容中含有GIF89a这样的文件头,都会被认为是GIF文件。对于其他文件也是同理。
- 在验证文件上传时,就可以检测内容中是否包含这个文件头,来判断是否允许该类文件上传。
- 检查完整性
- 检测文件后缀
- 二次渲染(重点)
- https://blog.csdn.net/qq_40800734/article/details/105920149
- 为什么要有二次渲染?这里以图片举例,当你在网站中上传图片后,该网站为了使图片更加美观、调整大小、调整分辨率等,都会对文件进行二次渲染。当你对上传之后的文件进行下载时,你会发现下载之后的图片跟原图片内容不同了。
- 如果我们将后门代码写到图片中,进行上传的话,网站很有可能进行二次渲染,将图片中的内容进行更改,进而可能导致后门代码被删除。
- 如何判断进行了二次渲染?
- 判断上传前和上传后的文件大小及内容。
- 判断上传后的文件返回数据包内容。
检测文件后缀
在检测文件后缀这一方面,通常都会设置黑名单和白名单验证。
- 黑名单验证:设置一个黑名单,只要你上传的文件符合黑名单的要求,那么不允许上传。
- 白名单验证:设置一个白名单,只要你上传的文件符合白名单的要求,那么就允许上传。
- MIME验证:对于数据包上的Content-Type字段进行验证。允许符合要求的文件类型进行上传。(如果后端进行文件检测时,使用的是MIME验证,那么攻击者可以通过更改Content-Type字段来进行绕过)
- MIME:https://blog.csdn.net/weixin_52796034/article/details/132458710
绕过
%00截断
多后缀解析
一篇文章:https://blog.csdn.net/qq_51398553/article/details/131233623
假设服务器存在多后缀解析漏洞,只要文件中含有.php关键字,都会被当做php文件执行。网站只允许上传.jpg格式文件。
在文件上传的时候,假设你要上传一个shell.php的后门,如果你将shell.php改为shell.php.jpg的话。那么这个文件会被允许上传,当你访问这个文件时,又会被当作php文件执行,进而导致后门触发。
中间件特性
在文件上传的时候,假设你要上传一个.php的后门,如果你将.php改为.Php。那么,对于某些中间件来讲,这种文件仍可以正常解析。但是,对于另外一些中间件来讲,这种文件就不能正常解析了。
由于中间件的不同,对于某些情况的处理也不尽相同,因此要根据不同的中间件具体问题具体分析。
配置文件绕过(不同语言情况不同)
php => .user.ini
PHP用户配置文件(.user.ini)是一个特殊的配置文件,它允许开发人员在没有修改全局PHP配置的情况下,对PHP的行为进行个性化设置。
我们可以通过修改这个文件,来达到文件上传绕过的效果。具体可以参考如下文章:
https://blog.csdn.net/HAI_WD/article/details/132499163
注:.user.ini文件的使用需要有一个重要条件:.user.ini文件的目录下,需要有一个index.php文件(内容无所谓)。如果没有,这个文件失效。
apache => htaccess
htaccess默认不支持nginx,设置后支持。
htaccess可以通过设置实现文件解析配置。如:
将.png后缀的文件解析成php
AddType application/x-httpd-php .png
将.png后缀的文件解析成php
短标签绕过(需要与.user.ini文件配合)
<? echo '123'?> //前提需要在.user.ini文件中开启配置参数short_open_tags=on
<?=表达式?> //不需要开启参数设置
<% echo '123'%> // 前提不是开启配置参数asp_tags=on
<script language='php'>echo '1'</script> //需要开启参数设置
日志绕过(需要与.user.ini文件配合)
当客户端访问服务器时,服务器通常都会将访问的记录,记录在日志文件中。
因此,我们可以考虑在发送数据包时,在数据包中的特定字段(UA头)写入后门代码,访问服务器。服务器一般都会将特定的字段(UA头)记录到对应的日志。然后再通过php文件(也有可能是其他文件)包含(include语句)这个日志,在.user.ini文件中进行对应的配置(auto_prepend_file)。之后,访问首页时,就会将日志里面的后门代码执行。(加载.user.ini文件,执行上传的php文件->执行php文件,包含日志文件->执行日志文件,导致后门执行)
日志文件的路径以及日志文件记录的内容,一般都是根据不同中间件来决定。因此需要具体问题具体分析。
远程文件包含绕过(需要与.user.ini文件配合)
攻击者将后门写到远程服务器的文件中。再通过上传的php文件(也有可能是其他文件)包含这个远程文件。接下来在.user.ini文件中进行对应的配置(auto_prepend_file=上传的php文件)。之后,访问首页时,就会将远程文件中的后门代码执行。(加载.user.ini文件,执行上传的php文件->执行php文件,包含远程文件->后门执行)
注:无论是远程文件包含还是日志文件包含,如果在目标服务器上无法直接写后门的话,那么可以在其他服务器上写后门,从而达到远程包含执行的效果。
zip文件绕过
攻击者可以上传zip文件,在zip文件中写入后门(抓包写入),然后再通过文件包含或.user.ini文件来执行这个zip文件,从而触发后门。
条件竞争(线程安全问题)
一篇文章:https://blog.csdn.net/qq_48904485/article/details/123642632
条件竞争漏洞,说白了就是多个线程并发执行访问共享变量/文件时,由于没有设置锁,导致多个线程访问共享变量时,造成了数据不一致的问题(产生意想不到的结果)。
二次渲染绕过(重点)
由于二次渲染,可能会导致上传之前的文件和上传之后的文件内容不同。因此,我们可以采用如下方式进行绕过:
- 人工绕过:我们可以对比这两个文件的内容(工具:c32asm),如果有相同的部分,代表这一部分是不会进行二次渲染的。因此,攻击者可以将后门写到公共部分。
- 代码绕过:通过脚本绕过。具体脚本可以到网上找。
- 注:这种绕过方式由于环境不同,加之也不知道后端进行二次渲染的逻辑,因此这种方式可能不成功(建议尝试多次)
构造免杀后门
有些网站在上传文件时会查看文件的内容,如果文件的内容中存在敏感函数(eval()、system()等),那么就会将该文件删除。(目的:为了防止后门)(根据:存在eval、system关键字)
因此,我们可以通过php的字符串连接符号,来截断关键字,从而达到免杀的效果。
system => syste.m
eval => e.val
...
关于免杀后门既可以手工编写,也可以通过工具编写(推荐)。
中间件解析漏洞(从搭建平台角度看待文件上传漏洞)
中间件解析漏洞会导致非指定格式的文件执行了指定格式文件的代码。
例如:png里面写了php代码,正常来讲访问这个png,是不允许执行php代码的。但是,如果出现了中间件解析漏洞,那么就会导致png按照php方式执行(把png当作php文件解析)。
中间件解析漏洞使得:即使你的文件上传代码验证非常严密,也会因为非正常解析出现文件上传的问题。
IIS
- IIS常见漏洞:https://blog.csdn.net/qq_56438857/article/details/126391755
- IIS解析漏洞的条件:
- 上传文件能不能修改上传目录名或上传的文件名能修改命名。
Apache
- Apache httpd 换行解析漏洞
- 复现地址:
- Apache httpd 未知后缀解析漏洞
- 复现地址:
Nginx
- Nginx 文件名逻辑漏洞
- Nginx 解析漏洞
编辑器安全(从第三方插件角度看待文件上传漏洞)(了解)
有些网站为了扩展自身的功能,常常使用第三方插件。如:有些网站没有编辑器的功能,因此使用第三方的编辑器来完善功能。
编辑器常常用来实现文件上传的功能,因此如果第三方编辑器本身出现了文件上传漏洞,那么即使你的网站代码本身没有漏洞,中间件也没有漏洞,也会因为第三方编辑器受到危害。
因此,在进行漏洞测试时,除了关注代码本身逻辑和中间件的安全问题之外,还要关注编辑器本身的安全问题。
常用的第三方编辑器:Ueditor、fckeditor、kindeditor、ewebeditor
致谢
https://www.bilibili.com/video/BV1pQ4y1s7kH/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click
免责声明
本博客中的内容仅供学习之用,不用于商业用途,也不可以用于任何非法用途,否则后果自负,本人不承担任何责任!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战