Web 安全综述(上):Web 起源与安全发展
目录
本文根据深信服 SCSA-S 课程《Web 安全综述》四节课件整理。上篇讲”Web 从哪里来、怎么运转、安全形势如何演变”,下篇讲”常见漏洞与 OWASP Top 10(2017 → 2021)”。
引言:先建立整体认识,再谈漏洞
很多初学者学 Web 安全,是从背 payload 开始的:' or 1=1 --、<script>alert(1)</script>、../../etc/passwd。背完之后,遇到一个陌生站点依然不知道从哪里下手。
原因很简单:漏洞不是孤立的 payload,而是数据在系统各层传递时产生的处理缺陷。不知道一个请求从浏览器发出后,经过 DNS、TCP、Web 服务器、Web 容器、后端语言、框架、数据库,最后返回浏览器,就很难理解 SQL 注入为什么发生在后端语言与数据库之间,XSS 为什么发生在服务器与浏览器之间,文件包含为什么偏偏在 PHP 里最常见。
所以课程把”综述”放在最前面:先建立整体认识,再进入具体漏洞。上篇覆盖整体认识的前半部分——Web 的起源与架构、攻击面的迁移、黑客与安全的发展、两次典型事件。
一、Web 的起源与技术基础
1.1 万维网的诞生
WWW(World Wide Web,万维网)最初的想法很朴素:让分散在不同计算机上的文档通过超链接互相引用,形成一张可以互相参阅的网。
课件给出的定义是:
Web 是一种基于超文本和 HTTP 的、全球性的、动态交互的、跨平台的分布式图形信息系统;是建立在 Internet 上的一种网络服务,为浏览者在 Internet 上查找和浏览信息提供了图形化的、易于访问的直观界面。
关键节点:
| 时间 | 事件 |
|---|---|
| 1989 年 3 月 | Tim Berners-Lee 在 CERN 提交万维网构想,目标是让全球科学家通过 Internet 交流工作文档 |
| 1990 年 11 月 | CERN 的一台计算机上实现了新系统的基本框架,世界第一台 Web 服务器和 Web 浏览器诞生 |
| 1991 年 | 系统移植到其他平台并正式发布 |
这次实现确立了后来支撑整个互联网的五项技术:HTML、HTTP、URI、浏览器、Web 服务器。直到今天,Web 的访问方式仍然是这五项技术的组合。
| 组件 | 解决的问题 | 实际作用 |
|---|---|---|
| URI | 文档的命名与寻址 | 标识资源的位置 |
| HTTP | 浏览器与服务器之间的通信规则 | 定义请求与响应的语义 |
| HTML | 超文本文档如何表示 | 定义文档结构 |
| 浏览器 | 发起请求、解析并渲染文档 | 发起请求并渲染页面 |
| 服务器 | 保存文档、响应请求 | 保存资源并返回响应 |
这五者里,HTTP 是 Web 安全的核心协议。方法、状态码、首部、Cookie、认证,都是 HTTP 的组成部分;而绝大多数 Web 漏洞,本质上都是攻击者利用协议允许的语法传递了非预期的语义。
1.2 Web 架构:一条完整的栈
课件把 Web 架构拆成九层。可以按”请求自下而上经过各层,响应自上而下返回”来理解:
| 层次 | 作用 | 常见代表 |
|---|---|---|
| 操作系统 | 硬件之上的第一层软件,管理资源、调度进程 | Windows、Linux |
| 存储 | 保存数据:数据库、内存、文件 | MySQL、Redis |
| Web 服务器 | 处理 HTTP、提供静态页面、并发与负载均衡 | Apache、IIS、Nginx |
| Web 容器 | 提供扩展机制,让 HTTP 服务器能调用服务端程序 | Tomcat、WebLogic、JBoss |
| 服务端语言 | 编写动态逻辑、访问数据库、生成页面 | PHP、ASP、Java |
| 开发框架 | 用模板和约定提升开发效率 | ThinkPHP、Struts2、Spring |
| 软件系统 | 部署后可直接使用的完整站点系统 | CMS、BBS、Blog、WordPress |
| 前端框架 | 页面结构与交互 | HTML5、jQuery、Vue、React |
| 第三方内容 | 统计、广告、CDN、外部 JS | 广告统计、第三方 SDK |
两个容易混淆的概念:
- Web 服务器 vs Web 容器:Nginx、Apache、IIS 主要负责接收 HTTP 请求、返回静态文件;Tomcat、WebLogic 负责将请求交给 Java 程序处理,并返回处理结果。Nginx 常作为 Tomcat 前面的反向代理。
- 框架 vs 软件系统:框架提供基础结构与通用能力,开发者在其上编写业务代码;CMS、BBS、Blog 是完整系统,带页面和数据库,部署后可直接访问。
1.3 一次访问的完整流程
课件把访问流程概括为七步:
用户输入 URL ↓域名解析(DNS) ↓建立 TCP 连接(三次握手) ↓发送 HTTP 请求 ↓服务器响应(Web 服务器 → 应用服务器) ↓关闭 TCP 连接(四次挥手,或 Keep-Alive 复用) ↓浏览器渲染页面换成安全视角,每一步都能做文章:
| 步骤 | 可能的问题 |
|---|---|
| 输入 URL | 钓鱼链接、开放重定向、URL 中的 CRLF 注入 |
| DNS 解析 | DNS 劫持、缓存投毒、hosts 篡改 |
| TCP 连接 | 端口扫描、SYN Flood、中间人攻击 |
| HTTP 请求 | 改方法、改路径、改首部、改 Body、请求走私 |
| 服务器响应 | 源码泄露、报错信息、目录遍历、版本暴露 |
| 关闭连接 | 连接耗尽、慢速攻击 |
| 浏览器渲染 | XSS、DOM 型漏洞、恶意第三方脚本 |
同一张流程图,开发看到的是功能,安全看到的是数据流。 后面所有的漏洞,都能在这张图上找到位置。
1.4 架构即攻击面
把上面的栈竖起来看,每一层都有自己的”经典病”:
| 层次 | 典型风险 | 例子 |
|---|---|---|
| 操作系统 | 系统漏洞、提权、弱口令 | 冲击波蠕虫利用 Windows RPC 服务 |
| 存储 | 数据库弱口令、注入、未授权访问 | SQL 注入直取数据 |
| Web 服务器 | 解析漏洞、目录遍历、PUT 上传 | IIS 解析漏洞、Nginx 目录穿越 |
| Web 容器 | 配置缺陷、反序列化、文件读取 | Tomcat Ghostcat |
| 服务端语言 | 文件包含、命令执行、反序列化 | PHP include()、system() |
| 开发框架 | 表达式注入、路由缺陷、RCE | Struts2、ThinkPHP 历史漏洞 |
| 软件系统 | 插件漏洞、后台弱口令、越权 | WordPress 插件、CMS 后台 |
| 前端 | XSS、CSRF、DOM 型漏洞 | 反射型/存储型/DOM 型 XSS |
| 第三方 | 供应链投毒、广告脚本 | 第三方 JS 被篡改 |
这张表覆盖 Web 安全的主要层次。下篇讲漏洞时,每一条都对应其中一个层次。
二、从静态到动态:攻击面如何迁移
2.1 静态页面:URL 对应服务器文件
早期 Web 站点是纯静态的:没有登录体系,URL 对应服务器上的真实文件,浏览器直接解析,只能返回静态内容,信息单向传递,改一个页面就要改一个文件。
这个时代的攻击主要是篡改与展示:歪曲网站内容、传播违法内容、植入暗链(用于 SEO 作弊或引流)、换上”黑页”证明”我来过”。
之所以只能做这些,是因为静态站点不存储敏感数据,没有数据库和登录态,攻击者无法获取用户信息,只能篡改页面内容。
2.2 动态页面:服务端生成内容
随着业务发展,单向展示不够用了:用户要登录、下单、留言、搜索。于是网页里开始嵌入可执行脚本(PHP、ASP、JSP、JavaScript 等),由服务器解释执行,再拼成 HTML 返回。
课件对动态页面的定义是:利用 Flash、PHP、ASP、Java 等技术在网页中嵌入可运行脚本,用户浏览器在解释页面时遇到脚本就启动运行它。动态脚本让 Web 具备双向数据交互能力,可执行编辑文件、计算利息、提交表单等事务处理,Web 的适用面因此大大扩展。
动态页面的三个标志:
- 网页数据具备动态交互功能;
- 后台具备数据处理能力;
- 有强大的数据库作支撑。
但代价随之而来。当用户输入开始进入 SQL 语句、文件系统、系统命令、模板引擎,Web 就从”展示层”变成了”执行层”。课件那句话点得很透:
如果 Java、PHP、ASP 等程序语言的编程人员的安全意识不足,对程序参数输入等检查不严格,就会导致 Web 应用安全问题层出不穷。
2.3 攻击面随数据流迁移
| 阶段 | 大致时间 | 技术特征 | 主要攻击面 |
|---|---|---|---|
| 静态页面 | 1990s 初 | HTML + 静态文件 | 网页篡改、暗链、黑页 |
| 动态页面 / Web 1.0 | 1990s 末—2000s | CGI、PHP、ASP、JSP、数据库 | WebShell、文件包含、SQL 注入 |
| Web 2.0 | 2005 年前后 | Ajax、社交网络、用户生成内容 | XSS、CSRF、蠕虫、钓鱼 |
| 移动与云 | 2010s | API、App、云存储、微服务 | 越权、接口滥用、配置错误 |
| 当前 | 2020s | 前后端分离、Serverless、AI 应用 | 反序列化、SSRF、API 安全、供应链 |
这张表要说明的只有一件事:攻击面是跟着”数据流动的方向”迁移的。数据只从服务器流向浏览器,攻击者就改页面;数据开始从浏览器流向数据库,攻击者就注入 SQL;数据在用户之间流转,攻击者就写 XSS 蠕虫;数据通过 API 在服务之间流转,攻击者就打越权和接口。
如果只记住一句话:
分析一个 Web 系统时,先梳理数据流:用户输入从哪进入、经过哪些解释器、最终写入或返回到哪里。凡是”用户可控的数据”与”会被执行的语法”相遇的地方,就是漏洞的高发区。
三、黑客、产业与 Web 安全
3.1 “黑客”一词的起源
“Hacker” 并非源于计算机,而是源于 1961 年 MIT 的技术模型铁路俱乐部——成员们为了修改功能,“黑”了他们的列车模型。早期黑客只对探索、改进、测试程序的极限感兴趣,UNIX 即在这一背景下产生。1970 年代出现”飞客”(phreaker),1980 年代个人电脑普及后,群体开始分化:一部分人继续改进系统,另一部分人把技术用于盗版、病毒和窃密。
| 类型 | 特征 | 典型行为 |
|---|---|---|
| 黑帽 | 利用技术破坏、牟利 | 贩卖漏洞、网络犯罪、黑产 |
| 灰帽 | 行为介于合法与非法之间 | 白天上班,晚上”顺手”测试 |
| 白帽 | 从事安全行业 | 研究攻击、做防护产品与方案 |
| 脚本小子 | 只会用别人的工具 | 照教程打靶场、批量扫描 |
课件有一句判断:
在现实世界里,真正造成破坏的,往往并非那些挖掘并研究漏洞的”黑客”们,而是脚本小子。
自动化工具把攻击门槛降到了极低。防御不能只针对高水平攻击者:绝大多数真实攻击来自水平一般但数量巨大的攻击者,防住”低级但高频”的手法,收益最高。
3.2 中国黑客的三个时代
启蒙时代(1990 年代):中国互联网刚刚起步,一批热爱新技术的青年开始研究安全漏洞,大多是个人爱好。电脑发烧友最大的乐趣是复制小游戏和 DOS 软件,被称为”窃客”;后来出现了邮箱炸弹、特洛伊木马(如 NetSpy)和少量国产工具。这批人的主要特征是好奇、自由、分享。
黄金时代(2001 年前后):以 2001 年 4 月的”中美黑客大战”为标志,黑客群体几乎吸引了全社会的关注,各种组织大量出现。但新人多、技术不成熟,贩卖漏洞和恶意软件的现象升温,以营利为目的的攻击出现,黑色产业链逐渐成型。
黑暗时代(2000 年代中后期起):大多数黑客组织没有坚持下来,技术论坛没落,漏洞披露站点不再公布细节;黑色产业链成熟,每年给互联网造成数十亿甚至上百亿的损失。坚持下来的技术人,一部分成为安全公司的高级人才,另一部分进入黑产。
课件用了一句话:
因为互相之间不再具有开发和分享的精神,最为纯粹的黑客精神实质上已经死亡。
这不是道德批判,而是在描述一个产业事实:当漏洞可以标价、攻击可以外包、数据可以变现,安全从个人兴趣转变为产业化活动。
3.3 防火墙改变了攻击面
早期互联网里,Web 并不是主流应用:Web 技术还不成熟,而通过系统软件漏洞往往能获得更高权限。那时 SMTP、POP3、FTP、IRC 等服务拥有绝大多数用户,主要攻击目标是网络、操作系统和软件;基于 Web 的攻击通常只能获得低权限账户,吸引力有限。
转折点是防火墙与 ACL 技术的兴起。思科、华为、深信服等厂商开始在网络产品中重视安全,直接暴露在互联网上的系统得到了保护。
课件把 2003 年的冲击波蠕虫视为关键事件:它利用 Windows RPC/DCOM 服务漏洞,通过 TCP 135 端口向远程计算机发送特殊请求,获得完全权限并执行任意代码;蠕虫在很短时间内扩散到全球,造成数百万台机器感染。事件之后,运营商在骨干网上屏蔽了 135、445 等端口,整个互联网对安全的重视达到空前高度。
结果是一系列演变:
系统层漏洞被防火墙和运营商封堵 ↓暴露在互联网上的非 Web 服务越来越少 ↓Web 技术成熟,成为互联网主流 ↓黑客的攻击目标转向 Web从此,Web 成为互联网的主要业务入口,也成为攻防的主要目标。
3.4 Web 攻击的三个代表性阶段
| 阶段 | 标志 | 说明 |
|---|---|---|
| Web 1.0 | WebShell | 将可执行脚本上传到服务器获得权限;PHP 至今仍只能靠代码规范避免文件包含 |
| SQL 注入 | 1999 年前后 | 通过注入获取敏感数据,甚至通过数据库获得系统权限,很快成为主要威胁 |
| XSS | 2003 年后被重视 | 2005 年 MySpace 的 XSS 蠕虫在 20 小时内感染约 100 万个账户;OWASP Top 10(2007)将 XSS 列为第一 |
Web 2.0 之后,XSS、CSRF 等攻击的影响扩大。攻击重点从服务端转向客户端,转向浏览器和用户:攻击者的目标从数据库扩展到已登录用户。移动互联网和云时代,API、App、小程序进一步扩大了这一攻击面。
3.5 防御视角的转变
- 边界防御:防火墙、ACL、IDS/IPS,控制网络访问范围;
- 应用防御:WAF、输入校验、参数化查询、输出编码,校验进入应用的数据;
- 开发安全:SDL、代码审计、SAST/DAST、依赖管理,在开发阶段消除漏洞;
- 运营与响应:日志、监控、告警、应急响应,缩短检测与响应时间。
这四层对应同一句话:不存在单一防护措施,只有纵深防御。
四、两次典型事件复盘
学习漏洞原理针对单个技术点,复盘真实事件针对完整攻击过程。课件选了两个很有代表性的事件:技术驱动的 XSS 蠕虫,和数据驱动的撞库攻击。
4.1 新浪微博 XSS 蠕虫(2011 年 6 月 28 日)
2011 年 6 月 28 日晚,新浪微博突然出现大范围异常:大量用户自动发送带链接的微博与私信,并自动关注一位名为 hellosamy 的用户。
| 时间 | 事件 |
|---|---|
| 20:14 | 大量带 V 认证的用户中招转发蠕虫 |
| 20:30 | 2kt.cn 中的恶意页面无法访问 |
| 20:32 | hellosamy 用户无法访问 |
| 21:02 | 新浪漏洞修补完毕 |
影响:攻击持续 16 分钟,感染用户约 33000 人。
技术要点:
- 漏洞点:新浪名人堂部分过滤不严,参数
g的值被直接显示在页面中,导致weibo.com页面执行了来自2kt.cn的 JS。 - 利用方式:该 JS 由攻击者控制,可通过 Ajax 自动发微博、自动关注、自动发私信。
- 传播机制:攻击者用私信和微博诱导点击,重点针对 V 认证用户——他们粉丝多,一旦中招就会把蠕虫扩散给更多人。
普通 XSS 是”用户点击一次,攻击者获取一次 Cookie”;XSS 蠕虫则是”用户点击一次,其账号自动继续发送恶意链接”。后者把受害者转化为传播节点,感染人数呈指数增长,这就是 XSS 蠕虫具备自我复制与传播能力的原因。
防御启示:
- 输出侧:按上下文做 HTML/JS/URL 编码;
- 浏览器侧:会话 Cookie 加
HttpOnly,部署 CSP 限制脚本来源; - 业务侧:对高频发帖、批量关注、异常私信做频率限制与行为风控;
- 响应侧:保留”一键下线恶意内容 + 批量清理”的应急能力。
4.2 12306 用户数据泄露(2014 年 12 月 25 日)
2014 年 12 月 25 日,大量 12306 用户数据在网上传播。泄露数据达 131653 条,包括账号、明文密码、身份证、邮箱等,共约 14M。这不是 12306 第一次泄露,但是最大的一次。
攻击手法是撞库:收集互联网已泄露的账号密码,生成字典,批量尝试登录其他网站,得到一系列可以登录的用户。本质是密码复用——用户在 A 站泄露的账号密码,被用于尝试登录 B 站、C 站。
收集泄露数据 → 清洗去重 → 按邮箱/手机号归并 → 生成字典 → 自动化撞库 → 验证有效账号 → 变现能成功的原因:用户跨站复用密码、目标站点没有 MFA、登录接口没有频率限制和设备指纹、数据库存明文密码、缺乏泄露监测。
防御启示:
- 用户侧:一站一密,使用密码管理器,重要账号开启 MFA;
- 企业侧:登录限速、验证码、设备指纹、异地登录告警,拦截弱密码和已泄露密码;
- 存储侧:密码用 bcrypt、scrypt、Argon2 等慢哈希加盐存储,绝不明文;
- 运营侧:接入泄露情报,发现自家账号在泄露库中时强制改密。
4.3 事件复盘的方法论
把两个事件抽象一下,可以得到一个通用框架:
- 时间线:什么时候发现、什么时候扩散、什么时候止血;
- 根因:漏洞是什么类型,出在哪一层(代码、配置、架构、流程);
- 放大因素:为什么一个小问题会变成大事件(社交链、密码复用、自动化工具);
- 防御缺口:事前、事中、事后分别缺了什么;
- 可复用结论:换成自己的系统,哪一行代码、哪个配置、哪个流程需要改。
安全工程师和”背 payload 的人”的区别,就在这一步:能不能从一次事件里提炼出可实施的改进项。
五、小结
上篇的结论可以压缩成三句话:
- Web 是分层的:操作系统、存储、服务器、容器、语言、框架、前端、第三方,每一层都有自己的攻击面。
- 攻击面跟着数据流迁移:从静态页面的篡改,到动态页面的注入,再到 Web 2.0 的 XSS、云时代的 API 与供应链。
- 安全是攻防共同演化的结果:防火墙使攻击目标转向 Web,黑色产业链让攻击职业化,防御也从边界走向应用、开发与运营。
下篇进入具体漏洞:信息泄露、目录遍历、XSS、SQL 注入、文件上传、命令执行、文件包含、中间件漏洞,以及 OWASP Top 10 从 2017 到 2021 的变化。