最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

全球要闻:web安全基础-文件上传(含部分upload-labs靶场通关)

来源:博客园

个人学习过程记录~


【资料图】

文件上传

文件上传是指将客户端数据以文件形式封装,通过网络协议发送到服务器端。在服务器端解析数据,最终在服务端硬 盘上作为真实的文件保存。通常一个文件以HTTP协议进行上传时,将以POST请求发送至Web服务器,Web服务器收到请求并同意 后,用户与Web服务器将建立连接,并传输数据。

文件上传漏洞

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,"文件上传"本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器端脚本语言未对上传的文件进行严格的验证和过滤,就容易造成上传任意文件的情况。

通常web站点会有用户注册功能,而当用户登录之后大多数情况下会存在类似头像上传、附件上传之类的功能,这些功能点往往存在上传验证方式不严格的安全缺陷,导致攻击者通过各种手段绕过验证,上传非法文件。

文件上传产生漏洞的原因

1. 服务器配置不当

2. 文件上传限制被绕过

3. 开源编辑器的上传漏洞

4. 文件解析漏洞导致文件执行

5. 过滤不严或被绕过

文件上传绕过

绕过客户端检测(JS检测)

原理:通常在上传页面里含有专门检测文件上传的 JavaScript 代码,最常见的就是检测文件类型和扩 展名是否合法。

方法:在本地浏览器客户端禁用 JS 即可;可使用火狐浏览器的 Noscript 插件、IE中禁用JS等方式实 现,利用 burpsuite 可以绕过一切客户端检测。

绕过服务端检测

服务端检测 服务端的代码通常检测三个点:MIME类型、文件内容、文件后缀

绕过MIME类型检测

检测图片类型文件上传过程中http包的 Content-Type 字段的值,来判断上传文件是否合法。 方法:用burpsuite截取并修改数据包中文件的 content-type 类型进行绕过。

Pass-3

注意:要把apache的httpd.conf中的配置代码:#AddType application/x-httpd-php .php .phtml 注释符取消并加上php5.php3等,否则无法解析php5代码。

上传成功:

绕过文件后缀检测-黑名单

黑名单策略: 文件扩展名在黑名单中为不合法,一般有个专门的黑名单列表,里面会包含含常见的危险脚本文件。

1.htaccess 文件

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

针对as.png单个文件:

setHandler application/x-httpd-php

针对所有png文件:

setHandler application/x-httpd-php

通过一个 .htaccess 文件调用 php 的解析器去解析一个文件名中只要包含" as.png "这个字符串的任意 文件,所以无论文件名是什么样子,只要包含"as.png"这个字符串,都可以被以php的方式来解析,一个自定义的 .htaccess文件就可以以各种各样的方式去绕过很多上传验证机制。

Pass-4

查看提示,没有禁止上传.htaccess 文件:

上传针对针对as.png单个文件的.htaccess文件:

上传as.png文件,上传成功:

2.空格绕过

如果黑名单没有对后缀名进行去空处理,可以通过在后缀名后加空进行绕过。

3.点绕过

如果黑名单没有对后缀名进行去.处理,利用Windows系统的文件名特性,会自动去掉后缀名最后的.,通过在文件名后加.进行绕过。

Pass-5

上传shell.php文件失败,抓包,在shell.php后加点.仍上传失败:

在shell.php后加点空格点:

上传成功:

4.后缀大小写绕过

在对后缀的判断中,如果只是对字符串进行单独的比较来判断是不是限制文件,可以采用后缀名大小写绕过形式。

Pass-6

修改后缀名为大写:

上传成功:

5.::$DATA 绕过

如果黑名单没有对后缀名进行去::$DATA处理,利用Windows下NTFS文件系统的一个特性,可以在后缀名后加::$DATA,绕过对黑名单的检测。

Pass-9

在后缀名后加::$DATA:

出现报错:

根据报错提示路径查看文件内容

该路径下没有::$data文件,因为这是一个流文件,但备份文件可以访问:

绕过文件后缀检测-白名单

白名单策略:文件扩展名不在白名单中为不合法。

绕过方法:服务端判断文件类型是从后往前判断,而对文件解析是从前往后解析,可以利用00截断的方式进行绕过,包括%00截断与0x00截断。 该方法要求php版本小于5.3.29

%00截断: url发送到服务器后被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而 是%00解码后的内容,即解码成了0x00。

