Pass10
第一步:查看提示与源码
打开第10关,点击提示,发现会从文件名中去除.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf|.htaccess字符!
再查看源码,str_ireplace()将文件名中包含的所有黑名单元素都替换成空
综合判断,可以发现这里是执行了替代操作,检测文件后缀与黑名单匹配,一旦符合则替换为空
第二步:双写绕过
str_ireplace()函数只替换了一次,将php双写成pphphp即可绕过。
他进行匹配的时候,会把中间的php替换为空,然后剩下的后缀又是php。
BP抓包,浏览器开启BP代理,开启拦截,然后点击上传,发现成功截获数据包
我们修改数据包中的文件后缀部分,如下,然后点击放行,取消拦截
这里成功上传,然后右键该文件,复制其链接
第三步:蚁剑连接
使用蚁剑进行连接,输入密码后,测试连接成功
Pass11
第一步:查看提示与源码
打开第11关,点击提示,发现本pass上传路径可控!
再查看源码,这里在下一步中进行详细讲解
第二步:%00截断绕过
确保PHP版本低于5.3.4且magic_quotes_gpc已关闭。
基础讲解
1.ASCII 0(0x00)空字符
ASCII 码里的0 号字符(0x00),叫空字符(NULL character)。它不是空格(空格是 0x20),而是真正的 “什么都没有”。
在绝大多数编程语言、操作系统、文件系统里:遇到 0x00 = 自动停止读取,后面的内容全部忽略
这就是截断。
2.URL 编码后:%00
URL 不能直接传输不可见字符,所以会把0x00编码成:%00
这就是你看到的%00截断漏洞的来源。
3.整体流程
- 黑客构造恶意路径:
shell.php%00.jpg - URL 解码:
shell.php+0x00 空字符+.jpg - 后端检查后缀:看到
.jpg→ 认为安全 ✅ - 操作系统 / 文件函数读取路径:遇到 0x00 → 截断!
- 最终执行 / 写入:
shell.php
结果:成功上传 / 执行脚本,绕过校验
具体讲解
存在两个致命漏洞
save_path 是用户可控的 GET 参数,直接拼接到路径里
save_path=upload/xxx.php%00让最终保存的文件变成xxx.php,而不是图片
这里xxx可以是任意的内容,他只是代表着一个新的文件名,简单理解就是将你上传的文件保存为xxx.php
文件名后缀检查只看最后一个 . 后面的内容
$file_ext = substr( $_FILES['upload_file']['name'], strrpos($_FILES['upload_file']['name'], ".") + 1 );它的逻辑是:取文件名最后一个 . 后面的字符串当作后缀
也就是说:
- 上传
shell.php→ 后缀 php → 拦截 - 上传
shell.jpg→ 后缀 jpg → 允许 - 上传
shell.php%00.jpg→ 后缀 jpg →允许!
只要最后是 .jpg,就能通过检查。
步骤
BP抓包,浏览器开启BP代理,开启拦截,然后点击上传,发现成功截获数据包
我们修改数据包中的请求行中的save_path参数,如下,然后点击放行,取消拦截
这里成功上传,然后右键该文件,复制其链接
这里注意,只需要复制php前面的连接,后面乱码的不用复制
第三步:蚁剑连接
使用蚁剑进行连接,输入密码后,测试连接成功
Pass12
第一步:查看提示与源码
打开第12关,点击提示,发现本pass上传路径可控!
这和上一关的提示一样
再查看源码,发现这里与上一关相比,get请求变成了post请求
第二步:%00截断绕过
确保PHP版本低于5.3.4且magic_quotes_gpc已关闭。
这里不再讲解基础知识,直接进行操作步骤
步骤
BP抓包,浏览器开启BP代理,开启拦截,然后点击上传,发现成功截获数据包,并且在请求体中有一行特殊的字符,看起来像文件路径,大概率就是post请求体的可控的路径
我们修改数据包中的参数,如下,然后点击放行,取消拦截
注意!!!
POST Body 里直接打%00不会被解码
这里再插入%00的时候,不能直接写,应该再16进制下进行修改为00
方法:
可以先在php后面加上一个空格占位
然后点击Hex切换至16进制视图下
寻找相应的位置,将空格处的数值改为00,实现截断
这里成功上传,然后右键该文件,复制其链接
这里注意,只需要复制php前面的连接,后面乱码的不用复制
第三步:蚁剑连接
使用蚁剑进行连接,输入密码后,测试连接成功