文件上传漏洞简要总结
一.定义:
文件上传漏洞是web系统中常见的一种功能,通过文件上传能实现上传图片,视频,以及其他类型的文件,但是随着web中包含的功能越来越多,潜在的网络安全风险也就越大。
如果恶意用户上传了可执行的文件或者脚本,就会导致网站被其控制甚至会使服务器沦陷,以至于引发恶意的网络安全事件。
二.原理:
文件上传漏洞是指用户通过界面上的上传功能上传了一个可执行的脚本文件,而WEB端的系统并未对其进行检测或者检测的逻辑做的不够好。
若WEB未对用户上传的文件进行有效的审查,若存在恶意用户对其上传一句话木马,从而实现控制WEB网站的目的。
三.基本流程:
拿一道题目进行演示:[SWPUCTF 2021 新生赛]easyupload2.0
1.寻找上传点:
有的时候,题目的上传点并不是特别明显,需要进行一些查找来找到文件上传点,本题一打开环境就是上传点,可以直接开始下一步。
2.开始上传文件:
到了这一步,可以直接写入一个文件:a.php内容是:
<?php @eval($_GET["shell"]);?>
之后上传。
3.当遇到有验证的情况:
在几乎所有的题目中,文件上传都不会让我们直接上传,肯定会设置一些验证,因此我们需要对其进行绕过,具体的操作下面再说。
这里可以知道的是php不行,可以推测出是对后缀进行了绕过,可以将后缀大小写夹在一起或者修改服务端可以解析的例如phtml等等后缀进行绕过,这里修改为phtml:
秒一下看看:
发现成功上传了文件,所以可以对这个文件进行访问了
4.两个方式获取flag:
最后,有两个方式可以获取flag,第一种就是利用rce来进行目录穿越获取flag文件,第二种就是通过蚁剑等等来连接以查看目录和读取文件。
这里使用第一种方式,通过使用get方式传递参数(传参方式以及传参点是啥根据自己写入的内容有关),传递的参数可以是rce的语句如下:
最后成功获取了flag。
四.一些绕过方式:
1.前端js验证:
前端JavaScript验证,文件并没有与服务端进行交互,可以通过禁用js的方式来防止js检测,来绕过js验证。
2.MIME类型绕过:
这个也是最常见的burp抓包,修改Content-Type类型为允许的类型,经常修改的类型为image/jpeg
3.黑名单绕过:
这种绕过方式的点在于开发人员对于黑名单的设置不全面,导致的有些可以利用的点没有被加入黑名单,
常见的可解析的文件名:
pht
phpt
phtml
php3
php4
php5
php6
4.白名单绕过:
通过某种类型的技巧来绕过白名单:
shell.php%00.gif //添加空字节注入
shell.jpg.php //双重扩展
1).%00阶段:
0x00是字符串的结束标识符,攻击者可以利用手动添加标识符的方式来将后面的内容进行截断,而后面的内容可以帮助我们绕过检测
要求:
php版本<5.3
php.ini这个配置文件magic_quotes_gpc必须为off才有用
上传路径可控的情况下
5.重写绕过:
有的时候,后端是用的preg_replace()来防止绕过的,替换过后的文件会变为不可解析的文件等等,导致无法使用蚁剑进行连接。写法如下:
pphphp
6. .htaccess绕过:
在apache里,这个文件作为一个配置文件,可以用来控制所在目录的访问权限以及解析设置。也就是说,可以通过设置可以将该目录下的所有文件作为php文件来解析。
.htaccess可以写入apache配置信息,改变当前目录以及子目录的apache配置信息。
前提条件:
配置上允许.htaccess生效
Apache开始rewrite模块
.apache配置文件为AllowOverride All(默认为None)
在.htaccess文件中写入以下内容:
AddType application/x-httpd-php .jpg .png
7.大小写绕过:
用burp抓包后,修改上传的文件为phP等等大小写夹杂在一起或者PHP这样的形式进行绕过。
8."."号后缀名绕过:
用 Burp 抓包之后,修改上传文件的后缀名,后缀名后加个"."号,发现能够绕过黑名单检测。
9.::$data:
这是一个Windows下才能用的方式
::$data 就是利用windows下的NTFS文件系统的一个特性,
当我们访问a.php::$data 就相当于请求a.php
抓包之后,修改上传文件的后缀名,后缀名后加个"."号,发现能够绕过黑名单检测。
9.::$data:
这是一个Windows下才能用的方式
::$data 就是利用windows下的NTFS文件系统的一个特性,
当我们访问a.php::$data 就相当于请求a.php