原理
web对用户上传的文件过滤不严,导致被攻击者上传了一些规定之外的可执行文件,脚本等,可以让攻击者获取web服务器控制权限
可能有以下几点:
- 对于上传文件的后缀名(扩展名)没有做较为严格的限制
- 对于上传文件的MIMETYPE(用于描述文件的类型的一种表述方法) 没有做检查
- 权限上没有对于上传的文件目录设置不可执行权限,(尤其是对于shebang类型的文件)
- 对于web server对于上传文件或者指定目录的行为没有做限制
php一句话木马(webshell)
<?php ($_POST['777']$);?>
<?php phpinfo();?>
<?php assert($_REQUEST['cmd'],"acbd");?>
文件上传漏洞的攻击与防御方式
前端限制
在表单中使用onsumbit=checkFile()调用js函数来检查上传文件的扩展名。当用户在客户端选择文件点击上传的时候,客户端还没有向服务器发送任何消息,就对本地文件进行检测来判断是否是可以上传的类型,这种方式称为前台脚本检测扩展名。
绕过
通过浏览器F12很简单的修改文件后缀名就可以完成绕过检查,或者是讲木马修改后缀名后上传,通过改包工具修改上传。如果是JS脚本检测,在本地浏览器客户端禁用JS即可。可使用火狐浏览器的NoScript插件、IE中禁用掉JS等方式实现绕过。
操作
准备一句话木马文件
<?php
($_POST['777']);
?>
修改后缀名上传,bp抓包后再把后缀名修改回.php
检查拓展名
就是在文件被上传到服务端的时候,对于文件名的扩展名进行检查,如果不合法,则拒绝这次上传
在检查扩展名是否合法的时候,有两种策略:黑名单和白名单
原理就是当浏览器将文件提交到服务器端的时候,服务器端会根据设定的黑白名单对浏览器提交上来的文件扩展名进行检测,如果上传的文件扩展名不符合黑白名单的限制,则不予上传,否则上传成功。
绕过
在一些Web server中,存在解析漏洞:
1.老版本的IIS6中的目录解析漏洞,如果网站目录中有一个 /.asp/目录,那么此目录下面的一切内容都会被当作asp脚本来解析
2.老版本的IIS6中的分号漏洞:IIS在解析文件名的时候可能将分号后面的内容丢弃,那么我们可以在上传的时候给后面加入分号内容来避免黑名单过滤,如 a.asp;jpg
3.旧版Windows Server中存在空格和dot漏洞类似于 a.php. 和 a.php[空格] 这样的文件名存储后会被windows去掉点和空格,从而使得加上这两个东西可以突破过滤,成功上传,并且被当作php代码来执行
4.nginx(0.5.x, 0.6.x, 0.7 <= 0.7.65, 0.8 <= 0.8.37)空字节漏洞 xxx.jpg%00.php 这样的文件名会被解析为php代码运行(fastcgi会把这个文件当php看,不受空字节影响,但是检查文件后缀的那个功能会把空字节后面的东西抛弃,所以识别为jpg)
5.apache1.x,2.x的解析漏洞,上传如a.php.rar a.php.gif 类型的文件名,可以避免对于php文件的过滤机制,但是由于apache在解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,rar等扩展名是apache不能识别的,因此就会直接将类型识别为php,从而达到了注入php代码的目的
检查Content-Type
HTTP协议规定了上传资源的时候在Header中加上一项文件的MIMETYPE,来识别文件类型,这个动作是由浏览器完成的,服务端可以检查此类型不过这仍然是不安全的,因为HTTP header可以被发出者或者中间人任意的修改。
常见的文件后缀类型
TXT:纯文本文件,不格式化。
DOC:Word文档。 此格式已过时,因为它属于Office的旧版本。
DOCX:Word文档的默认格式。 此格式不允许宏运行。
DOCM:与DOCX相同,但启用了宏。
ODT:OpenDocument格式的文本文档,非常适合与LibreOffice等替代套件一起使用。
PDF:Adobe Acrobat格式。 保护样式并避免修改。
RTF:RTF格式,非常适合在不同操作系统之间共享。
CSV:开放格式,以表格的形式表示任何类型的数据。
XLS:Excel文档。 此格式已过时,因为它属于Office的旧版本。
XLSX:Excel文档的默认格式。 此格式不允许宏运行。
XLSM:与XLSX相同,但启用了宏。
ODS:OpenDocument格式的电子表格,非常适合与LibreOffice等替代办公套件一起使用。
PPS:PowerPoint幻灯片放映设置为始终在演示文稿模式下打开。 此格式已过时,因为它属于Office的旧版本。
PPT:PowerPoint幻灯片放映。 此格式已过时,因为它属于Office的旧版本。
PPSX:PowerPoint默认格式,以演示文稿模式打开文件。 此格式不允许宏运行。
PPTX:PowerPoint默认格式。 此格式不允许宏运行。
PPSM:与PPSX相同,但带有宏。
PPTM:与PPTX相同,但带有宏。
POTX:Microsoft PowerPoint模板。
ODP:用于幻灯片放映的OpenDocument格式,非常适合与LibreOffice等替代办公套件一起使用。
绕过
使用各种各样的工具(如burpsuite)强行篡改Header就可以,将Content-Type: application/php改为其他web程序允许的类型。
文件头检查
利用的是每一个特定类型的文件都会有不太一样的开头或者标志位。
例如
JPEG 图像文件:
文件头通常以 0xFFD8 开始。
PNG 图像文件:
文件头通常以 0x89504E47 开始。
GIF 图像文件:
文件头通常以 “GIF89a” 或 “GIF87a” 开始。
PDF 文档文件:
文件头通常以 “%PDF” 开始。
ZIP 压缩文件:
文件头通常以 “PK” 开始。
Microsoft Word 文档文件:
文件头通常以 “D0CF11E0” 开始。
MP3 音频文件:
文件头通常以 “ID3” 开始。
MPEG 视频文件:
文件头通常以 “00 00 01 BA” 或 “00 00 01 B3” 开始。
绕过
给上传脚本加上相应的幻数头字节就可以,php引擎会将 <?之前的内容当作html文本,不解释而跳过之,后面的代码仍然能够得到执行比如下面:
(一般不限制图片文件格式的时候使用GIF的头比较方便,因为全都是文本可打印字符。)
限制Web Server对特定类型文件的行为
导致文件上传漏洞的根本原因在于服务把用户上传的本应是数据的内容当作了代码,一般而言:用户上传的内容都会被存储到特定的一个文件夹下,比如我们很多人习惯于放在 ./upload/ 下面要防止数据被当作代码执行,我们可以限制web server对于特定文件夹的行为。
大多数服务端软件都可以支持用户对于特定类型文件的行为的自定义,以Apache为例:
在默认情况下,对与 .php文件Apache会当作代码来执行,对于 html,css,js文件,则会直接由HTTP Response交给客户端程序对于一些资源文件,比如txt,doc,rar等等,则也会以文件下载的方式传送的客户端。我们希望用户上传的东西仅仅当作资源和数据而不能当作代码。因此Apache使用服务器程序的接口来进行限制利用 .htaccess 文件机制来对web server行为进行限制。
禁止脚本执行有多种方式可以实现,而且分别有不同的效果:
指定特定扩展名的文件的处理方式,原理是指定Response的Content-Type可以加上如下几行
AddType text/plain .pl .py .php
这种情况下,以上几种脚本文件会被当作纯文本来显示出来,你也可以换成其他的Content-Type
如果要完全禁止特定扩展名的文件被访问,用下面的几行
Options -ExecCGI
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi识别
在这种情况下,以上几种类型的文件被访问的时候,会返回403 Forbidden的错误
强制web服务器对于特定文件类型的处理,与第一条不同的是, 下面的方法直接强行让apache将文件识别为你指定的类型,而第一种是让浏览器符合上面正则的全部被认为是纯文本,也可以继续往里面加入其他类型。
<FilesMatch "\.(php|pl|py|jsp|asp|htm|shtml|sh|cgi)$">
ForceType text/plain
只允许访问特定类型的文件.使得该文件夹里面只有图片扩展名的文件才可以被访问,其他类型都是拒绝访问(白名单策略)。
<Files ^(*.jpeg|*.jpg|*.png|*.gif)>
order deny,allow
deny from all
绕过方法
可以通过 move_uploaded_file 函数把自己写的.htaccess 文件上传,覆盖掉服务器上的文件,来定义文件类型和执行权限如果做到了这一点,将获得相当大的权限。
补充知识htaccess:
.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
二次渲染绕过
在制作图片马的时候往往是在图片后头附件一段php代码,或者是改包发送一个图片马。但是如果使用了二次渲染。我们上传的文件名称会被修改,并且文件末尾段一些冗余的信息(一句话木马)会被删除。所以很明显,我们只需要将我们需要写入的东西塞在图片中间(虽然会使图片损坏,但是我们又不需要图片。。),用winhex或者是010editor等在文件内进行修改即可。
其它方式—绕过
部分程序员的思维不严谨,并使用逻辑不完善的上传文件合法性检测手段,导致可以找到方式绕过其检测方式
后缀名大小写绕过 用于只将小写的脚本后缀名(如php)过滤掉的场合; 例如:将Burpsuite截获的数据包中的文件名【evil.php】改为【evil.Php】
双写后缀名绕过 用于只将文件后缀名过滤掉的场合,例如"php"字符串过滤的; 例如:上传时将Burpsuite截获的数据包中文件名【evil.php】改为【evil.pphphp】,那么过滤了第一个"php"字符串"后,开头的’p’和结尾的’hp’就组合又形成了【php】
特殊后缀名绕过 用于检测文件合法性的脚本有问题的场合; 例如:将Burpsuite截获的数据包中【evil.php】名字改为【evil.php6】,或加个空格改为【evil.php 】等
防御
1.文件类型限制:在上传文件时,要对文件类型进行严格的限制,只允许特定的文件类型上传,例如图片、文档等。可以通过文件扩展名、MIME 类型或魔术数字等方式来验证文件类型。
2.文件内容检查:对于接收到的文件,要进行内容检查和验证,确保文件内容符合预期的格式要求,避免恶意代码的注入。可以使用第三方库或工具来检测文件内容,例如对图片进行解析,确保其中不包含恶意脚本。
3.文件名处理:对上传的文件名进行严格的处理和过滤,避免包含特殊字符或路径分隔符,防止攻击者利用文件名进行目录遍历攻击。
4.文件存储路径:将上传的文件存储在非 Web 可访问的目录下,避免直接访问上传文件所在的目录,以防止攻击者通过 URL 直接访问上传的恶意文件。
5.权限控制:确保上传的文件只能被授权的用户访问和下载,设置适当的文件权限和访问控制策略,避免文件被恶意用户或程序访问。
6.安全编程实践:开发人员应当遵循安全编程实践,对文件上传功能进行充分的输入验证和数据过滤,避免因为输入验证不足而导致的漏洞。
7.实时监控和日志记录:对文件上传功能进行实时监控,记录上传文件的信息和行为,以便及时发现异常情况并进行响应处理。
综上所述,通过严格限制文件类型、内容检查、合理处理文件名和存储路径、权限控制、安全编程实践以及实时监控和日志记录等措施,可以有效地防御文件上传漏洞,保障系统的安全性。
大佬:Fasthand_
内容引自:https://blog.csdn.net/qq_43390703/article/details/104858705