0x00截断: 系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束。但要注意是文件的十六进制内容里的 00,而不是文件名中的00。

Pass-12

修改php版本:

关闭magic_quotes_gpc:

添加%00截断:

上传成功:

Pass-13

post请求的00截断:

上传成功:

绕过文件内容检测

一般通过检测文件内容来判断上传文件是否合法。 主要有两种检测方法:

1.通过检测上传文件内容开始处的文件幻数来判断,通常情况下,通过判断前10个字节,基本就能判断出一个文件的真实类型。

Pass-14

上传php一句话木马文件shell.php失败:

上传php一句话木马文件as.png失败,说明会对文件内容进行检测:

上传正常图片包含上传成功:

制作一句话图片马:

上传图片马

根据提示本页面存在文件包含漏洞,所以地址要加上file

2.用API 或函数去进行文件加载测试,我们常见的是图像渲染测试,严格的进行二次渲染。

对渲染/加载测试的攻击方式是代码注入绕过;对二次渲染的攻击方式是攻击文件加载器自身

①对渲染/加载测试攻击 - 代码注入绕过

可以用图像处理软件对一张图片进行代码注入,这类攻击的原理是:在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般是图片的注释区,这样能保证本身文件结构是完整的,对于渲染测试基本上都能绕过

Psaa-17

上传正常动态图17.gif:

保存经过渲染的图片

可以看到两张图片前半部分基本相同

复制木马文件到经过渲染后的图片文件后保存

上传图片马

根据提示本页面存在文件包含漏洞,通过接收get的参数file,把该文件当成php文件执行

出现报错,猜测是php版本问题:

切换PHP版本为5.4.45后:

② 二次渲染的攻击方式 - 攻击文件加载器自身

这种情况下无法用代码注入绕过,二次渲染相当于吧原本属于图像数据的部分抓出来,在用自己的API或 函数进行重新渲染,而非图像数据部分直接被隔离开了。 我们可以用溢出攻击对文件加载器进行攻击,上传自己的恶意文件后,服务器上的文件加载器会主动进 行加载测试,加载测试时被溢出攻击执行shellcode。

解析漏洞

Apache解析漏洞

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

条件:apache通过mod_php来运行脚本,其2.4.0-2.4.29中存在apache换行解析漏洞,在解析php时 xxx.php\x0A 将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略 www.xxx.com/test.php.qwe.asd 以moudel方式连接,配置文件httpd.conf 中 LoadModule rewrite_module modules/mod_rewrite.so 前的注释去掉,寻找关键词: AllowOverride ,并把后面的参数从None全 部改成All

Nginx解析漏洞

形式: 任意文件名/任意文件名.php 一个在任意文件名后面添加 /任意文件名.php 的解析漏洞,比如原本文件名是 test.jpg ,可以添加 为 test.jpg/x.php 进行解析攻击。

IIS 6.0解析漏洞

1. 目录解析 形式: www.xxx.com/xx.asp/xx.jpg 原理: 服务器默认会把 .asp 目录下的文件都解析成asp文件。

2. 文件解析 形式: www.xxx.com/xx.asp;.jpg 漏洞形式: www.xxxx.com/UploadFiles/image/1.jpg/1.php www.xxxx.com/UploadFiles/image/1.jpg.php www.xxxx.com/UploadFiles/image/1.jpg/ \0.php 原理:服务器默认不解析;号后面的内容,因此 xx.asp;.jpg 便被解析成asp文件了。 IIS6.0 默认的可执行文件除了asp还包含这三种 :

IIS 7.0/7.5解析漏洞

形式: 任意文件名/任意文件名.php 原理:IIS7.0/7.5 是对 php 解析时有一个类似于 Nginx 的解析漏洞,对任意文件名只要在 URL后面追加 上字符串 /任意文件名.php 就会按照 php 的方式去解析 由于php配置文件中,开启了 cgi.fix_pathinfo ,而这并不是nginx或者iis7.5本身的漏洞。

文件上传漏洞防御

1.文件上传的目录设置为不可执行

只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,这一点至关重要。

2. 判断文件类型

在判断文件类型时,可以结合使用MIME-Type、后缀检查等方式。在文件类型检查中,强烈推荐 白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩 函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。

3. 使用随机数改写文件名和文件路径

文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能 访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像 shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。

4. 单独设置文件服务器的域名

由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含 Javascript的XSS利用等问题将得到解决。

关键词: 文件上传 文件类型 服务器端