文件上传漏洞原理学习

什么是文件上传漏洞

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

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

漏洞危害

  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了

相关推荐
Linux编程用C20 分钟前
rust编程学习(二):复合数据类型
开发语言·学习·rust
非凡ghost29 分钟前
MJ PDF汉化版:功能强大,阅读无忧
学习·智能手机·pdf·软件需求
LVerrrr1 小时前
Missashe考研日记-day21
学习·考研
RxnNing1 小时前
http、https、TLS、证书原理理解,对称加密到非对称加密问题,以及对应的大致流程
前端·网络协议·学习·http·https·typescript
小昭dedug1 小时前
什么是车规级MCU?STM32也能上车规级场景?
安全
Andy3222 小时前
027 期 数据安全新招!你的数据守护神来了?
安全·github
阿图灵2 小时前
文章记单词 | 第34篇(六级)
学习·学习方法
小王努力学编程3 小时前
贪心算法学习C++
开发语言·c++·学习·算法·leetcode·贪心算法
Pasregret3 小时前
07-云原生安全深度剖析:从 Kubernetes 集群防护到微服务安全加固
安全·云原生·kubernetes
-曾牛3 小时前
Git完全指南:从入门到精通版本控制 ------- Git 工作区、暂存区和版本库(4)
java·git·学习·个人开发