文章目录
- upload-labs通关笔记
- Pass-01 js检查
- Pass-02 Content-Type
- Pass-03 黑名单验证
- Pass-04 黑名单验证(.htaccess绕过)
- Pass-05 黑名单验证(.user.ini)
- Pass-06 黑名单验证(大小写绕过)
- Pass-07 黑名单验证(空格绕过)
- Pass-08 黑名单验证(点绕过)
- Pass-09 黑名单验证(特殊符号)
- Pass-10 黑名单验证(路径拼接绕过)
- Pass-11 黑名单绕过(双写绕过)
- Pass-12 白名单验证(00截断_GET方式)
- Pass-13 白名单验证(00截断_POST方式)
- Pass-14 图片webshell上传
- Pass-15 getimagesize()图片马绕过
- Pass-16 exif_imagetype()图片马绕过
- Pass-17 二次渲染绕过
- Pass-18 竞争条件绕过(1)
- Pass-19 竞争条件绕过(2)
- Pass-20 代码审计(1)
- Pass-21 代码审计(2)
upload-labs通关笔记
学术不精,wp还不完整,再经过一段时间的学习之后,将其补充完整
Pass-01 js检查
查看源码
可知,允许上传的文件类型为 .jpg|.png|.gif
我们上传一个jpg文件
burpsuite抓上传的包
将jpg改为php后,放包
上传成功!
Pass-02 Content-Type
查看源码
有源码可知,发现只判断Content-Type类型,所以我们只需修改Content-Type进行绕过即可
首先上传php文件,抓上传包
将红色划线部分修改为image/jpeg或image/png或image/gif后,放包,文件即上传成功!
Pass-03 黑名单验证
查看源码
有源码可知,本关不允许上传.asp,.aspx,.php,.jsp类型的文件
我们可以通过不常见的php扩展名绕过黑名单的限制
比如.phtml,.php3,.php4,.php5
Pass-04 黑名单验证(.htaccess绕过)
查看源码
有源码可知,黑名单拒绝了所有格式的文件后缀名,除了.htaccess
所以此关通过.htaccess绕过进行上传
首先,上传一个.htaccess文件
内容为:SetHandler application/x-httpd-php
文件命名为:.htaccess
接下来,上传一个.jpg文件
内容为:<?php
phpinfo();
?>
文件命名为:0.jpg(文件名自己定义)
上传即可。
Pass-05 黑名单验证(.user.ini)
查看源码
有源码可知,本关没有被限制的后缀名有php7和.ini
php.ini 是 php的配置文件,.user.ini 中的字段也会被 php 视为配置文件来处理,从而导致 php 的文件解析漏洞。
引发.user.ini需要的条件:
服务器脚本语言为PHP
服务器使用CGI/FastCGI模式
上传目录下要有可执行的php文件
首先,创建一个.user.ini文件并上传
.user.ini文件里的意思是:所有的php文件都自动包含666.jpg文件。.user.ini相当于一个用户自定义的php.ini
.user.ini文件的内容:auto_prepend_file=123.jpg
接着再上传一个123.jpg文件,内容为:<?php eval($_POST['123'])?>
然后修改php配置文件php-ini,将300改为10
user_ini.cache_ttl控制着重新读取用户 INI 文件的间隔时间。默认是 300 秒(5 分钟)。
保存后重新启动phpstudy,等待10s后文件即可上传成功
连接蚁剑,将文件名改为readme.php
Pass-06 黑名单验证(大小写绕过)
查看源码
有源码可知,本关过滤掉了.htaccess,但可以使用大小写绕过。
本关可以不使用Burpsiute修改后缀名,直接修改即可。
在Windows系统下,对于文件名中的大小写不敏感。
一开始做的时候,无论上传.PhP还是.phP都不成功。
后来发现是第五关源码文件中的$file_ext = strtolower($file_ext); //转换为小写语句
没有注释掉,在前面加上//
即可成功上传大小写后缀文件。
Pass-07 黑名单验证(空格绕过)
查看源码
由源码可知,代码中没有对上传文件的文件名做去空格处理,存在添加空格绕过黑名单的问题。
Windows系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除空格。从而绕过黑名单。
本关需要使用Burpsuite工具截断http请求,然后在文件名后添加空格。
首先,添加一个php文件,截取上传的包,截取成功后,在文件名后缀php后添加空格。
添加完成后,放包,文件即上传成功!
Pass-08 黑名单验证(点绕过)
查看源码
有源码可知,其中缺少取出文件名最后点的处理。
Windows系统下,文件后缀名的最后一个点会被自动去除。
和Pass-06类似,只需将截取的包中,文件名后缀的结尾处添加.,文件即可上传成功!
Pass-09 黑名单验证(特殊符号)
查看源码
Windows系统下,如果上传的文件名test.php::$DATA会在服务器上生成一个test.php的文件。其中内容和所上传文件的内容相同,并被解析。
和之前的关卡类似,首先上传一个php文件,将截取包中文件名的后缀之后添加::$DATA
,文件即可上传成功。
Pass-10 黑名单验证(路径拼接绕过)
查看源码
由源码可知,上传后的文件没有进行随机化的重命名,直接保存在了服务器上。
在没有对上传的文件进行重命名的情况下,用户可以自定义文件名并在服务器中上传新建,就会造成对应的绕过黑名单。
在截取包的文件名后缀的最后添加. .
(点 空格 点),文件即可上传成功。
Pass-11 黑名单绕过(双写绕过)
查看源码
在代码的编写过程中,只对黑名单中的内容进行空替换,由于只替换一次,所以造成双写绕过。
str_ireplace() 函数替换字符串中的一些字符(不区分大小写)。
该函数必须遵循下列规则:
- 如果搜索的字符串是一个数组,那么它将返回一个数组。
- 如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换。
- 如果同时需要对某个数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余的元素将用空字符串进行替换。
- 如果是对一个数组进行查找,但只对一个字符串进行替换,那么替代字符串将对所有查找到的值起作用。
注释:该函数是不区分大小写的。请使用str_replace()函数执行区分大小写的搜索。
**注释:**该函数是二进制安全的。
同样,本关在截取包中的文件名后缀修改为.pphphp或其他双写形式即可。
Pass-12 白名单验证(00截断_GET方式)
查看源码
0x00是十六进制的表示方法,是ASCII码为0的字符,在某些函数处理时,会把它当做结束符。
系统在对文件名进行读取时,若遇到0x00,会认为读取结束。
GET型提交的内容会被自动进行URL解码。
注意:需要关闭Apache配置文件中的GPC,否则无法成功。
本关建议使用php5.3.4以下的版本。
首先,上传一个.jpg文件
截取上传包,并修改文件名后缀
放包,文件即上传成功!
验证:http://127.0.0.1/upload-labs-master/upload/0.php?/7120210526181717.php
Pass-13 白名单验证(00截断_POST方式)
查看源码
在POST请求中,%00不会被自动解码,需要在16进制中修改00
选择.jpg文件上传,截取上传包
如图所示进行操作,在二进制中对%00进行修改,放包,文件即上传成功!
Pass-14 图片webshell上传
查看源码
在服务端的PHP代码中,对于用户上传的文件做文件类型检查,查看文件格式是否符合上传规范。可以检查文件二进制格式的前几个字节,从而判断文件类型是否正确。
本关可直接上传图片马,图片马的制作方法我的上一篇博客有做介绍,可参考。
首先我们需要简单了解文件包含漏洞
文件包含漏洞的产生原因是在通过 PHP 的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。
php 中引发文件包含漏洞的通常是以下四个函数:
1、include() 当使用该函数包含文件时,只有代码执行到 include() 函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行。
2、include_once() 功能和 include() 相同,区别在于当重复调用同一文件时,程序只调用一次。
3、require() 只要程序一执行就会立即调用文件,发生错误的时候会输出错误信息,并且终止脚本的运行
4、require_once() 它的功能与 require() 相同,区别在于当重复调用同一文件时,程序只调用一次。
当使用这四个函数包含一个新文件时,该文件将作为 PHP 代码执行,php 内核并不在意该被包含的文件是什么类型。所以如果被包含的是 txt 文件、图片文件、远程 url、也都将作为 PHP 代码执行。这一特性,在实施攻击时非常有用。
上传一个图片木马,截取上传包
蚁剑连接的URL:http://127.0.0.1/upload-labs-master/include.php?file=./upload/1720210530093823.jpg
Pass-15 getimagesize()图片马绕过
查看源码
getimagesize()是PHP提供的方法,用以判断目标文件是否为图片。其返回结果中有文件大小和文件类型(通过读取文件的前八位的十六进制)。
本关同样是上传图片马,我是用的方法是直接伪造头部。
Pass-16 exif_imagetype()图片马绕过
···
Pass-17 二次渲染绕过
···
Pass-18 竞争条件绕过(1)
查看源码
文件上传过程:服务器获取文件->保存上传临时文件->重命名移动临时文件
Pass-19 竞争条件绕过(2)
···
Pass-20 代码审计(1)
查看源码
有源码可知,本关没有对上传的文件做判断,只对用户输入的文件名进行判断。
首先,上传一个php木马文件,截取上传包
截取之后修改文件后缀名为.php/后放包,如下图
上传成功后,蚁剑连接
文件即上传成功!
Pass-21 代码审计(2)
查看源码
首先,上传一个php木马文件,截取上传包,修改部分数据,如下图
放包,文件上传成功
蚁剑连接
显示上传成功!