本文根据深信服 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 人。

技术要点:

  1. 漏洞点:新浪名人堂部分过滤不严,参数 g 的值被直接显示在页面中,导致 weibo.com 页面执行了来自 2kt.cn 的 JS。
  2. 利用方式:该 JS 由攻击者控制,可通过 Ajax 自动发微博、自动关注、自动发私信。
  3. 传播机制:攻击者用私信和微博诱导点击,重点针对 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 事件复盘的方法论

把两个事件抽象一下,可以得到一个通用框架:

  1. 时间线:什么时候发现、什么时候扩散、什么时候止血;
  2. 根因:漏洞是什么类型,出在哪一层(代码、配置、架构、流程);
  3. 放大因素:为什么一个小问题会变成大事件(社交链、密码复用、自动化工具);
  4. 防御缺口:事前、事中、事后分别缺了什么;
  5. 可复用结论:换成自己的系统,哪一行代码、哪个配置、哪个流程需要改。

安全工程师和”背 payload 的人”的区别,就在这一步:能不能从一次事件里提炼出可实施的改进项。


五、小结

上篇的结论可以压缩成三句话:

  1. Web 是分层的:操作系统、存储、服务器、容器、语言、框架、前端、第三方,每一层都有自己的攻击面。
  2. 攻击面跟着数据流迁移:从静态页面的篡改,到动态页面的注入,再到 Web 2.0 的 XSS、云时代的 API 与供应链。
  3. 安全是攻防共同演化的结果:防火墙使攻击目标转向 Web,黑色产业链让攻击职业化,防御也从边界走向应用、开发与运营。

下篇进入具体漏洞:信息泄露、目录遍历、XSS、SQL 注入、文件上传、命令执行、文件包含、中间件漏洞,以及 OWASP Top 10 从 2017 到 2021 的变化。