文件上传漏洞学习

教程来源:https://blog.csdn.net/qq_43390703/article/details/104858705

https://cloud.tencent.com/developer/article/1938541

引言

什么是文件上传

  • 文件上传就是通过流的方式将文件写到服务器上
  • 文件上传必须以POST提交表单
  • 表单中需要 <input type="file" name="upload">

eval — 把字符串作为PHP代码执行

什么是文件上传漏洞

文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向什么是文件上传漏洞

文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。

“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。

原因:

  • 对于上传文件的后缀名(扩展名)没有做较为严格的限制
  • 对于上传文件的MIMETYPE(指文件中包含的数据类型,由其扩展名来识别。) 没有做检查
  • 权限上没有对于上传的文件目录设置不可执行权限,(尤其是对于shebang类型的文件)
  • 对于web server对于上传文件或者指定目录的行为没有做限制

原理

文件上传漏洞是指用户通过界面上的上传功能上传了一个可执行的脚本文件,而WEB端的系统并未对其进行检测或者检测的逻辑做的不够好。

通过来说文件上传功能是没有问题的,主要是服务器如何对上传的文件如何进行处理。

若WEB未对用户上传的文件进行有效的审查,若存在恶意用户对其上传一句话木马,从而实现控制WEB网站的目的。

文件上传后导致的常见安全问题一般有:

  • 上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行;

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

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

产生原因

  • 对于上传文件的后缀名(扩展名)没有做较为严格的限制
  • 对于上传文件的MIMETYPE(指文件中包含的数据类型,由其扩展名来识别。) 没有做检查
  • 权限上没有对于上传的文件目录设置不可执行权限,(尤其是对于shebang类型的文件)
  • 对于web server对于上传文件或者指定目录的行为没有做限制

文件上传漏洞高危触发点

  • 相册
  • 头像上传
  • 视频
  • 照片分享
  • 附件上传(论坛发帖、邮箱)
  • 文件管理器

任何存在文件上传功能的地方都有可能存在文件上传漏洞,比如相册、头像上传,视频、照片分享。
论坛发帖和邮箱等可以上传附件的地方也是上传漏洞的高危地带。
另外像文件管理器这样的功能也有可能被攻击者所利用。

值得注意的是,如果移动端也存在类似的操作的话,那么相同的原理,也存在文件上传漏洞的风险。

一句话木马

1
<?php eval($_POST['a']) ?>

其中eval就是执行命令的函数,**$_POST[‘a’]**就是接收的数据。eval函数把接收的数据当作PHP代码来执行。这样我们就能够让插入了一句话木马的网站执行我们传递过去的任意PHP语句。这便是一句话木马的强大之处。

除此之外我们还有很多的一句话木马,且不同语言后端的一句话木马也会不同

文件上传漏洞类型

前端验证:文件头检查

​ MIME绕过:

​ %00绕过

​ 空格绕过

​ 点绕过

​ 双写绕过

​ 大小写绕过

​ .htaccess

前端检测

通过javascript进行检测,是非常容易绕过的

原理

原理:Web应用系统校验是通过前端javascript代码完成的。可以对前端javascript进行修改或者是通过抓包软件篡改上传的文件,就会导致基于js的校验很容易被绕过。

判断js验证方式

前端验证通过以后,表单成功提交后会通过浏览器发出─条网络请求,但是如果前端验证不成功,则不会发出这项网络请求;可以在浏览器的网络元素(F12 elements)中查看是否发出了网络请求。

绕过方法

  • 删除或者禁用js:火狐浏览器-->about:config(地址栏输入)-->JavaScriptenable-false (ajax)

    直接删除代码中onsubmit事件中关于文件上传时验证上传文件的相关代码即可,或者可以不加载所有js,还可以将html源码copy一份到本地,然后对相应代码进行修改,本地提交即可。

  • 使用代理上传文件,Burp Suite;上传符合要求的文件类型,抓包修改文件类型。

onsubmit 事件在表单提交时触发。

