什么是 URL 编码?
URL 编码(亦称 percent-encoding,百分号编码)是在统一资源标识符(URI)中表示信息的一种方式:把某些字符替换为「% + 两个十六进制数字」的三元组。之所以需要编码,是因为 URL 中只能安全使用 ASCII 的一个子集。
在网页提交表单或通过 URL 传参时,空格、符号或非 ASCII 字符等必须先编码才能可靠传输。例如空格常写作 %20,与符号 & 写作 %26。
为何要有 URL 编码:早期 URL 只打算使用部分 ASCII 字符。许多字符在 URL 中有语法含义(如 ?、&、=、/),有些则根本不应直接出现(如空格与非 ASCII)。编码让这些字符能以不破坏 URL 结构的方式出现。
理解百分号编码
百分号编码用十六进制字节值表示字符,步骤大致为:
- 确定要编码的字符
- 在选定字符编码(通常为 UTF-8)下取其字节值
- 将每个字节写成十六进制
- 在每个十六进制字节对前加百分号
%
URL Decode Operation
CyberChef 的 URL Decode 会逆转百分号编码,把编码字符还原。阅读查询串、分析 Web 流量、调试应用或理解经 URL 传输的数据时都很有用。
适合使用 URL 解码的情况:
- 阅读从浏览器复制的 URL 中的查询参数
- 分析 HTTP 请求日志与访问日志
- 调试 Web 应用与 API 调用
- 检查钓鱼链接或恶意 URL
- 处理表单提交与 GET/POST 数据
- 从编码 URL 中提取可读内容
- 辅助理解 Web 应用行为(逆向思路)
保留字与非保留字
URL 区分保留字符(有语法含义)与非保留字符(一般可直接出现)。
保留字符(多数上下文中应编码)
: / ? # [ ] @ ! $ & ' ( ) * + , ; =
这些字符参与 URL 结构。例如 ? 开始查询串,& 分隔参数,= 连接键值。
非保留字符(通常无需编码)
A-Z a-z 0-9 - _ . ~
这些字符可直接出现在 URL 中,按字面意义解释。
视位置而定:是否需要编码取决于字符在 URL 中的位置。例如路径里的 / 通常合法;若出现在查询参数值内部且需表示字面斜杠,则常编码为 %2F。
常见解码场景
场景 1:分析搜索引擎查询
场景 2:调试 API 调用
场景 3:可疑链接安全分析
特殊情况与边界情况
空格:+ 与 %20
空格有两种常见写法:
%20 — 标准百分号编码,通用
+ — 查询串/表单中常用的空格简写
二者在查询串中都可能表示空格;但在路径等其他部分,字面的 + 一般表示加号而非空格。
双重编码
数据有时会被多次 URL 编码(无意或故意):
原文:Hello World
单次编码:Hello%20World
双重编码:Hello%2520World
(%25 是百分号的编码,故 %2520 表示 %20)
完全还原可能需要多次应用 URL Decode。
不完整或非法序列
如 %2(缺一位十六进制)或 %GG(非十六进制)等无效序列,应被稳妥处理。CyberChef 通常会原样保留无法识别的片段。
URL 结构拆解
理解结构有助于判断哪些部分需要解码:
https://user:pass@example.com:8080/path/to/page?key1=value1&key2=value2#section
协议(Scheme): https
用户(User): user(现代浏览器中已很少使用)
口令(Password): pass(现代浏览器中已很少使用)
主机(Host): example.com
端口(Port): 8080
路径(Path): /path/to/page
查询(Query): key1=value1&key2=value2
片段(Fragment): section
最常需要编码/解码的位置包括:
- 查询串的值:
= 右侧
- 查询串的键:
= 左侧(若含特殊字符)
- 路径段:各
/ 之间
- 片段(fragment):
# 之后
在 CyberChef 中使用 URL Decode
使用方式很直接:
- 将 URL 编码数据粘贴到 Input
- 搜索并添加 URL Decode Operation
- 在 Output 查看解码结果
- 若仍像编码过的,可再执行一次 URL Decode(应对双重编码)
CyberChef Recipe 思路
与 URL Decode 相关的组合示例:
- 完整 URL 分析: URL Decode → Regular Expression(提取指定参数)
- 日志处理: URL Decode → Find / Replace → To Table(分析访问日志)
- 双重解码: URL Decode → URL Decode
- 提取 JSON: URL Decode → JSON Beautify
- Base64 + URL: URL Decode → From Base64
- SQL 注入分析: URL Decode → Syntax highlighter
安全注意
攻击中的 URL 编码
攻击者常用编码混淆载荷:
- SQL 注入:
%27%20OR%20%271%27%3D%271 解码为 ' OR '1'='1
- XSS:
%3Cscript%3Ealert%281%29%3C%2Fscript%3E 解码为 <script>alert(1)</script>
- 路径穿越:
%2E%2E%2F%2E%2E%2F 解码为 ../../
- 命令注入: 对 shell 元字符编码以绕过过滤
安全提示:解码后的参数仍须校验与消毒后再用于业务逻辑。解码可能暴露为绕过过滤器而混淆的攻击载荷。不要轻信用户输入,即便已解码。
双重编码攻击
攻击者可能用双重编码绕过只解码一次的防护,需意识到可能存在多层编码。
实用建议
- 浏览器开发者工具在 Network 面板中常会展示较易读的 URL
- 从地址栏复制时,浏览器可能已显示为解码形态
- 服务器日志里往往是编码后的原始请求
- 百分号后的十六进制大小写一般不敏感(
%2F 与 %2f)
- 非必须编码的字符编码后通常仍然合法
- 对空格可同时验证
+ 与 %20 的兼容性
- 拼接 URL 前应对用户输入先编码,降低注入风险
- 分析抓包或流量时,解码有助于看到真实载荷
提示:做流量安全分析时,应解码 URL 以查看实际传输内容;编码可能隐藏恶意载荷、外传数据或仅在解码后才明显的攻击模式。
← 返回操作指南