xss攻击
XSS 攻击,即跨站脚本攻击(Cross - Site Scripting),是一种常见的 Web 应用程序安全漏洞。以下是关于它的详细介绍:
原理
- 输入输出控制不严:程序对用户输入和输出处理不当。用户输入的数据没有经过充分的过滤和转义就直接输出到前端页面,浏览器会将这些数据当作有效代码解析执行。如果攻击者精心构造了恶意脚本并成功输入到系统中,就可能导致 XSS 攻击的发生。例如,用户输入
<script>alert('XSS')</script>
,若网站未对其转义,其他用户浏览包含此输入的页面时,浏览器就会执行该恶意脚本,弹出警告框。
意义(危害)
- 用户信息安全受损:攻击者可盗取用户帐号,如机器登录帐号、网银帐号、管理员帐号等。还能窃取用户 cookies 资料,获取用户隐私信息,利用用户身份对网站执行操作,如登录用户社交账号发布虚假信息。此外,攻击者也可能获取用户浏览历史、真实 IP、开放端口等信息用于进一步攻击或非法活动。
- 非法操作与攻击:攻击者可劫持用户会话,执行非法转账操作。还能在被攻击网页中植入恶意代码,当用户访问时自动下载安装木马程序,控制用户计算机。攻击者也可能利用被攻击客户端发起 DDoS 攻击,或进行恶意操作,如篡改页面信息、删除文章等,破坏网站正常运行。
防止方法
- 输入过滤与输出转义:对用户输入进行严格校验和过滤,使用正则表达式或安全库检查,禁止输入
<script>
、onclick
、onmouseover
等可能被浏览器执行的恶意代码,同时根据业务需求进行长度限制、格式验证等操作。在将数据输出到前端页面时,对特殊字符进行转义处理,如将<
转义为<
,>
转义为>
,&
转义为&
等。 - 多种防御措施结合使用:使用 Web 应用防火墙(WAF)检测和阻止恶意的 HTTP 请求,如 Nginx 使用 Naxsi 搭建 WAF,可防御 XSS、防注入等攻击。实施内容安全策略(CSP),通过发送 CSP 头部告诉浏览器什么是被授权执行的,什么是被禁止的,实质是白名单制度。设置
HttpOnly
cookies,使得 cookie 不能被 JavaScript 脚本获取,避免攻击者通过获取 cookie 来进行攻击。
详细案例解说及代码
- 反射型 XSS 案例:攻击者构造恶意链接
http://example.com/search?q=<script>alert('XSS')</script>
,用户点击该链接后,服务器将search
参数中的恶意脚本反射回浏览器,浏览器执行脚本弹出警告框。在后端代码中,如果没有对search
参数进行过滤和转义,就会导致反射型 XSS 攻击。例如在 Node.js 中,使用 Express 框架时,如果这样处理请求:
javascript
app.get('/search', (req, res) => {
const searchQuery = req.query.q;
res.send(`<html><body><h1>Search results for: ${searchQuery}</h1></body></html>`);
});
这段代码直接将用户输入的searchQuery
输出到 HTML 页面中,没有进行任何过滤和转义,就存在反射型 XSS 漏洞。
- 存储型 XSS 案例:以博客网站为例,攻击者在发表文章时,将恶意脚本
<script>document.cookie='user=admin;path=/';</script>
作为文章内容提交。网站将文章存储到数据库中,当其他用户浏览该文章时,浏览器会执行脚本,将当前用户的cookie
设置为user=admin
,攻击者就可以利用这个cookie
冒充管理员登录。在数据库存储和读取文章的过程中,如果没有对文章内容进行过滤和转义,就会导致存储型 XSS 攻击。比如在使用 MySQL 数据库和 PHP 的情况下,插入文章的代码可能如下:
php
$articleContent = $_POST['articleContent'];
$sql = "INSERT INTO articles (content) VALUES ('$articleContent')";
// 执行SQL语句,将文章内容插入数据库,这里没有对articleContent进行过滤
读取文章并展示的代码可能如下:
php
$sql = "SELECT content FROM articles WHERE id = $articleId";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_assoc($result);
$articleContent = $row['content'];
echo "<div>$articleContent</div>";
// 直接将从数据库中读取的文章内容输出到页面,没有进行转义,存在存储型XSS漏洞
- DOM 型 XSS 案例:攻击者构造 URL
http://example.com/page?param=javascript:alert('XSS')
,用户访问该 URL 后,页面中的 JavaScript 代码从 URL 中获取param
参数并执行。例如以下 HTML 和 JavaScript 代码:
html
<!DOCTYPE html>
<html>
<body>
<div id="result"></div>
<script>
var param = location.search.substring(1);
document.getElementById('result').innerHTML = param;
</script>
</body>
</html>
这段代码从 URL 中获取参数并直接设置到div
元素的innerHTML
中,没有对参数进行任何检查和过滤,导致 DOM 型 XSS 攻击。当用户访问带有恶意参数的 URL 时,浏览器会执行恶意脚本。