Web 安全之 XSS 攻击

简介: Web 安全之 XSS 攻击

XSS 攻击中文为跨站脚本攻击,全拼为 Cross-Site Scripting,其缩写本应为 CSS,但这个名称已经被作为 Cascading Style Sheets(层叠样式表) 的缩写,为了避免冲突,就将 Cross(交叉) 缩写成了看起来像一个交叉形状的字母 X。

攻击原理

XSS 攻击是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。攻击成功后,攻击者可能得到更高的权限,如窃取网站个人主页信息、Cookie 信息等。

攻击分类

根据攻击来源的不同,XSS 攻击一般可以分为三类:存储型、反射型(非持久型) 和 DOM 型。

  • 存储型攻击步骤:
  1. 攻击者将恶意代码通过表单等方式提交至目标网站数据库中。
  2. 用户访问目标网站,目标网站后端程序从数据库中提取出恶意代码并返回给浏览器。
  3. 浏览器解析并渲染响应结果的过程中执行了恶意代码。
  4. 恶意代码此时便可以执行窃取用户数据等非法操作。
  • 反射型攻击步骤:
  1. 攻击者将恶意代码嵌入至 URL 中并诱导用户点击。
  2. 用户点击恶意 URL,目标网站后端程序从 URL 中提取出恶意代码并返回给浏览器。
  3. 浏览器解析并渲染响应结果的过程中执行了恶意代码。
  4. 恶意代码此时便可以执行窃取用户数据等非法操作。
  • DOM 型攻击步骤:
  1. 攻击者将恶意代码嵌入至 URL 中并诱导用户点击。
  2. 用户点击恶意 URL,目标网站前端程序从 URL 中提取出恶意代码。
  3. 浏览器在渲染过程中执行了恶意代码。
  4. 恶意代码此时便可以执行窃取用户数据等非法操作。

存储型攻击和反射型攻击恶意代码都是经由目标网站后端程序返回,存储型攻击恶意代码被存储到了数据库中,反射型攻击恶意代码通常存在于 URL 中,因此也称作非持久型攻击。

DOM 型攻击恶意代码通常也存在于 URL 中,与存储型攻击和反射型攻击区别在于恶意代码不经过后端程序,完全由浏览器端触发。

可以发现 XSS 攻击的本质就是浏览器执行了非法的恶意代码,从而出现用户信息被窃取等非法操作。

攻击示例

这里我用 Flask 编写一个简单的 Web 应用来作为反射型 XSS 攻击的示例。执行以下代码之前你需要使用 pip install flask 的方式安装 Flask

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from flask import Flask, request, make_response
app = Flask(__name__)
@app.route('/hello')
defhello():
    name = request.args.get('name')
    response = make_response(f'<h1>Hello {name}!</h1>')
    response.set_cookie('csrftoken', '0yz8xHMCQEfUwuUBIfiOmrre1XV2GyFAYgwdscY4XxpK9BLBuT34nSP1wFhK3GFD')
return response
if __name__ == '__main__':
    app.run()

这个 Web 应用中只包含一个 hello 视图函数,它返回一个简单的欢迎页面,并设置了一条 Cookie 信息到用户浏览器中。

启动 Flask 应用,使用浏览器访问 http://127.0.0.1:5000/hello?name=xiaoming 即可看到 Hello xiaoming!

目前来看,我们的 Web 程序似乎能够正常工作,接下来我将演示如何通过传入恶意代码来实现 XSS 攻击。

这次我们使用浏览器访问 http://127.0.0.1:5000/hello?name=<script>alert(document.cookie);</script> 就可以通过 XSS 攻击的方式获取到用户浏览器中的 Cookie 信息。

既然 alert 可以执行,并且成功获取到了 Cookie 信息,那么就意味着任意 JavaScript 代码都可以被执行,这是相当危险的。比如通过 AJAX 请求将获取到的 Cookie 信息发送至攻击者的服务器,此时攻击者就可以使用窃取到的用户 Cookie 信息来做一些非法操作。

由于几种不同类型 XSS 攻击的本质是一样的,所以其他类型 XSS 攻击不再进行演示,读者可以自行尝试。

防范方法

防范 XSS 攻击最主要的手段就是在前端渲染 HTML 之前对将要渲染的内容进行转义操作。转义后的内容在浏览器中将会被看作文本,而不是可执行的代码。

修改 hello 视图函数,不再通过拼接字符串的形式构造响应内容,而是使用 Jinja2 模板对内容进行渲染。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from flask import Flask, request, make_response, render_template
app = Flask(__name__)
@app.route('/hello')
defhello():
    name = request.args.get('name')
    response = make_response(render_template('index.html', name=name))
    response.set_cookie('csrftoken', '0yz8xHMCQEfUwuUBIfiOmrre1XV2GyFAYgwdscY4XxpK9BLBuT34nSP1wFhK3GFD')
return response
if __name__ == '__main__':
    app.run()

index.html 模板内容如下:

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html>
<head>
<metacharset="UTF-8">
<title>Hello</title>
</head>
<body>
<h1>Hello {{ name }}!</h1>
</body>
</html>

再次使用浏览器访问 http://127.0.0.1:5000/hello?name=<script>alert(document.cookie);</script> 将不会看到 alert 弹框。

此时查看网页源码将会看到 <script>alert(document.cookie);</script>Jinja2 模板转义成了 &lt;script&gt;alert(document.cookie);&lt;/script&gt;

