目录
前言
文件上传漏洞原理
Webshell介绍
一句话木马:
小马:
大马:
Webshell集合:
网站控制工具
文件上传漏洞危害
文件上传漏洞靶场练习
Pass-01
Pass-02
Pass-03
Pass-04
Pass-06
Pass-07
Pass-08
Pass-09
Pass-10
Pass-11
Pass-12
Pass-13
Pass-14
Pass-15
Pass-16
Pass-17
Pass-18
Pass-19
Pass-20
Pass-21
文件上传漏洞发现与利用
文件上传漏洞利用流程
发现
文件上传漏洞防御
文件上传漏洞发生的前提
防御
前言
文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。 这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。 这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。 如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
文件上传漏洞原理
文件上传漏洞是指攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本,或者webshell等。
文件上传的漏洞条件:
- 上传的文件能够被Web服务器当做脚本执行
- 我们能够访问到上传文件的路劲
文件上传功能:
一般什么网站有上传文件的功能?
Webshell介绍
一句话木马:
代码短,只有一行代码。
场景多,可以单独生成文件,也可以插入到图片中。
安全性高,隐匿性强,可变形免杀
php中eval()函数的作用:
小马:
体积小,功能少
只有文件上传功能
大马:
体积大,功能全
能够管理数据库、文件管理、对站点进行快速的信息收集,甚至能够提权
Webshell集合:
https://github.com/tennc/webshell
网站控制工具
1、中国菜刀
2、中国蚁剑
3、哥斯拉
4、weevely
5、冰蝎
文件上传漏洞危害
文件上传漏洞是指用户上传了一个可执行的脚本文件,而且通过这个脚本文件获得了执行服务器端命令的能力。
危害:
黑链
挖矿
文件泄露
文件上传漏洞靶场练习
我们在之前的文章里已经讲述过了文件上传漏洞的原理以及及其危害,我们今天就来通过靶场来练习一下文件上传漏洞的绕过。
Pass-01
我们从第一关开始:
我们点击提示查看:
这里说了这里对上传文件的验证是在前端。
我们这里直接去上传一句话木马试试看:
显示如上,说允许上传.png .jpg .gif三种文件格式类型的文件。
我们该如何去绕过呢?
在浏览器url一栏中输入about:config
将javascript:enabled切换成Flase,以禁用前端js。
我们再来上传一下试试看:
上传成功。
Pass-02
MIME
常见类型
MIME用法
我们来看一下这关的源码:
这关校验了上传文件的MIME类型,我们只要将文件上传的MIME类型修改就可以绕过了。
漏洞描述:只检测 content-type 字段导致的漏洞。 ( 后端利用 PHP 的全局数组
$_FILES() 获取上传文件信息 )
利用方法:修改 content-type 字段的值为图片格式。
常用 content-type 字段:
我们上传shell.php文件:
然后到开Burp Suite抓包:
然后我们将 content-type字段修改为image/jpeg:
然后放包:
上传成功:
Pass-03
漏洞描述:使用黑名单的方式限制文件上传类型,后端利用$_FILES()和 strrchr()获取文件名后缀。被限制文件类型:.asp .aspx .php .jsp
利用方法:因为是利用黑名单来限制文件上传类型,找漏网之鱼 绕过
例如:
特殊文件名绕过: . php3 . php4 . php5 . phtml . phtm . phps . phpt . php345
我们将上传的文件后缀php改成等价的php3绕过。
上传成功:
Pass-04
漏洞描述:依然是使用黑名单限制,但几乎过滤了所有有问题的后缀名,但可以允许上传.htaccess 文件。
利用方法:上传 .htaccess 解析文件,利用其配置,将白名单文件的类型解析成php 文件类型。
上传 .htaccess 文件 内容如下: ( 将服务器上的 test.jpg 文件解析成 php 文件 ,这里文件可以自由配置 )
再上传一个一句话木马,文件名为 test.jpg ,依旧访问 test.jpg ,但其会以 php形式解析。
我们将编辑好的.htaccess 文件上传到服务器上,
然后将我们包含有一句话木马的shell.php改成后缀为a.jpg的文件:
去访问这个文件存在的路径:
访问成功:
Pass-05
漏洞描述:过滤了 .htaccess
利用方法:
(1) 使用大小写绕过 .htaccess
(2) 利用 .user.ini 配置文件
.user.ini 。它比 .htaccess 用的更广,不管服务器是 nginx/apache/IIS ,当使用 CGI /
FastCGI 来解析 php 时, php 会优先搜索目录下所有的 .ini 文件,并应用其中的配置。
类似于 apache 的 .htaccess ,但语法与 .htacces 不同,语法跟 php.ini 一致。
上传文件 .user.ini, 内容为:
auto_prepend_file=test.jpg
再上传一个内容为 php 一句话脚本,命名为 test.jpg 。
.user.ini 文件作用:所有的 php 文件都自动包含 test.jpg 文件。 .user.ini 相当于一个用
户自定义的 php.ini 。
Pass-06
漏洞描述:对于文件名后缀的校验时,没有进行通用的大小转换后的校验-> strtolower()
大小写绕过原理:
Windows 系统下,对于文件名中的大小写不敏感。例如: test.php 和 TeSt.PHP 是一
样的。
Linux 系统下,对于文件名中的大小写敏感。例如: test.php 和 TesT.php 就是不一样
的。
利用方法:文件后缀为 .PHP
我们将上传的shell后缀改为大写:
上传成功:
Pass-07
对上传的文件名未做去空格的操作->trim()
Windows 系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除
空格。从而绕过黑名单.
利用方法: burp 抓包,修改对应的文件名 添加空格。
我们上传文件,抓包:
然后在这里filename后面添加上一个空格:
放包,上传成功:
Pass-08
漏洞描述:对上传的文件后缀名未做去点.的操作 ->strrchr($file_name, '.')
利用 Windows 系统下,文件后缀名最后一个点会被自动去除
利用方法:文件后缀名为 .php.
我们上传文件,抓包:
在这里添加一个.
放包,上传成功:
Pass-09
漏洞描述:对上传的文件后缀名未做去::$DATA 处理
Windows 系统下,如果上传的文件名为 test.php::$DATA 会在服务器上生成一个test.php 的文件,其中内容和所上传文件内容相同,并被解析。
利用方法:上传带有一句话木马的文件,其文件名为 test.php::$DATA
我们上传文件,抓包:
在文件名后添加上::DATA
放包,上传成功:
Pass-10
漏洞描述:将文件名进行过滤操作后,将文件名拼接在路径后面,所以需要绕 过前面的首尾去空以及去点。
利用方法:上传文件名为 .php. .( 点 +php+ 点 + 空格 + 点 )
我们上传文件,抓包:
在文件后缀加上. .
放包,上传成功:
Pass-11
漏洞描述:利用 str_ireplace()将文件名中符合黑名单的字符串替换成空
利用方式:利用双写黑名单字符,对字符串的一次过滤后拼接出 php, 文件
名 .pphphp
我们修改上传文件后缀名:
上传成功:
Pass-12
漏洞描述:使用白名单限制上传文件类型,但上传文件的存放路径可控
利用方法:设置上传路径为 upload/phpinfo.php%00 , 添加 phpinfo.php%00 内容为了控制路径,上传文件后缀为白名单即可 例 :test.jpg ,保存后为/upload/phpinfo.php%00test.jpg ,但服务端读取到 %00 时会自动结束,将文件内容保存至 phpinfo.php 中
PS: 需要 php 的版本号低于 5.3.29 ,且 magic_quotes_gpc 为关闭状态
我们上传文件,抓包:
在路劲后添加上%00:
放包,上传成功:
Pass-13
漏洞描述:漏洞描述:使用白名单限制上传文件类型,但上传文件的存放路径 可控,但因为是 POST 型,需要在 16 进制中修改,因为 POST 不会像 GET 那 样对 %00 进行自动解码
我们上传文件,抓包:
在upload/后面加上/shell.php+ 并把filename里的shell.php改成shell.png。
然后到16进制中将+号改为00
放包,上传成功:
Pass-14
漏洞描述:通过读文件的前 2 个字节,检测上传文件二进制的头信息,判断文件类型,利用图片马绕过检测。
利用方法:图片马制作
在 cmd 里执行 copy logo.jpg/b+test.php/a test.jpg
logo.jpg 为任意图片
test.php 为我们要插入的木马代码
test.jpg 为我们要创建的图片马
名字可任意
我们来制作图片马:
我们以文本格式打开图片文件,可以看到恶意代码被包含在了图片里
上传我们的文件:
上传成功:
Pass-15
漏洞描述:通过 getimagesize()获取上传文件信息,图片马绕过
getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组
这一关校验了上传文件的大小,我们直接制作一个图片马,跟上一关一样:
上传成功:
Pass-16
漏洞描述:利用 php 内置函数 exif_imagetype() 获取图片类型(需要开启php_exif 模块)
利用方法:(1) 图片马
(2) 预定义高度宽度:例 .htaccess 文件
(3)利用 x00x00x8ax39x8ax39 文件头
我们这里还是运用图片马(百试不爽):
上传成功:
Pass-17
漏洞描述:综合判断了后缀名、 content-type ,以及利用 imagecreatefromgif 判断是否为 gif 图片,并在最后对文件内容进行了二次渲染,修改文件内容
绕过方法:上传一个 GIF 图片马,然后将其下载下来,查看其十六进制的文件内容,找到二次渲染后不变的地方,而这个地方就是可以插入一句话的地方
详细内容可以参考链接: https://xz.aliyun.com/t/2657
这一关会把我们上传的一句话图片马里的恶意代码删掉,我们这里为了方便直接在网上找一个不会被二次渲染删掉恶意代码的图片上传:
上传成功:
Pass-18
漏洞描述:先将文件上传到服务器,然后通过 rename 修改名称,再通过unlink 删除文件,因此可以通过条件竞争的方式在 unlink 之前,访问 webshell
利用方法:使用 burp 或者 python 脚本对要上传的文件路径进行不断的访问 (upload/webshell.php) ,上传一个 webshell.php ,但访问该文件,会在目录下生成一
个 webshell ,文件内容为
我们上传一个条件竞争的文件,文件的内容为,保存为competition.php:
抓包:
右键:
设置如下:
然后开始爆破:
然后我们在浏览器输入上传文件的路劲,不断刷新访问,直到一句话木马被生成:
然后我们在中国蚁剑之中成功连接:
Pass-19
漏洞描述:后缀名做了白名单判断,然后会一步一步检查文件大小、文件是否存在等等,将文件上传后,对文件重新命名,同样存在条件竞争的漏洞。可以 不断利用 burp 发送上传图片马的数据包,由于条件竞争,程序会出现来不及 rename 的问题,从而上传成功
利用方法:区别于 Pass-18, 这里需要使用图片马
Pass-20
漏洞描述:使用 pathinfo($file_name,PATHINFO_EXTENSION) 的方式检查文件名后缀(从最后一个小数点进行截取),并使用的是黑名单方式。
利用方法:上传一句话木马,在文件名后缀加一个小数点绕过 phpinfo.php. ,上传成功可以直接访问 phpinfo.php
我们上传shell.php文件 保存名称为upload-19.php/.
上传成功:
Pass-21
漏洞描述:对参数 $file 进行判断,如果不是,将其修改为数组,但我们提前传
入数组时,造成漏洞
利用方法:数组绕过
我们上传文件,抓包:
将filename的shell.php改成shell.jpg :
MIME类型也需要改:
在这里添加上数组:
这里也需要改:
下面两个地方也需要改:
放包,上传成功:
文件上传漏洞发现与利用
文件上传漏洞利用流程
1、找到上传的位置
2、尝试绕过校验,上传文件
3、获得文件位置
4、蚁剑连接,管理文件
发现
工具下载地址:https://github.com/almandin/fuxploider
他这个项目可以自动去检验网站文件上传的表单有没有可以上传文件的点。
文件上传漏洞防御
文件上传漏洞发生的前提
1、网站上传功能能正常使用
2、文件类型允许上传
3、上传路径可以确定
4、文件可以被访问,可以 被执行 或被包含
防御
扩展名(后缀)黑白名单
MIME类型校验(image/gif)
文件内容头校验(GIF89a)
对文件内容进行二 次渲染
对上传的文件重命名,不易被猜测
不要暴露上传文件的位置
禁用上传文件的执行权限