引言:Web 应用程序为何是攻击目标?
Web 应用程序是连接企业核心业务与用户的桥梁,它们处理着最敏感的数据,如用户身份信息、金融交易记录、个人隐私数据等,由于其复杂性(前端、后端、数据库、第三方服务等)和公开访问的特性,它们成为了网络攻击者最主要的攻击目标。

攻击者的动机通常是:
- 经济利益:窃取支付信息、进行金融欺诈。
- 数据窃取:获取用户数据库、知识产权、商业机密。
- 破坏与勒索:瘫痪网站服务、进行勒索软件攻击。
- 声誉损害:篡改网页内容、泄露用户数据,打击企业信誉。
- 立足点:攻破 Web 服务器作为跳板,攻击内部网络。
核心攻击技术分类与详解
我们将 Web 应用攻击技术分为几个大类,并逐一剖析。
第一类:注入攻击
这是最古老、最普遍也是最危险的攻击类型,其核心原理是攻击者将恶意代码或数据“注入”到应用程序中,并被后端服务器当作合法命令来执行。
SQL 注入
- 原理:攻击者在输入框(如用户名、密码、搜索框)中插入恶意的 SQL 语句,如果应用程序未对用户输入进行充分过滤和验证,这些恶意语句就会被拼接到后端的 SQL 查询中,从而执行非预期的操作。
- 攻击场景:
- 绕过登录验证:输入
admin' --,SQL 语句可能变成SELECT * FROM users WHERE username = 'admin' AND password = '' -- ' AND password = '...'。 是 SQL 注释符,后面的代码被忽略,从而以admin身份登录。 - 窃取数据:输入
' OR '1'='1,SQL 语句可能变成SELECT * FROM users WHERE username = '' OR '1'='1'。'1'='1'永远为真,导致返回所有用户数据。 - 篡改/删除数据:构造
UPDATE users SET role='admin' WHERE username='attacker'; --来提升自己的权限。
- 绕过登录验证:输入
- 危害:完全控制数据库,导致数据泄露、篡改、删除,甚至获取服务器权限。
- 防御措施:
- 参数化查询:这是最根本、最有效的防御方法,将 SQL 语句和数据分开处理,数据库驱动会自动对数据进行转义,防止恶意代码被执行。
- 输入验证:对所有用户输入进行严格的白名单验证(只允许特定格式),拒绝不符合格式的输入。
- 最小权限原则:为数据库用户分配尽可能小的权限(禁止使用
DROP,ALTER等危险命令)。 - 使用 ORM 框架:现代的 ORM(对象关系映射)框架(如 Hibernate, SQLAlchemy)默认使用参数化查询,能有效防止 SQL 注入。
跨站脚本攻击
- 原理:攻击者在网页中注入恶意的 JavaScript 代码,当其他用户访问被注入的页面时,浏览器会执行这些恶意脚本,从而在用户的浏览器中执行攻击者的操作。
- 类型:
- 反射型 XSS:恶意代码通过 URL 参数传递,服务器未加处理直接反射回 HTML 页面。
http://example.com/search?q=<script>alert('XSS')</script>。 - 存储型 XSS:恶意代码被永久存储在服务器数据库中(如评论区、个人简介),所有访问该页面的用户都会受到攻击。
- DOM 型 XSS:恶意代码修改了页面的 DOM(文档对象模型)结构,无需与服务器交互即可执行,攻击更隐蔽。
- 反射型 XSS:恶意代码通过 URL 参数传递,服务器未加处理直接反射回 HTML 页面。
- 危害:窃取用户 Cookie(会话劫持)、模拟用户身份、重定向到钓鱼网站、下载恶意软件、修改网页内容。
- 防御措施:
- 输出编码:在将用户输入的数据输出到 HTML 上下文时,进行 HTML 实体编码(如
<变为<)。 - 设置安全的 Cookie 标志:使用
HttpOnly标志防止 JavaScript 访问 Cookie,使用Secure标志确保 Cookie 只通过 HTTPS 传输。 - 内容安全策略:通过 HTTP 头
Content-Security-Policy限制网页可以加载哪些资源(脚本、样式、图片等),是防御 XSS 的终极武器。 - 输入验证:过滤掉或转义危险的字符(如
<,>, )。
- 输出编码:在将用户输入的数据输出到 HTML 上下文时,进行 HTML 实体编码(如
命令注入
- 原理:与 SQL 注入类似,但攻击目标是操作系统的命令,应用程序在调用外部命令(如
ping,ls,system()函数)时,将用户输入拼接到命令字符串中,导致操作系统执行了额外的恶意命令。 - 示例:一个网站功能是
ping [用户输入的IP],如果输入8.8.8 && rm -rf /,最终执行的命令可能是ping 8.8.8.8 && rm -rf /,导致系统文件被删除。 - 危害:完全控制服务器操作系统。
- 防御措施:
- 避免使用系统命令:尽可能使用 API 来替代系统调用。
- 严格的输入验证:只允许 IP 地址、域名等特定格式的输入。
- 使用参数化调用:如果必须调用系统命令,确保用户输入作为参数传递,而不是拼接到命令字符串中。
第二类:身份认证与会话管理攻击
这类攻击针对的是“你是谁”和“你正在做什么”这两个核心问题。

暴力破解
- 原理:攻击者使用自动化工具,尝试大量的用户名和密码组合,直到找到正确的凭据。
- 危害:获取合法用户账户的完全控制权。
- 防御措施:
- 账户锁定策略:多次登录失败后临时锁定账户或要求验证码。
- 速率限制:限制单位时间内的登录尝试次数。
- 多因素认证:要求用户提供密码之外的另一种验证方式(如手机验证码、指纹)。
会话劫持
- 原理:攻击者窃取或预测有效的会话标识符(Session ID),从而冒充合法用户。
- 方式:
- 窃取 Cookie:利用 XSS 攻窃取带有 Session ID 的 Cookie。
- 预测 Session ID:Session ID 生成算法不安全(如基于时间、递增),攻击者可能预测出其他用户的 Session ID。
- 危害:攻击者可以冒充任何用户进行操作,如转账、修改信息。
- 防御措施:
- 使用 HTTPS:加密所有通信,防止 Session ID 在传输过程中被窃听。
- 使用安全的 Cookie 属性:
HttpOnly,Secure,SameSite。 - 使用不可预测的 Session ID:使用加密安全的随机数生成器创建 Session ID。
- 定期更换 Session ID:在用户登录、提升权限等敏感操作后,重新生成 Session ID。
CSRF (跨站请求伪造)
- 原理:攻击者诱骗已登录的受害者访问一个恶意网站,这个恶意网站会悄悄地向受害者已登录的 Web 应用发送一个恶意请求(如转账、修改密码),由于浏览器会自动携带目标网站的 Cookie,服务器会误认为这个请求是用户自愿发出的。
- 示例:你已登录你的网上银行,然后你访问了一个黑客网站,网站里有一张看不见的图片
<img src="http://bank.com/transfer?to=hacker&amount=10000">,浏览器会尝试加载这张“图片”,并向银行网站发送转账请求。 - 危害:在用户不知情的情况下执行非授权操作。
- 防御措施:
- CSRF Token:在表单中或请求头中放置一个服务器生成的随机令牌,服务器在处理请求时验证该令牌是否存在且正确。
- SameSite Cookie 属性:可以设置 Cookie 的
SameSite属性为Strict或Lax,防止跨站请求携带 Cookie。 - Referer/Origin 验证:检查请求的来源头,确保请求来自可信的域名(此方法有局限性,不推荐作为唯一防御手段)。
第三类:服务器与配置攻击
这类攻击利用的是服务器软件、框架或配置中的漏洞。
文件上传漏洞
- 原理:网站允许用户上传文件(如头像、附件),但未对上传文件的类型、内容进行严格校验,导致攻击者可以上传恶意的 Webshell(如
.php,.jsp文件)。 - 危害:攻击者上传 Webshell 后,可以直接在服务器上执行任意命令,获得服务器控制权。
- 防御措施:
- 严格的文件类型检查:不仅检查文件扩展名(可伪造),更要检查文件内容的“魔术头”(Magic Numbers)。
- 重命名上传文件:将上传的文件重命名为一个无意义的随机名字,避免直接执行。
- 隔离上传目录:将上传的文件存放在 Web 根目录之外,或设置为不可执行。
- 使用病毒扫描:对上传的文件进行病毒和恶意软件扫描。
敏感信息泄露
- 原理:服务器配置不当,导致敏感信息(如源代码、配置文件、备份文件、用户数据)被暴露给外部用户。
- 示例:访问
www.example.com/.env或www.example.com/config.php.bak备份文件。 - 危害:泄露数据库连接信息、API 密钥、管理员密码等核心数据。
- 防御措施:
- 配置安全的 Web 服务器:禁止列出目录内容,对敏感文件进行访问控制。
- 不将敏感信息硬编码在代码或配置文件中,使用环境变量或密钥管理服务。
- 定期进行安全审计和渗透测试,发现并修复泄露点。
XXE (XML 外部实体注入)
- 原理:当应用程序解析 XML 输入时,如果允许引用外部实体(External Entity),攻击者就可以构造恶意的 XML,导致服务器发起对任意资源的请求,或读取本地文件。
- 示例:提交一个包含
<!ENTITY xxe SYSTEM "file:///etc/passwd">的 XML,服务器可能会读取并返回/etc/passwd文件的内容。 - 危害:读取服务器任意文件、发起 SSRF 攻击、进行 DoS 攻击。
- 防御措施:
- 禁用外部实体解析:在 XML 解析器中配置,禁止解析外部实体。
- 使用安全的替代库,如禁用 DTD(文档类型定义)处理。
第四类:其他常见攻击
SSRF (服务器端请求伪造)
- 原理:攻击者诱使服务器端应用程序发起一个其本不应发起的请求,攻击者通过控制请求的 URL,让服务器去访问内部网络资源或外部恶意网站。
- 场景:
- 探测内网:利用
file://,gopher://等协议访问内网开放的服务。 - 绕过防火墙:利用服务器作为跳板攻击外部目标。
- 读取本地文件:结合 XXE 或其他方式读取服务器文件。
- 探测内网:利用
- 防御措施:
- 白名单验证:只允许访问可信的域名或 IP 地址。
- 禁用危险协议:禁止使用
file://,gopher://,ftp://等协议。 - 限制请求端口:只允许访问常见的 HTTP/HTTPS 端口。
DoS / DDoS 攻击
- 原理:通过大量合法或恶意的请求,耗尽目标服务器的资源(CPU、内存、带宽、连接数),使其无法为正常用户提供服务。
- DoS:单一源发起攻击。
- DDoS:来自多个源的分布式攻击,防御难度极高。
- 防御措施:
- 使用 CDN:将流量分散到全球多个节点,吸收攻击流量。
- 云服务商的 DDoS 防护服务:如 AWS Shield, Cloudflare DDoS Protection。
- 速率限制:对单个 IP 或用户的请求频率进行限制。
- Web 应用防火墙:可以识别并过滤掉常见的攻击流量模式。
构建纵深防御体系
没有单一的“银弹”可以防御所有 Web 攻击,安全是一个持续的过程,需要建立纵深防御体系:
- 设计阶段:遵循安全的设计原则,如最小权限、数据验证。
- 开发阶段:使用安全的编码规范,对开发人员进行安全培训,广泛使用成熟的、经过安全审计的框架和库。
- 测试阶段:进行定期的代码审计、渗透测试和漏洞扫描。
- 部署阶段:配置安全的 Web 服务器、数据库,使用 HTTPS,实施 WAF(Web Application Firewall)。
- 运维阶段:持续监控、打补丁、审计日志,建立应急响应预案。
了解攻击者的技术是防御的第一步,通过理解这些攻击的原理,我们才能更好地构建坚固的 Web 应用安全防线。