表单是一个用来收集用户输入数据的界面元素。它通常包含各种类型的字段,例如文本框、复选框、下拉菜单等,用户可以在这些字段中填写信息。提交表单后,用户输入的数据将被发送到服务器进行处理或存储。表单在网页设计中经常用于收集用户信息、进行用户注册、提交订单等操作。

后端检测_后缀名检测漏洞

原理

通常是针对文件的扩展名后缀进行检测,主要是通过黑白名单进行过滤检测,如果不符全过滤规则则不允许上传。

如上文中php文件上传类似方法

黑名单

黑名单检测:一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件。

绕过方法

解析漏洞(后面会有稍微点的具体解释)

  • .htaccess文件解析漏洞- apache解析漏洞

  • IIS7.0 | IIS7.5 | Nginx的解析漏洞

  • IIS6.0解析漏洞

截断上传

  • 截断类型:PHP%00截断

  • 截断原理:由于00代表结束符,所以会把00后面的所有字符都截断(%00为url编码后的结束标志)

  • 截断条件:PHP版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态

    magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误

    在magic_quotes_gpc=On的情况下,如果输入的数据有

    单引号(’)、双引号(”)、反斜线()与 NUL(NULL 字符)等字符都会被加上反斜线。

大小写绕过

比如:aSppHp之类。

黑名单扩展名的漏网之鱼

比如: asacer之类 asp: asa cer aspx jsp: jspx jspf php: php php3 php4 php5 phtml pht exe: exee

利用Windows的命名机制

shell.php. shell.php空格 shell.php:1.jpg shell. php::$DATA shell.php:1.jpg 在windows中,后缀名后面的点和空格都会被删除掉。

双写绕过

有时候在检测时,后台会把敏感字符替换成空格,这个时候,我们可以使用双写进行绕过。比如:pphphp

白名单

原理

白名单检测:一般有个专门的 whitelist 文件,里面会包含的正常可使用的文件:Jpg png GIF

绕过方法

解析漏洞

  • .htaccess文件解析漏洞
  • apache解析漏洞
  • IIS7.0 | IIS7.5 | Nginx的解析漏洞
  • IIS6.0解析漏洞

截断上传

  • 截断类型:PHP%00截断
  • 截断原理:由于00代表结束符,所以会把00后面的所有字符都截断
  • 截断条件:PHP版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态

后端检测_00截断

虽然web应用做了校验,但是由于文件上传后的路径用户可以控制,攻击者可以利用手动添加字符串标识符0X00的方式来将后面的拼接的内容进行截断,导致后面的内容无效,而且后面的内容又可以帮助我们绕过黑白名单的检测。

0x为十六进制标志

ASCII对照表第一个就空字符(表示字符串的结束),它对应的16进制是00,这里我们就可以用16进制的00来代替空字符,让它截断后面的内容。

使用burpsuite进行抓包,因为这里是通过URL进行传递的文件上传后存储路径,所以需要对16进制00进行URL编码,编码的结果就是**%00**,通过这种方式,就可以%00截断后面的内容,让拼接的文件名不再进行生效

后端检测_MIME检测

MIME

MIME(Multipurpose Internet Mail Extensions)是一种互联网标准,用于标识和描述各种类型的数据。它最初是为电子邮件系统设计的,用于标识邮件中附加的各种类型的数据。随后,MIME也被广泛应用在Web通信中,用于描述传输的数据类型和格式。

常见的MIME类型:

Content-Type:

text/plain (纯文本)

text/html (HTML文档)

text/javascript (js代码)

application/xhtml+xml (XHTML文档)

image/gif (GIF图像)

image/jpeg (JPEG图像)

image/png (PNG图像)

video/mpeg (MPEG动画)

application/octet-stream (二进制数据)

application/pdf (PDF文档)

检测方式

在文件上传过程中,服务端会针对我们的上传的文件生成一个**数组(PHP 的全局数组 $_FILES)**,这个数组其中有一项就是这个文件的类型file_type;服务端对文件进行检测时,就是通过检测脚本中的黑白名单和这个数组中的file_type进行对比,如果符合要求就允许上传这个文件。

