什么是文件上传漏洞
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。"文件上传" 本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
这种攻击方式是最为直接和有效的,所以我们需要思考的是如何绕过检测和过滤。
漏洞危害
上传文件是web脚本语言,服务器的web容器解释并执行了用户上传的脚本,导致代码执行。
上传文件是病毒或者木马时,主要用于诱骗用户或者管理员下载执行或者直接 自劢运行
上传文件是Flash的策略文件 crossdomain.xml,黑客用以控制Flash在该域 下的行为(其他通过类似方式控制策略文件的情况类似);
上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行;
上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
除此之外,还有一些不常见的利用方法,比如将上传文件作为一个入口,溢 出服务器的后台处理程序,如图片解析模块;或者上传一个合法的文本文件,其内容包含了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了