利用 URN 绕过 URL 检查

0x00 前言 最近痴迷于看 RFC 及各类规范文档,从中发现一些有趣的利用。刚好前段时间发现了一处有趣的特性,成功绕过了某个知名站点的 XSS 防御,最终执行 XSS 攻击。本来以为只是一个小 trick,后来被某偶像拿来出了道 CTF 题目,觉得有必要分享一下。 0x01 一个真实 case 及其绕过 几个月前发现某网站上有类似于下面的逻辑,会从 URL 中取 next 参数的值,并解析出 pathname 部分,执行跳转。 const getParam = (key) => { return new URL(location).searchParams.get(key) } const nextURL = getParam('next') if (nextURL) { const u = new URL(nextURL) location.href = "" + u.pathname } 老司机应当可以发现,如果 u.pathname 能够以 javascript: 开头,那么就可以执行 XSS 攻击了。然而,pathname 会多带一个 ‘/’ ,导致利用失败,无法 XSS。 爱折腾的人怎么会止步于此呢,这个问题的突破点在于 new URL(M).pathname 。根据规范,如果cannot-be-a-base-URL 为 true,那么 pathname 等价于 path[0]。 刚好规范中就给出了满足这类条件的 case,如下图所示 因此,只要构造 ?next=urn:javascript:alert(location.origin) 即可绕过改限制并执行 XSS 攻击。 ...

August 22, 2021 · 1 min · 92 words · SYM01

利用 multipart boundary 绕过 WAF

0x00 前言 WAF(Web Application Firewall)是很常见的 Web 安全基础设施,许多云厂商、大厂、乙方安全公司均有相应的产品。然而,不得不承认,WAF 只能有限提升安全防护能力,不能拦截一些稍微复杂的攻击。正常业务不应当过度依赖 WAF,况且 WAF 还存在误拦截正常业务流量的可能。 目前已知的一些绕过 WAF 的手段包括但不限于: Chunked encoding 绕过 IBM037 等罕见编码绕过 多嘴一句:最早提出 IBM037 编码绕过 WAF 的应该是 Soroush Dalili 在 SteelCon 2017 上的议题,然而国内众多相关文章,基本没有标记出处,很奇怪。 笔者最近在分析 Go 语言的 HTTP 协议解析实现的时候,发现了一种能够利用 multipart boundary 绕过 WAF 的方法,在 Python 的一些 Web 框架上也适用,因而将其分享出来。 0x01 绕过 multipart/form-data 是一种非常常见的 HTML 表单编码方式,绝大部分的 Web 服务器、框架实现,均支持此编码。其编码后的请求大致如下所示,表单数据通过boundary分割。 POST /test HTTP/1.1 Host: example.com Content-Type: multipart/form-data; boundary=“boundary” —boundary Content-Disposition: form-data; name=“field1” value1 —boundary Content-Disposition: form-data; name=“field2”; filename=“example.txt” value2 —boundary— 那么只要满足上述协议要求,服务端就可以正常获取到字段内容了,如下图所示。 ...

August 2, 2021 · 1 min · 182 words · SYM01