MIME绕过的原理:

    部分Web应用系统判定文件类型是通过content-type字段,黑客可以通过抓包,将content-type字段改为常见的图片类型,如image/gif,从而绕过校验。

后端检测_文件头检测漏洞

漏洞原理

    一般文件内容验证使用getimagesize函数检测,会判断文件是否是一个有效的文件图片,如果是,则允许上传,否则的话不允许上传。 本实验就是将一句话木马插入到一个[合法]的图片文件当中,然后用webshell管理工具进行远程连接。

图片马制作

准备一张图片,这里为a.png,和一个一句话木马a.php,通过以下命令合成一个图片马3.php

a.php内容:

命令:copy a.png/b+a.php/a 3.php

/b:指定以二进制格式复制、合并文件,用于图像或者声音类文件

/a:指定以ascii格式复制、合并文件用于txt等文本类文件

这条命令的意思是:通过copy命令,把a.png图片文件,以二进制文件形式添加到a.php文件中,以ASCII文本文件形式输出为3.php文件。

解析图片马

一般解析图片马需要结合解析漏洞或者文件包含才能解析图片马;

解析漏洞

.htaccess文件解析漏洞

前提

web具体应用没有禁止.htaccess文件的上传,同时web服务器提供商允许用户上传自定义的.htaccess文件

原理

.htaccess文件(或者"分布式配置文件") ,全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法,即,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。

文件内容

解析规则的增加,是可以按照组合的方式去做

1
2
3
<FilesMatch "evil.gif"> SetHandler application/x-httpd-php   #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行 
AddHandler php5-script .gif
#在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行 </FilesMatch>

SetHandler指令,可以为特定文件或目录指定处理程序,告诉服务器如何处理这些请求。

application/x-httpd-php是PHP解释器的处理程序类型。服务器会将请求发送给PHP解释器来执行,解释器会解析PHP代码并生成相应的输出。

AddHandler 指令将所有扩展名为 .gif 的文件都解析为 PHP 脚本。


以上是本人使用过的所有方式,下面内容未曾试验过


Apache解析漏洞

原理

Apache 解析文件的规则是从右到左开始判断解析,如果后缀名不可识别文件解析,就再往左判断。比如test.php.a.b的“.a”和“.b”这两种后缀是apache不可识别解析,apache就会把test.php.a.b解析成test.php

( apache 1.x apache 2.2.x这俩版本有影响)

IIS6.0解析漏洞

IIS6.0解析漏洞分两种: 1、目录解析: 以xx.asp命名的文件夹里的文件都将会被当成ASP文件执行。 2、文件解析: xx.asp;.jpg 像这种畸形文件名在;后面的直接被忽略,也就是说当成xx.asp文件执行。

IIS6.0 默认的可执行文件除了asp还包含这三种 .asa .cer .cdx

IIS7.0 | IIS7.5 | Nginx的解析漏洞

原理:

Nginx(Nginx通常被认为是一个相对安全的Web服务器软件)拿到URI/test.jpg/test.php后,一看后缀是.php,便认为该文件是php文件,转交给php去处理。php一看/test.jpg/test.php不存在,便删去最后的/test.php,又看/test.jpg存在,便把/test.jpg当成要执行的文件了,又因为后缀为.jpg,php认为这不是php文件,于是返回Access denied。这其中涉及到php的一个选项:cgi.fix_pathinfo,该值默认为1,表示开启。开启这一选项PHP可以对文件路径进行修理

例子:当php遇到文件路径/1.jpg/2.txt/3.php时,若/1.jpg/2.txt/3.php不存在,则会去掉最后的/3.php,然后判断/1.jpg/2.txt是否存在,若存在,则把/1.jpg/2.txt当做文件/1.jpg/2.txt/3.php,若/1.jpg/2.txt仍不存在,则继续去掉/2.txt,以此类推。

条件竞争漏洞

条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生。

上传文件源代码里没有校验上传的文件,文件直接上传,上传成功后才进行判断:如果文件格式符合要求,则重命名,如果文件格式不符合要求,将文件删除。

