下载地址:GitHub - c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场
Pass-01(前端JS验证)
1.网页关闭JavaScript
前端通过JS验证,并弹出提示
关闭JS
2.burpsuite抓包修改文件名
选择上传文件为jpg类型
burpsuite抓包修改文件名
上传成功
Pass-02(后端判断文件类型)
提示:检查文件类型
抓包修改文件类型
Pass-03.Apache配置
黑名单禁止上传php文件。
Apache添加配置,让其他文件也能被解析成php文件
AddType application/x-httpd-php .php .php3 .phtml
AddType application是将指定的后缀名以特定的方式解析
配置文件中添加这段代码,这样.php3和.phtml的后缀,服务器会以php文件解析,但是 Apache没有这个默认配置,一般搭建网站时也不会添加这样的配置。
访问php3类型文件
Pass-04.使用.htaccess文件
大量的黑名单
.htaccess
文件是 Apache Web 服务器中的一个配置文件,用于对特定目录及其子目录进行配置。
每次请求时都会被读取和解析,可能影响服务器性能。 (所以不用重启服务器)
.htaccess
文件可以覆盖 httpd.conf
中的部分配置,但需要 AllowOverride
指令的支持。
在特定目录下允许.htaccess起作用
添加配置使png文件被解析成php文件
但现在网页大量使用白名单,.htaccess直接上传不了
Pass-05.大小写绕过
Windows不区分大小写,Linux严格区分
strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
str_ireplace() 函数替换字符串中的一些字符(不区分大小写)。
Pass-06.空格绕过
没有trim()函数
windows文件名末尾会忽略空格,所以不能直接修改文件名,通过抓包修改
Pass-07.点绕过
$file_ext = strrchr($file_name, '.');、
由于这样获取后缀名,在末尾加点后,此时的$file_ext ="."
windows会直接删除末尾的点,继续抓包修改
Pass-08.::$DATA绕过
没有去除::$DATA
windows文件名不能包含冒号,所以继续抓包修改
上传成功
Pass-09.删除逻辑绕过
之前几关的过滤都有,但是可以通过逻辑漏洞
先删除点,最后删除空格,所以在后缀名后面添加'. .'(点空格点)
Pass-10.双写绕过
使用替换函数,将后缀名替换为空,最后使用替换过的后缀名,可以双写后缀名绕过。
Pass-11.%00截断
上传表单中的save_path是可控的
在代码中,save_path是用来控制文件上传路径的,所以可以控制文件名。
%00
是 URL 编码的空字符(Null Character),在编程中常用作字符串终止符。
$_GET['save_path']后面拼接的字符串全部被截断了,此时,$img_path = $_GET['save_path']。
修改save_path,既修改了文件名称,也修改了上传路径,方便在服务器中找到文件。
%00截断漏洞在php5.2版本中有用,高版本无效。
Pass-12.post%00截断
POST提交不能用url编码去提交了
方法一:将%00用url解码上传
方法二:用十六进制修改
在test12.php后面加空格,再将空格20修改成00
选中\n,查看源码,可以看到test12.php后面有\0
Pass-13.图片马
-
unpack()
函数:-
unpack()
是 PHP 中用于将二进制字符串解包为数组的函数。 -
它根据指定的格式字符串解析二进制数据,并返回一个关联数组。
-
-
格式字符串
"C2chars"
:-
C
:表示无符号字符(unsigned char),占用 1 个字节,取值范围为 0 到 255。 -
2
:表示提取 2 个字节。 -
chars
:是返回数组中的键名前缀。提取的两个字节会分别存储在chars1
和chars2
中。
-
总之,这里是判断文件的前两个字节类判断文件类型,我们在图片文件的末尾添加php代码即可(添加完成后,图片必须能打开)
1.可以手动添加php代码
2.也可以通过cmd命令添加
使用cmd命令来添加,可能会失败几次,需要多次换图片尝试
使用文件包含漏洞访问png
前提allow_url_include开启(5.2版本以上默认为off)
文件包含漏洞中的include,会将所有的文件以php文件来解析。
Pass-14.图片马(getimagesize)
通过isImage来获取文件类型,getimagesize()
会读取文件的前几个字节(通常是前 8-16 字节),并根据文件头的特征判断文件类型。
继续上传图片马
Pass-15.图片马(exif_imagetype)
exif_imagetype也是通过文件的前几个字节来判断文件类型的
继续图片马
Pass-16.图片马(imagecreatefromjpeg图片渲染)
imagecreatefromjpeg()会将上传的图片渲染,导致图片内容被打乱,添加的php代码也可能会随之打乱。
下载一个gif图片并上传
对比上传前后两个图像的数据区别,在没有打乱的地方添加php代码。
在00字符处添加php代码,并上传修改过的代码
访问成功。
Pass-17.条件竞争
代码逻辑有问题,先上传了文件,再判断文件类型,可以利用这个极短的空档期去访问php文件,让其在其他目录生成php文件。
抓两个数据包
第一个数据包用来上传文件
第二个数据包用来访问上传的php文件
Payload设置为NULL payloads,发送文件的包次数可以设置为Continue indefinitely(不限次数发包),访问文件的次数设置为3000次
可以看到,在某段时间里,成功次数很高(不用Add $也能成功)
Pass-18. 图片马条件竞争
代码有个小问题,导致文件不能上传到upload目录下,在$dir后面加一个斜杠
这里是先检查后缀名后上传,所以要传图片马。
上传完以后再重命名,所以可以利用空档期访问图片马。
上传文件包
访问php文件包
像17关一样抓包attack就行了
文件长度很长,说明访问成功了
Pass-19.修改后缀绕过
pathinfo()在这里会获取文件的后缀名,用5,6,7,8关的大小写,空格,点号,::$DATA都可以绕过
补充:
上传文件的函数move_uploaded_file()会忽略文件名最后面的"/.",所以这样也能绕过
Pass-20.上传数组绕过
这一关需要分析一下代码
$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
if (!is_array($file)) {
$file = explode('.', strtolower($file)); //分割字符串
}
$ext = end($file);
$allow_suffix = array('jpg','png','gif');
if (!in_array($ext, $allow_suffix)) {
$msg = "禁止上传该后缀文件!";
}else{
$file_name = reset($file) . '.' . $file[count($file) - 1];
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' .$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$msg = "文件上传成功!";
$is_upload = true;
} else {
$msg = "文件上传失败!";
}
save_name以数组的形式上传
如果是数组就不分割$file。正常上传$file是一个字符串,用点号分割,这样能获得一个数组,第一位是文件名,第二位是后缀名
end()函数取数组的最后一位,$ext这里获得上传数组中的jpg。正常上传这里会是后缀名
reset($file)获取数组的第一个元素,也就是upload-20.php
数组中有两个元素,所以count($flie)的值是2,那count($file) - 1的值是1,$file[count($file) - 1]获取数组[1]位置的值,而$file[1]的值是NULL,所以$file_name的值由文件名和点号拼接形成。
正常上传,$file[count($file) - 1]是获取文件的后缀名,这里由于数组中有NULL,所以不会获取到后缀名。
上传路径:
补充:如果有数组元素没有填充,计算数组大小时不会被计算。如图,count的返回值是2。
总结:
1-4关
前端验证,修改文件类型,apache配置绕过,.htaccess文件绕过,这些算是很早期的漏洞,现在几乎不会碰到这样反常识的漏洞了。
5-10关
利用了Windows的特性,使用大小写,空格,点号,$DATA号,以及使用双写绕过,5-9关的内容仅用于Windows场景下。
11-12关
%00阶段,存在于php5.2版本及以下,现在也过时了,但是其中的思想还是值得学习。
13-16关
图片马上传,通过文件的前几个字节判断文件类型,在图片的结尾加上php代码,注意图片仍能打开。但是还要配合文件上传漏洞,否则无法起作用。
16关对图片做了渲染,打乱了图片的内容,需要对比上传前后的图片,在没有改变的位置上添加php代码。GIF的文件格式比较宽松,容易成功,JPG和PNG的文件格式复杂一点,较难成功。
17-18关
条件竞争,逻辑漏洞,在现在的代码中也有存在的可能性。
19关
与利用Windows特性关卡一致
20关
利用上传数组,和代码的逻辑漏洞。