看题目我们准备好我们的php脚本文件,命名为1.php
上传该php文件,发现上传失败
方法一:将浏览器的JavaScript禁用
然后就能上传了
方法二:
查看源码,发现只能上传以下形式的文件
我们将刚才的1.php的后缀改为.jpg
上传该文件并用bp抓包,send to Repeater,将其后缀改回1.php,再send即可上传成功
还是上传1.php提示“文件类型不正确,请重新上传”
查看源码,发现本题的漏洞在于后端利用 PHP 的全局数组$_FILES()获取上传文件信息,其只检测content-type字段
而常用的content-type字段有:
image/jpeg :jpg 图片格式
image/png :png 图片格式
image/gif :gif 图片格式
text/plain :纯文本格式
text/xml : XML 格式
text/html : HTML 格式
再次用bp抓包,然后send to Repeater
将content-type字段改为image/jpeg,再点击send,上传成功
打开源文件查看是否上传成功加以验证
直接查看源码吧:
发现只是过滤了一小部分的文件后缀,而利用一些危险的文件后缀还是可以上传的
可以修改为其他的文件后缀如:.php3,.php4,.php5,.phtml,.phps等
我们上传1.php3,可以上传成功
查看本关源代码发现他把几乎全部的文件后缀名过滤掉了,啊啊啊
但是他又貌似漏掉了.htaccess文件。。。。
那么什么是.htaccess文件呢?
htaccess 文件是 Apache 服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess 文 件,可以实现:网页 301 重定向、自定义 404 错误页面、改变文件扩展名、允许/阻止特定的用户或者目录 的访问、禁止目录列表、配置默认文档等功能。
解法:上传.htaccess 解析文件,利用其配置,将白名单文件的类型解析成php文件类型。
新建一个txt文件或者php文件,写入如下代码
SetHandler application/x-httpd-php
这段代码意思为:将服务器上的1.jpg文件解析为php文件
保存后将文件名改为.htaccsee(注意:htaccess文件不能起名字,他就是.htaccess文件,如果你将他改为4.htaccess或者其他的什么名字 是不可以的,无法解析。)
再建一个php文件,写入phpinfo()函数,保存后将后缀改为.jpg,我这里为1.jpg
准备工作都完成后,回到题目,先上传.htaccsee文件,再上传1.jpg文件
上传成功后,看不出什么
但我们访问1.jpg,发现他以php的形式显示了出来
还是直接看源码,非常好,他在过滤了一堆后缀名的基础上,又把上关使用的.htaccess过滤掉了 。。。
没事,我们还有方法——利用.user.ini配置文件
.user.ini比.htaccess 用的更广,不管服务器是 nginx/apache/IIS,当使用 CGI/FastCGI 来解析 php 时,php 会优先搜索目录下所有的.ini 文件,并应用其中的配置。类似于 apache的.htaccess,但语法与.htacces不同,语法跟 php.ini 一致
而php.ini 是 php的配置文件,.user.ini 中的字段也会被 php 视为配置文件来处理,从而导致 php 的文件解析漏洞。 但是想要引发 .user.ini 解析漏洞需要三个前提条件:
服务器脚本语言为PHP
服务器使用CGI/FastCGI模式(上网简单了解)
上传目录下要有可执行的php文件
废话不多说,开始做题:
还是新建一个txt文件或者php文件,写入如下代码:
auto_prepend_file=1.jpg
意思就是将所有的php文件都自动包含1.jpg文件。(.user.ini相当于一个用户自定义的
php.ini)
再将文件名改为.user.ini,上题的1.jpg还能用嘿嘿
那就回题目,先上传.user.ini文件,再上传1.jpg文件,后面的过程就和上一题一样了
其实还有解法二/三....:(这里是第10关解法,后关的解法前关都适用)
直接用 php. .(点空格点), 绕过上传
这关连.ini都给过滤了
但但但但但是没有使用strtolower()函数,可以使用大小 写绕过黑名单 把.php 格式改为.Php 上传上去之后,就会自动解析为.php
注意:
Windows 系统下,对于文件名中的大小写不敏感。例如:test.php 和 TeSt.PHP 是一样的。
Linux 系统下,对于文件名中的大小写敏感。例如:test.php 和 TesT.php 就是不一样的。
又来了,又使用strtolower()函数了,大小写绕过不管用了
没关系,他未做去空格的操作->trim() ,所以还有空格绕过
Windows 系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除空格。从而绕 过黑名单。
bp抓包,1.php后加一个空格,上传成功!
不出所料,trim()函数来了,空格绕过也不行了
可是他对上传的文件后缀名未做去点.的操作 ->deldot(),我们还有点号绕过
接下来就一样了,bp抓包,只需在1.php后加个.就行了!
果然,deldot()函数过滤了点号
但又对上传的文件后缀名没有做去::$DATA 处理
因此我们可以利用::$DATA后缀
Windows 系统下,如果上传的文件名为 1.php::$DATA 会在服务器上生成一个
1.php 的文件,其中内容和所上传文件内容相同,并被解析。
bp抓包,在1.php后加个::$DATA就行了
但访问1.php::$DATA是不行的,还需将 ::$DATA去掉
成功访问!
::$DATA绕过不好使了,无话可说,直接上解法:
将文件名进行过滤操作后,将文件名拼接在路径后面,所以需要绕过前面的首尾去空以及去点。
bp抓包,在1.php后加. .(点空格点)就行了
之前有的忘写访问结果了,除了1.php::$DATA需将 ::$DATA去掉外,都能直接访问成功哦!
利用 str_ireplace()将文件名中符合黑名单的字符串替换成空,总之就是前面的方法都不好使了
解决方式:利用双写黑名单字符,对字符串的一次过滤后拼接出 php,文件名.pphphp
bp抓包,1.php后缀改为.pphphp就行了
上传成功!