由于服务器并发处理(同时)多个请求,假如a用户上传了木马文件,由于代码执行需要时间,在此过程中b用户访问了a用户上传的文件,会有以下三种情况:

1.访问时间点在上传成功之前,没有此文件。

2.访问时间点在刚上传成功但还没有进行判断,该文件存在。

3.访问时间点在判断之后,文件被删除,没有此文件。

二次渲染漏洞

1. 二次渲染原理:

        在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片并放到网站对应的标签进行显示。

2. 绕过:

1、配合文件包含漏洞: 将一句话木马插入到网站二次处理后的图片中,也就是把一句话插入图片在二次渲染后会保留的那部分数据里,确保不会在二次处理时删除掉。这样二次渲染后的图片中就存在了一句话,在配合文件包含漏洞获取webshell。 2、可以配合条件竞争: 这里二次渲染的逻辑存在漏洞,先将文件上传,之后再判断,符合就保存,不符合删除,可利用条件竞争来进行爆破上传

3. 如何判断图片是否进行了二次处理?

    对比要上传图片与上传后的图片大小,使用16进制编辑器打开图片查看上传后保留了哪些数据,查看那些数据被改变。

ctfhub之文件上传

无验证

1.查看题目,这里上传的文件没有限制,直接写一个一句话木马写一个网站后门。方法为在记事本上写上以下的木马,然后改变后缀改为php

上传后获取到文件的存储地址

用蚁剑连接至该地址(url/地址)

连接密码输入hack

后测试连接

连接成功后添加,就可以查看到flag了

前端验证

查看源码发现有JavaScript验证

火狐浏览器的JavaScript的功能给禁止了

在火狐url框中输入about:config

把javascript enabled关闭

然后就和上题做法一样了

.htaccess

1.这里先了解一下什么是.htacces文件

.htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。

概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

简单来说,就是我上传了一个.htaccess文件到服务器,那么服务器之后就会将特定格式的文件以php格式解析。

这里先写一个.htaaccess文件

方法一

SetHandler application/x-httpd-php //所有的文件当做php文件来解析

方法二

AddType application/x-httpd-php .png //.png文件当作php文件解析

这里修改名字为.htaccess。直接这个就好,不要加前缀。

这里再写个木马。

用上面那个木马就ok,但后缀有png。

1.上传.htaccess文件

2.接着上传木马

然后就可以用蚁剑连接了

MIME绕过

MIME类型校验就是我们在上传文件到服务端的时候,服务端会对客户端也就是我们上传的文件的Content-Type类型进行检测,如果是白名单所允许的,则可以正常上传,否则上传失败。

先上传一个小马,然后用bp抓包

直接修改Content-Type为image/jpeg

然后intercept off (bp关闭拦截)

发现文件上传成功

然后接下来步骤与以上一样

00截断

先上传一个含木马的jpg文件——111.jpg,抓包后在url处添加111.php%00

绕过对php后缀的检测,这样我们写的php木马就会被放在php文件中正常运行

剩余步骤一样

但是我们复制的url中有显示(多层目录)

http://challenge-9681de2035f1bdde.sandbox.ctfhub.com:10800/var/www/html/upload/111.php

等绝对路径

我们只需要使用

http://challenge-9681de2035f1bdde.sandbox.ctfhub.com:10800/upload/111.php

相对路径即可

双写后缀

查看源码

1
2
3
$name = basename($_FILES['file']['name']);
$blacklist = array("php", "php5", "php4", "php3", "phtml", "pht", "jsp", "jspa", "jspx", "jsw", "jsv", "jspf", "jtml", "asp", "aspx", "asa", "asax", "ascx", "ashx", "asmx", "cer", "swf", "htaccess", "ini");
$name = str_ireplace($blacklist, "", $name);

黑名单中的字样被换作空字符

故而抓包后双写后缀

文件头检查

这里先用自己电脑自带的画图软件画一张画,直接上传抓包。上传后在抓的包里写入一句话木马。

这里修改后缀为php,然后在Content-type改为 image/png

上传成功,连接蚁剑

图片马失败了,为什么?