可以发现 <script> 标签中的 < 被转义成了 &lt;> 被转义成了 &gt;。这样,浏览器就不会把用户输入的内容作为代码进行解析了,而是当作普通文本进行渲染,从而避免了 XSS 攻击。

但是转义并不能完全过滤 XSS 攻击。将以上演示代码再次进行修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from flask import Flask, request, make_response, render_template
app = Flask(__name__)
@app.route('/hello')
defhello():
    name = request.args.get('name')
    url = 'javascript:alert(document.cookie)'# 假如这是一个用户提交的 URL
    response = make_response(render_template('index.html', name=name, url=url))
    response.set_cookie('csrftoken', '0yz8xHMCQEfUwuUBIfiOmrre1XV2GyFAYgwdscY4XxpK9BLBuT34nSP1wFhK3GFD')
return response
if __name__ == '__main__':
    app.run()
1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html>
<head>
<metacharset="UTF-8">
<title>Hello</title>
</head>
<body>
<h1>Hello {{ name }}!</h1>
<ahref="{{ url }}">这是一个用户提交的 URL</a>
</body>
</html>

index.html 中添加了一个 a 标签作为跳转链接,假设 javascript:alert(document.cookie) 是用户提交的非法 URL,如果我们仅仅是对内容进行转义,则无法过滤此 XSS 攻击。当用户点击页面中的 a 标签时依然会看到 alert 弹框。

所以针对 a 标签的 href 属性,我们还要做特殊处理,判断 URL 是否以 javascript: 开头,过滤掉非法 URL

虽然 XSS 攻击常见类型只有三种,但可以被攻击的漏洞却非常多。如 HTML 中的内嵌文本、a标签的 href 属性、img 标签的 src 属性、标签的 onclick 等内联事件。一切渲染用户输入数据的地方都有可能存在漏洞,所以开发人员一定要对用户输入的文本进行合适的过滤操作。

不要试图在前端页面用户提交数据的地方对内容进行过滤,因为攻击者可能不通过前端页面进行数据提交。所以要在浏览器渲染代码之前对内容进行过滤。

如果你对 Jinja2 比较熟悉,可能用过 safe 过滤器,当你了解了 XSS 攻击以后请一定要慎用,确保数据源安全的情况下才可以将不转义的内容原样返回给浏览器。对于 Vuev-htmlReactdangerouslySetInnerHTML 功能同理。

当然,所谓安全都是相对的,并没有绝对的安全,对于 XSS 攻击的防范,开发者应该保持警惕,做到尽量降低安全风险。

相关文章
|
Web App开发 监控 安全
OSS客户端签名直传实践:Web端安全上传TB级文件方案(含STS临时授权)
本文深入解析了客户端直传技术,涵盖架构设计、安全机制、性能优化等方面。通过STS临时凭证与分片上传实现高效安全的文件传输,显著降低服务端负载与上传耗时,提升系统稳定性与用户体验。
1159 2
|
10月前
|
安全 网络协议 NoSQL
Web渗透-常见的端口及对其的攻击思路
本文介绍了常见网络服务端口及其安全风险,涵盖FTP、SSH、Telnet、SMTP、DNS、HTTP、SMB、数据库及远程桌面等20余个端口,涉及弱口令爆破、信息泄露、未授权访问、缓冲区溢出等典型漏洞,适用于网络安全学习与渗透测试参考。
1850 59
|
10月前
|
存储 JavaScript 安全
Web渗透-XSS漏洞深入及xss-labs靶场实战
XSS(跨站脚本攻击)是常见的Web安全漏洞,通过在网页中注入恶意脚本,窃取用户信息或执行非法操作。本文介绍其原理、分类(反射型、存储型、DOM型)、测试方法及xss-labs靶场实战案例,帮助理解与防御XSS攻击。
2887 1
Web渗透-XSS漏洞深入及xss-labs靶场实战
|
9月前
|
安全 Linux iOS开发
Burp Suite Professional 2025.10 发布 - Web 应用安全、测试和扫描
Burp Suite Professional 2025.10 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
573 3
|
10月前
|
安全 Linux iOS开发
Burp Suite Professional 2025.9 发布 - Web 应用安全、测试和扫描
Burp Suite Professional 2025.9 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
684 0
Burp Suite Professional 2025.9 发布 - Web 应用安全、测试和扫描
|
12月前
|
安全 Linux iOS开发
Burp Suite Professional 2025.7 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
Burp Suite Professional 2025.7 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
826 0
Burp Suite Professional 2025.7 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
|
安全 Linux API
Burp Suite Professional 2025.4 发布 - Web 应用安全、测试和扫描
Burp Suite Professional 2025.4 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
565 6
Burp Suite Professional 2025.4 发布 - Web 应用安全、测试和扫描
|
12月前
|
存储 安全 JavaScript
Web Storage有哪些安全风险?
Web Storage有哪些安全风险?
|
人工智能 Linux iOS开发
Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
1037 12
Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
|
安全 大数据 数据挖掘
课时9:阿里云Web应用防火墙:全面保障网站的安全与可用性
阿里云Web应用防火墙(WAF)基于阿里巴巴十年攻防经验,提供全面的网站安全防护。它通过Web应用防护、CC攻击防护和业务风控,有效应对各类网络威胁,确保网站的安全与可用性。智能双引擎技术降低误报率,实时数据分析和虚拟补丁更新保障系统安全。WAF已成功护航多个重大活动,为企业提供高效、简便的安全解决方案。
526 0