第一关(JS校验)
前端检验根本没用
准备好脚本文件
发现无法上传php文件
先将文件改为6.png
上传该文件并用bp抓包,send to Repeater,将其后缀改回6.php,再send即可上传成功
第二关(服务端(后端)验证)
查看源码,发现本题的漏洞在于后端利用 PHP 的全局数组$_FILES()获取上传文件信息,其只检测content-type字段
常见的content-type字段有
mage/jpeg :jpg 图片格式
image/png :png 图片格式
image/gif :gif 图片格式
text/plain :纯文本格式
text/xml : XML 格式
text/html : HTML 格式
直接上传6.php
使用burp抓包后发送到repeater
修改content-type为image/jpeg
上传成功
第三关(文件后缀名校检)
还是先上传一下6.php,大败而归
观察提示和源码,发现有一些黑名单文件
可以换一个后缀,改为6.php3
可以换一个后缀,改为6.php3
上传成功
第四关(文件名后缀校验(配置文件解析控制))
康康源码,发现那些后缀都被过滤掉了。。。
但是.htaccess文件可以用
什么是.htaccess呢
htaccess是一个用于配置Apache Web服务器的分布式配置文件,它可以在目录级别配置网站的访问控制、重定向、错误页面等功能。它的作用类似于nginx中的location块,但是.htaccess文件是基于文件系统的,而不是基于nginx的配置文件。因此,.htaccess文件可以在不重启Web服务器的情况下实时生效。
写一段htaccess代码在记事本上
如下
-
<FilesMatch "p.jpg">
-
SetHandler application/x-httpd-php
-
</FilesMatch>
更改名称为
再写一个php文件,后缀改名为.jpg
先上传.htaccess
再上传 p.jpg
访问http://127.0.0.1/upload-labs/upload/p.jpg
成功访问
第五关(文件名后缀校验(.user.ini解析))
康康源码
这关把上关使用的.htaccess也过滤掉了 。。。
这关可以利用.user.ini配置文件
什么是.user.ini配置文件
.user.ini配置文件是一个能够被动态加载的ini文件,类似于.htaccess文件,它是对当前目录下所有php文件的配置设置。和php.ini不同的是,.user.ini文件不需要重启服务器中间件,只需要等待user_ini.cache_ttl所设置的时间(默认为300秒),即可被重新加载。利用.user.ini文件可以进行文件上传等操作,但需要满足服务器以fastcgi模式启动、允许上传.user.ini文件、上传文件的所在目录存在php文件等条件。例如,可以在.user.ini文件中设置auto_prepend_file属性,使得所有的php文件都自动包含指定的文件。
php.ini 是 php的配置文件,.user.ini 中的字段也会被 php 视为配置文件来处理,从而导致 php 的文件解析漏洞。 但是想要引发 .user.ini 解析漏洞需要三个前提条件:
1 服务器脚本语言为PHP
2 服务器使用CGI/FastCGI模式
3 上传目录下要有可执行的php文件
什么是CGI/FastCGI模式
CGI(通用网关接口)是一种标准的Web服务器和应用程序之间进行交互的方式。在传统的CGI模式中,每个HTTP请求都会启动一个新的进程来执行CGI程序,这会导致性能上的损失。
为了解决这个问题,FastCGI模式被引入。FastCGI是一种改进的CGI模式,它允许Web服务器保持一个CGI程序的进程,而不是为每个请求都启动一个新的进程。这样可以显著提高性能,减少资源消耗。
在FastCGI模式下,Web服务器和CGI程序之间通过一个持久的连接进行通信,这样可以避免重复的初始化和清理工作,从而提高了性能和效率。
总的来说,FastCGI模式相比传统的CGI模式具有更好的性能和可伸缩性,因此在大型网站和应用程序中被广泛使用。
做题如下
新建一个txt文件或者php文件,写入如下代码:
auto_prepend_file=p.jpg
意思就是将所有的php文件都自动包含p.jpg文件。(.user.ini相当于一个用户自定义的
php.ini)
再将文件名改为.user.ini
回到题目,先上传.user.ini文件,再上传p.jpg文件
后面跟上一题相同
第六关(文件名后缀校验(大小写绕过))
这关连.ini都给过滤了
但是没有使用strtolower()函数
什么是strtolower()函数
strtolower()函数是一个PHP函数,用于将字符串中的所有字符转换为小写。该函数通常用于对用户输入的数据进行标准化处理,或者用于在比较字符串时忽略大小写。示例代码如下:
$str = "Hello World"; echo strtolower($str); // 输出 "hello world"
可以使用大小写绕过黑名单
把.php 格式改为.Php 上传上去之后
就会自动解析为.php
上传成功!
第七关(文件名后缀校验(空格绕过))
康康源码
他未做去空格的操作->trim() ,所以还有空格绕过
trim()是什么
trim()是一个字符串处理函数,用于去除字符串首尾的空格或其他指定字符。该函数通常用于清理用户输入的数据,以确保数据的一致性和准确性。示例代码如下:
$str = " Hello World "; echo trim($str); // 输出 "Hello World"
Windows 系统下,对于文件名中空格会被作为空处理
程序中的检测代码却不能自动删除空格。从而绕 过黑名单
bp抓包,p.php后加一个空格,上传成功
第八关(文件名后缀校验(点号绕过))
看看源码
他对上传的文件后缀名未做去点的操作 deldot()
"deldot()"是一个自定义函数,那么它可能是用来删除字符串中的句号(".")的函数。这样的函数可能会在数据处理或字符串操作中使用,以去除不需要的字符
我们还有点号绕过
接下来就和上一关一样了
bp抓包,在p.php后加个.就行了
成功上传
第九关(文件名后缀校验(::DATA绕过))
还是康康源码
deldot()函数过滤了点号
但又对上传的文件后缀名没有做去::$DATA 处理
($DATA可能是指对数据进行处理的过程。这可能包括从用户输入中获取数据,对数据进行清洗和验证,然后将其存储到数据库或进行其他操作。数据处理通常涉及对数据进行格式化、转换、验证和安全性检查等操作,以确保数据的完整性和安全性。在不同的编程语言和框架中,数据处理的具体方式可能有所不同。)
因此我们可以利用::$DATA后缀
Windows 系统下,如果上传的文p.php::$DATA 会在服务器上生成一个
p.php 的文件,其中内容和所上传文件内容相同,并被解析
bp抓包,在p.php后加个::$DATA就行了
但是要注意
如果后期要在网站上访问的话
要去掉::$DATA
第十关(文件名后缀校验(拼接绕过))
依旧是康康源码
该处理的都处理了,可恶
类比pikachu的SQL注入
构造一个p.php. .(点空格点)
接下来和上一关一样
如下
成功上传!!!