Pass-1
首先新建一个php文件,这里我命名为phpinfo.php
同时打开代理,用bp抓包,发现bp并没有抓取到包,并且网页弹出弹窗。这样我们可以知道其利用了js来检验上传文件的格式。可以先将上传文件的格式改为符合要求的格式,这里我改为phpinfo.php,然后再改包。
把文件后缀名改成png,上传抓包。
把文件后缀改成php,然后forward。
上传成功,然后在新建标签页打开图像
Pass-2
查看源代码,发现对Content-Type有限制
直接上传文件,然后抓包,发现Content-Type后面是源码里面没有包括的。
把application/octet-stream更改为image/png,然后放行。
成功。
Pass-3
第三关,还是先看一下源代码,看看对哪些东西做了限制,一看,发现做了好多限制,文件后缀名不允许.asp .aspx .php .jsp。
直接上传抓包,把文件后缀名改成phtml。
还按老套路,直接放行然后查看,可这次一看发现一片空白。
百度一下发现是因为不能解析phtml为后缀的文件,找到apache下的httpd.conf文件,在里面添加一条AddType application/x-httpd-php .php .html .phtml语句。
然后保存并重启一下apache。然后。。。。。。
寻思应该是phpstudy版本原因,用虚拟机下一个2018版,然后
Pass-4
还是先查看一下源代码,发现这次禁用的更多了,很显然用第三关的套路是不行了
先上传.htaccess这个文件
这里提示上传的文件类型应为图片类型,所以把phpinfo.php文件后缀改为.png文件。
上传成功访问文件路径
访问成功
Pass-5
第五关依旧是先查看源代码,发现与第四关差不多,仔细一看,少了个转换大小写的语句
把文件名后缀改为大写。
上传,成功
Pass-6
第六题查看源代码发现跟前几关差不多,但是不能换成大写绕过了,但是仔细一看发现少了个首位去空,可以利用
依旧抓包,利用Windows系统的文件名特性。文件名最后增加空格,写成phpinfo.php ,上传后保存在Windows系统上的文件名最后的一个空格会被去掉,实际上保存的文件名就是phpinfo.php。
成功。
Pass-7
第七关,看了一下源代码,发现连加空格都绕不过去了
选择文件,用bp抓包。在.php后面加个. 发现可以绕过。
复制地址。
成功。
Pass-8
查看一下源代码,发现前面几关用的方法都不可用了,仔细一看,这里没有对后缀名中的::$DATA进行过滤。在php+windows的情况下:如果文件名+::$DATA会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持::$DATA之前的文件名。利用windows特性,可在后缀名中加 ::$DATA绕过。
依旧用bp抓包。这里在.php后面加::$DATA。
放行,发现成功绕过
Pass-9
第九关把::$DATA也禁用掉了,所以这个方法不可以了。
看代码后发现。代码先是去除文件名前后的空格,再去除文件名最后所有的.,再通过strrchar函数来寻找.来确认文件名的后缀,但是最后保存文件的时候没有重命名而使用的原始的文件名,导致可以利用.php. .来绕过。
抓包,在.php后面加(点 空格 点)。
复制地址
成功绕过。
Pass-10
查看源码,发现是黑名单过滤,将黑名单里的后缀名替换为空且只替换一次,因此可以用双写绕过
打开bp抓包,使用双写绕过
成功绕过。
Pass-11
关键的代码在于这里的’save_path’是一个可控的变量,但是后面还拼接上一个后缀名,也需要绕过。这个时候可以使用%00截断。
但是有两个条件: php版本小于5.3.4。
php的magic_quotes_gpc为OFF状态。
上传一个jpg文件
然后使用bp抓包。在upload后面加phpinfo.php%00拦截。
放行,查看返回包,发现文件地址,复制
成功
Pass-12
这里的源代码就改了一点点,就是把get改为post类型,一样的方式绕过,只不过这里需要在二进制里面修改%00,因为post不会像get对%00进行自动解码。
上传图片
继续抓包
这里改为00
放行,查看返回包,发现已经绕过,复制地址
成功