文件上传漏洞原理学习

什么是文件上传漏洞

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。"文件上传" 本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。

这种攻击方式是最为直接和有效的,所以我们需要思考的是如何绕过检测和过滤。

漏洞危害

  1. 上传文件是web脚本语言,服务器的web容器解释并执行了用户上传的脚本,导致代码执行。

  2. 上传文件是病毒或者木马时,主要用于诱骗用户或者管理员下载执行或者直接 自劢运行

  3. 上传文件是Flash的策略文件 crossdomain.xml,黑客用以控制Flash在该域 下的行为(其他通过类似方式控制策略文件的情况类似);

  4. 上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行;

  5. 上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。

  6. 除此之外,还有一些不常见的利用方法,比如将上传文件作为一个入口,溢 出服务器的后台处理程序,如图片解析模块;或者上传一个合法的文本文件,其内容包含了PHP脚本,再通过"本地文件包含漏洞(Local File Include)"执行此脚本。

要求条件

上传的后门文件,需要能被脚本语言解析执行。

说明一:对方服务器运行的PHP环境,你不能上传一个JAVA的后门代码。

说明二:你上传文件的目录可以被脚本语言解析执行,如果你上传的目录没有执行权限也不行

说明三:一般文件上传后会返回你一个地址,如果无妨链接到也不能构成文件上传漏洞。

还有例外情况,非脚本文件也能被成功解析。比如:上传了一个图片🐎,如果对方中间件上存在一些漏洞的话,配合这些漏洞可以实现图片文件按照脚本文件解析。

方法(以upload-labs为例)

在ctf比赛中,一般都是围绕一句话木马实现文件上传漏洞的

那什么是一句话木马?

通常,一句话木马后缀为.php,因为文件上传漏洞通常用于web中,而php是web能够识别的语言(主要是能被对方服务器识别的语言后缀)

其内容是

php 复制代码
 <?php eval($_POST['cmd']);?>

现在来解释一下这个一句话木马,这里的<?php和末尾的?>是php语言的标志,用来声明这是个php语言,而括起来的内容就是php代码。

eval是php中的一个内置函数里面的内容会被当成命令执行。

而$_POST['cmd']是通过post传参的方式获取一个名为cmd的参数。

所以如果这个上传的文件被解析,那我们就可以访问这个文件的位置,并通过post传参执行命令。(就像web的命令执行一样),从而访问,修改服务器中的目录文件。

1,Less-1 前端验证

我们直接上传一个一句话木马试一下

这里直接跳出一个弹窗,并显示只能上传的文件类型。

那这大概率是前端验证,因为web中的弹窗通常是通过JavaScript实现

通过看查源代码我们也可以证实

不过这种检查通常都是本地上传时检查,而在上传过程和后端不会检查,所以这种其实没什么用。

我们有两种方法绕过这种验证

1,直接禁用JavaScript

禁用JavaScript后,这串代码就不能生效了

打开开发者工具台,直接禁用

然后再上传文件,会发现上传成功,然后就可以用蚁剑连接进入后台了 2,抓包

先上传一个满足后缀的名字通过JavaScript检查,然后抓包修改后缀

2,Less-2 MIME检查

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。

就是会检查文件类型,单纯的后缀绕过不行了

直接上传php

我们抓包,将文件类型改为符合的格式 然后就上传成功了

3,Less-3 后缀绕过

看源码,可以看到对文件后缀名的操作

同时这里是用黑名单的形式进行过滤,所以我们可以用黑名单以外的方法绕过

又因为这里会将文件后缀统一转换为小写,所以大小写绕过不合适了

但我们任然可以用phtml

.phtml 是一种常见的文件扩展名,通常用于表示包含 PHP 代码的 HTML 文件。它是 PHP 和 HTML 结合的产物,通常用于在网页中嵌入动态内容。

还可以用php加上对应的php版本,比如php5,php6,php7进行绕过

将后缀改为phtml就可以上传了

然后再用蚁剑连接就可以了

4,Less-4 .htaccess

先看黑名单内容

可以看到过滤了php的大小写绕过,版本绕过,和JavaScript等

但是我们可以用.htaccess强制将某种类型的文件作为php文件识别

问ai可以知道这是用于配置apache服务器的配置文件,将其内容设置为

php 复制代码
AddType application/x-httpd-php .png
.htaccess的文件写法有很多,如果这个不能成功可以网上搜其他的能运行的

这里我没用apache服务器,看能不能识别为php文件

这里先上传了.htaccess配置文件,在上传一个图片马,发现并没有被解析

换成apache服务器后重复上面的操作,访问对应的png文件

这样就能证明上传成功,且被当作了php文件解析

5,Less-5 .user.ini

这关过滤了.htaccess,可以用.user.ini

其中.user.ini的文件内容是

这样当我们执行同目录的其他php脚本就会包含a.jpg中的内容,而文件提示upload中有一个readme.php,我们尝试访问

可以看到我们的一句话代码被包含 但这样是没有包含上的,我们修改一句话木马,再次访问

像这样,没有显示出我们写入的一句话木马才是被成功解析

6,pass-6 大小写绕过后缀名

可以看到,在处理后缀名时没有进行大小写的转换,导致漏洞产生

为什么大写PHP也能被解析?

所以我们上传一句话木马,改名为1.phP

成功上传

7,Less-7 后缀名+空格

先看对后缀名的处理

发现与之前少了删除后缀名中空格的操作,而黑名单操作是将后缀名与里面的字符串整个比较,所以多加一个空格就会被认为是不同的字符串

但这只适用于Windows系统,linux系统在解析文件时不会自带去掉末尾的空格

上传文件用bp抓包,在后缀名末尾增添空格

上传会出现错误

从源码分析应该是成功上传的,但可能因为路径的问题导致上传错误

尝试将php版本降低,成功上传

8,Less-8 后缀名+点绕过

先看对后缀名进行了什么样的操作

可以看到少了去后缀名中的点操作,这样我们就可以在后缀名后加点构成假后缀名,因为截取后缀名是截取最后一个点后的字符串

而我们尝试在Windows系统中在后缀中加点

会发现无法命名,并自动去掉最后一个点

而如果在最后在加上正常后缀名,就会将前面的当作文件名 所以,只要加上一个点就能成功绕过后缀名检查,并上传能执行的一句话木马

牢样子,bp抓包,在后缀名中做点修改

windows会自动将这个点删掉,虽然我们访问的1.php.,但任然可以连接,且后台也是1.php

9,Less-9 附加数据流绕过

看查源码对后缀名的操作,发现少了去除::$DATA

所以即使不知道::$DATA是什么,但只要知道他能帮助绕过黑名单就行了

bp抓包后,在后缀名里面加上::$DATA就可以了

刚刚传上去就被火绒gank了

相关推荐
叶落阁主1 天前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
用户962377954483 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机3 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机3 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954483 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star3 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954483 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher5 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行8 天前
网络安全总结
安全·web安全
西岸行者8 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习