upload-labs靶场教学之Pass10-12
2026/5/23 7:37:00 网站建设 项目流程

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.整体流程

  1. 黑客构造恶意路径:shell.php%00.jpg
  2. URL 解码:shell.php+0x00 空字符+.jpg
  3. 后端检查后缀:看到.jpg→ 认为安全 ✅
  4. 操作系统 / 文件函数读取路径:遇到 0x00 → 截断!
  5. 最终执行 / 写入: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前面的连接,后面乱码的不用复制

第三步:蚁剑连接

使用蚁剑进行连接,输入密码后,测试连接成功

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询