URL 与 Web 架构
URL 与 Web 架构¶
本章导读:本章解析 URL 的完整结构、编码规则、协议基础,以及 Web 系统的典型架构模式(单体、分层、微服务、Serverless),从架构视角分析安全设计原则。
URL 结构详解¶
URL(Uniform Resource Locator,统一资源定位符)是互联网上资源的唯一地址,其结构如下:
https://user:pass@www.example.com:8080/path/to/resource?name=value&foo=bar#section
\___/ \_______/ \_____________/ \___/\________________/ \_______________/ \______/
协议 认证信息 域名 端口 路径 查询参数 锚点
各组成部分详解¶
| 组件 | 说明 | 安全测试关注点 |
|---|---|---|
| 协议(Scheme) | 访问资源的方式:http、https、ftp、file、mailto、javascript、data 等 |
非标准协议(javascript:、data:)可用于 XSS;协议降级可导致 MITM |
| 认证信息 | 用户名和密码(user:pass@),已废弃,存在安全风险 |
凭证泄露在 URL 中(日志、Referer、浏览器历史) |
| 域名(Host) | 域名或 IP 地址,标识服务器位置 | 域名相似性钓鱼(examp1e.com 仿冒 example.com)、IDN 同形异义字攻击 |
| 端口(Port) | 服务程序的逻辑地址。HTTP 默认 80,HTTPS 默认 443,可省略 | 非标准端口(8080、3000、8000 等)可能运行开发/调试服务,攻击面大 |
| 路径(Path) | 资源在服务器上的位置。可能是真实文件,也可能是路由映射 | 路径遍历(../)、敏感路径暴露(/.git/、/.env、/admin) |
| 查询参数(Query String) | ?key=value&key2=value2 格式,传递给服务器的参数 |
参数篡改、SQL 注入、XSS、开放重定向、敏感信息泄露 |
| 锚点(Fragment) | #section,仅客户端使用,不发送到服务器 |
DOM 型 XSS 常利用锚点注入(#<script>alert(1)</script>) |
URL 与 URI、URN 的关系¶
-
URI(Uniform Resource Identifier):统一资源标识符,标识资源的字符串,包含 URL 和 URN
-
URL(Uniform Resource Locator):统一资源定位符,不仅标识资源,还说明如何定位(协议 + 地址)
-
URN(Uniform Resource Name):统一资源名称,仅标识资源名称,不包含定位信息,如
urn:isbn:0451450523
URL 编码与安全¶
百分号编码(Percent-Encoding)¶
-
URL 中保留字符(如
?、&、=、#、%、/)和非 ASCII 字符需要进行编码 -
编码规则:
%+ 两位十六进制表示字符的 ASCII/UTF-8 字节值 -
常见编码:
-
空格 →
%20(或+,仅在 application/x-www-form-urlencoded 中) -
&→%26 -
=→%3D -
?→%3F -
#→%23 -
<→%3C -
>→%3E -
"→%22 -
'→%27 -
安全测试意义:
-
双重编码绕过:
%253C(%编码为%25,<编码为%3C)可绕过某些 WAF 的过滤规则 -
Unicode 编码绕过:使用 UTF-8 多字节编码(如
%C0%AE表示.)绕过路径遍历过滤 -
URL 编码混淆:
%00(空字节)在某些语言(如 PHP)中截断字符串,绕过后缀检查(如shell.php%00.jpg)
IDN(Internationalized Domain Name,国际化域名)与同形异义字攻击¶
-
IDN 允许域名使用非 ASCII 字符(如中文域名
例子.测试),通过 Punycode 编码转换为 ASCII 兼容格式(xn--fsq092h.xn--0zwm56d) -
同形异义字攻击(Homograph Attack):使用 Unicode 中与 ASCII 字符外观相似的字符注册域名。例如:
-
西里尔字母
а(U+0430)与拉丁字母a(U+0061)外观相同 -
注册
аррӏе.com(使用西里尔字母)仿冒apple.com -
浏览器防御:显示 Punycode 而非 Unicode(当域名包含混合脚本时),但攻击者可通过全西里尔字母域名绕过
常见协议详解¶
HTTP/HTTPS¶
-
HTTP(HyperText Transfer Protocol):明文传输,默认端口 80
-
HTTPS(HTTP over TLS/SSL):加密传输,默认端口 443,通过 TLS 握手建立加密通道
-
安全测试关注点:HTTP 明文传输敏感信息、HSTS 缺失、TLS 配置弱点、SSL 剥离攻击
FTP(File Transfer Protocol)¶
-
用于文件传输,默认端口 21(控制连接)和 20(数据连接)
-
明文传输认证信息(用户名/密码),存在被动模式(PASV)和主动模式(PORT)
-
安全测试关注点:匿名 FTP 访问(
anonymous/anonymous)、目录遍历、明文凭证嗅探、FTP 反弹攻击(利用 PORT 命令让服务器连接指定 IP:端口)
FILE 协议¶
-
访问本地文件系统,格式
file:///C:/Windows/System32/drivers/etc/hosts -
安全测试关注点:浏览器中通过
file://协议访问本地文件(某些场景下 XSS 可利用);SSRF 中file:///etc/passwd读取本地文件
自定义协议¶
-
应用程序可注册自定义协议处理程序,如
ed2k://、thunder://、weixin://、alipays:// -
安全测试关注点:自定义协议处理程序可能存在命令注入(如
custom://exec?cmd=whoami);通过网页诱导调用本地应用协议执行非预期操作
JAVASCRIPT 协议¶
-
javascript:伪协议在浏览器地址栏或链接中执行 JS 代码 -
安全测试关注点:
javascript:alert(document.cookie)可用于 XSS;javascript:void(0)常用于占位链接
DATA URI¶
-
将数据直接嵌入 URL 中,格式
data:[<mediatype>][;base64],<data> -
示例:
data:text/html,<script>alert(1)</script>、data:image/png;base64,iVBORw0KGgo... -
安全测试关注点:Data URI 可用于绕过 CSP(内联脚本)、构造无外部请求的 XSS、钓鱼页面(所有内容在一个 URL 中)
Web 架构核心概念¶
WWW(World Wide Web,万维网)¶
-
WWW = HTTP + URL + HTML + 浏览器 + Web 服务器
-
由 Tim Berners-Lee 于 1989 年在 CERN 提出,是互联网(Internet)上最广泛使用的信息服务系统
-
注意区分:Internet 是物理网络基础设施,WWW 是运行在 Internet 之上的应用层服务
C/S 架构(Client/Server,客户端/服务器架构)¶
-
客户端向服务器发起请求,服务器处理并返回响应
-
特点:客户端需安装专用软件(如 QQ 客户端、游戏客户端),功能强大但维护成本高
-
安全测试关注点:客户端逆向分析(反编译、抓包)、通信协议分析、本地数据篡改
B/S 架构(Browser/Server,浏览器/服务器架构)¶
-
基于 Web 的 C/S 变体,客户端统一为浏览器,无需安装专用软件
-
特点:跨平台、易维护、易部署,但受浏览器能力限制
-
安全测试关注点:与 Web 安全测试完全一致(XSS、CSRF、SQL 注入等)
P2P 架构(Peer-to-Peer,点对点架构)¶
-
无中心服务器,各节点(Peer)直接通信,互为客户端和服务器
-
典型应用:BitTorrent、区块链、IPFS、Skype(早期)
-
安全测试关注点:节点身份验证、DHT 污染攻击、Sybil 攻击(伪造大量节点控制网络)、Eclipse 攻击(隔离目标节点)
URL 安全测试关联点¶
-
开放重定向(Open Redirect):
-
服务器将用户重定向到 URL 参数指定的地址,未校验目标域名,导致钓鱼攻击
-
示例:
https://example.com/redirect?url=https://evil.com -
绕过技巧:使用
//evil.com(协议相对 URL)、\\evil.com(Windows 路径风格)、https://example.com.evil.com(子域名欺骗)、javascript:alert(1)(JS 协议) -
防御:白名单校验重定向目标、使用内部映射表(
redirect?id=1映射到预定义 URL) -
SSRF(Server-Side Request Forgery,服务器端请求伪造):
-
服务器根据用户提供的 URL 发起请求,攻击者利用此机制让服务器访问内部资源
-
攻击目标:
http://127.0.0.1(本地服务)、http://169.254.169.254(云元数据服务,获取临时凭证)、http://internal-api(内部 API)、file:///etc/passwd(本地文件读取) -
绕过技巧:
-
IP 编码绕过:
0177.0.0.1(八进制)、2130706433(十进制)、0x7f000001(十六进制)、127.1(省略) -
DNS 重绑定:利用 TTL 让服务器先解析到合法 IP,再解析到内网 IP
-
302 跳转:让服务器访问受控域名,返回 302 跳转到内网地址
-
协议混淆:
dict://、gopher://、ftp://、ldap://等非 HTTP 协议
-
-
防御:URL 白名单、禁用非必要协议、内网 IP 黑名单、统一代理出口、DNS 解析后二次校验
-
工具:SSRFmap、Gopherus(生成 Gopher 协议 Payload)、Burp Collaborator
-
URL 混淆与钓鱼:
-
利用 URL 的复杂性欺骗用户,如
https://www.example.com@evil.com(@后才是实际域名) -
利用子域名:
https://www.example.com.evil.com -
利用 IDN 同形异义字:
https://аррӏе.com(西里尔字母仿冒 apple) -
利用超长域名或路径隐藏真实域名:
https://evil.com/very/long/path/that/pushes/the/real/domain/off/screen?redirect=https://example.com -
协议走私(Protocol Smuggling):
-
利用前端代理和后端服务器对协议解析的差异,将一个协议的请求走私为另一个协议
-
例如:HTTP 请求走私(利用 Content-Length vs Transfer-Encoding 解析差异)
-
或利用
Upgrade: websocket将 HTTP 连接升级为 WebSocket,绕过某些安全检测