XSS攻击原理、示例和防范措施
XSS攻击
XSS(Cross-Site Scripting,跨站脚本)攻击历史悠久,是危害范围非常广的攻击方式。
Cross-Site Stripting的缩写本应该是CSS,但是为了避免和Cascading style sheets(层叠样式表)的缩写混淆,所以将Cross(即交叉)使用交叉形状的X表示。
攻击原理
XSS是注入攻击的一种,攻击者通过将代码注入被攻击者的网站中,用户一旦访问访问网页便会执行被注入的恶意脚本。XSS攻击主要分为反射性XSS攻击(Reflected XSS attack)和存储型XSS攻击(Stored XSS Attack)两类。
攻击示例
反射型XSS(非持久型)
反射性XSS有称为非持久型XSS(Non-Persistent XSS)。当某个站点存在XSS漏洞时,这种攻击会通过URL注入攻击脚本,只有当用户访问这个URL是才会执行攻击脚本。
例如:
@app.route('/hello1')
def hello1():
name = request.args.get('name')
response = '<h1>Hello, %s!</h1>' %name
这个视图函数接收用户通过查询字符串(URL后边的参数)传入的数据,未做任何处理就把它直接插入到返回的响应主题中,返回给客户端。如果某个用户输入了一段JavaScript代码作为查询参数name的值:
http://127.0.0.1:5000/hello4?name=<script>alert('Bingo!')</script>
那么客户端收到的响应将变成下面的代码:
<h1>Hello,<script>alert(‘Gingo!’)</script>!</h1>
当客户端收到响应后,浏览器解析这行代码就会打开一个弹窗,下图是firefox浏览器(55.0版本)上的响应。
在chrome 72.0版本上的响应:
下面在IE11上的响应。
可见针对跨站攻击,某些浏览器已经做了安全防范。
不要觉得一个小弹窗不会造成什么危害,能够执行alert()函数就意味着通过这种方式可以执行任务JS代码。即攻击者通过javaScript几乎可以做任何事情:窃取用户的cookie和其他敏感数据,重定向到钓鱼网站,发送其他请求,执行注入转账、发布广告信息、在社交网站关注某个用户等。
即使不插入js代码,通过HTML和XSS注入也可以影响页面正常的输出,篡改页面样式,插入图片等。
如果网站A存在XSS漏洞,攻击者将包含攻击代码的链接发送给网站A的用户Foo,当Foo访问这个链接时就会执行攻击代码,从而受到攻击。
存储型XSS(持久型)
存储型XSS也被称为持久型XSS(persistent XSS),这种类型的XSS攻击更常见,危害也更大。它和反射型XSS类似,不过会把攻击代码存储到数据库中,任何用户访问包含攻击代码的页面都会被殃及。
比如,某个网站通过表单接收用户的留言,如果服务器接收数据后未经处理就存储到数据库中,那么用户可以在留言中出入任意javaScript代码。比如攻击者在留言中加入一行重定向代码:
<script>window.location.href=”http://attacker.com”;<script>
其他任意用户一旦访问关于这条留言的页面,包含这条留言的数据就会被浏览器解析,就会执行其中的javaScript脚本。那么这个用户所在页面就会被重定向到攻击者写入的站点。
防范措施
HTML转义
防范XSS攻击最主要的方法是对用户输入的内容进行HTML转义,转义后可以确保用户输入的内容在浏览器中作为文本显示,而不是作为代码解析。
这里的转义和python的概念相同,即消除代码执行时的歧义,也就是把变量标记的内容标记文本,而不是HTML代码。具体来说,这会把变量中与HTML相关的符号转换为安全字符,以避免变量中包含影响页面输出的HTML标签或恶意的javaScript代码。
比如,在flask中我们可以使用JinJa2提供的escape()函数对用户传入的数据进行转义:
from jinja2 import escape
@app.route('/hello')
def hello():
name = request.args.get('name')
response = '<h1>Hello, %s!</h1>' %escape(name)
return response
在Jinja2中,HTML转义相关的功能通过flask的依赖包MarkupSafe实现。
调用escape()并传入用户输入的数据,可以获得转义后的内容,前面的示例中,用户输入的javaScript代码将被转义为:
<script>alert('Bingo!')</script>
转义后,文本中的特殊字符(比如“>”和“<”)都将被转义为HTML实体(character entity),这行文本最终在浏览器中会被显示文文本形式的Hello, <script>alert('Bingo!')</script>!
如图:
在python中,如果你想在单引号标记的字符串中显示一个单引号,那么你需要在单引号前添加一个反斜线来转义它,也就是把它标记为普通文本,而不是作为特殊字符解释。在HTML中,也存在许多保留的特殊字符,比如大于小于号。如果你想以文本显示这些字符,也需要对其进行转义,即使用HTML字符实体表示这些字符。HTML实体就是一些用来表示保留符号的特殊文本,比如<表示小于号,"表示双引号。
一般我们不会再视图函数中直接构造返回的HTML响应,而是会使用Jinja2来渲染包含变量的模板,
验证用户输入
XSS攻击可以在任何用户可定制内容的地方进行,例如图片引用、自定义链接。仅仅转义HTML中的特殊字符并不能完全规避XSS攻击,因为在某些HTML属性中,使用普通的字符也可以插入javaScript代码。除了转义用户输入外,我们还需要对用户的输入数据进行类型验证。在所有接收到用户输入的地方做好验证工作。
以某个程序的用户资料页面为例,我们来演示一下转义无法完全避免的 XSS攻击。程序允许用户输入个人资料中的个人网站地址,通过下面的方式显示在资料页面中:
<a href=”{{url}}”>Website</a>
其中{{url}}部分表示会被替换为用户输入的url变量值。如果不对URL进行验证,那么用户就可以写入javaScript代码,比如”javascript:alert(‘Bingo!’);”。因为这个值并不包含会被转义的<和>。最终页面上的连接代码会变为:
<a href=”javascript:alert(‘Bingo!’);”>Website</a>
当用户单击这个链接时,浏览器就会执行被href属性中设置的攻击代码。
另外,程序还允许用户设置头像图片的URL。这个图片通过下面的方式显示:
<img src=”{{url}}”>
类似的,{{url}}部分表示会被替换为用户输入的url变量值。如果不对输入的URL进行验证,那么用户可以将url设为”xxx”onerror=”alert(‘Bingo!’)”,最终的<img>标签就会变为:
<img src=”xxx”onerror=”alert(‘Bingo!’)”>
在这里因为src中传入了一个错误的URL,浏览器变回执行onerror属性中设置的javaScript代码。
如果你想允许部分HTML标签,比如<b>和<i>,可以使用HTML过滤工具对用户输入的数据进行过滤,仅保留少量允许使用的HTML标签,同时还要注意过滤HTML标签的属性。
XSS攻击原理、示例和防范措施的更多相关文章
- PHP 安全三板斧:过滤、验证和转义之转义篇 & Blade模板引擎避免XSS攻击原理探究
PHP 转义 实现 把输出渲染成网页或API响应时,一定要转义输出,这也是一种防护措施,能避免渲染恶意代码,造成XSS攻击,还能防止应用的用户无意中执行恶意代码. 我们可以使用前面提到的 htmlen ...
- web安全之XSS攻击原理及防范
阅读目录 一:什么是XSS攻击? 二:反射型XSS 三:存储型XSS 四:DOM-based型XSS 五:SQL注入 六:XSS如何防范? 1. cookie安全策略 2. X-XSS-Protect ...
- XSS攻击原理及防御措施
概述 XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器 执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列 表,然后向联系 ...
- JavaScript实现DDoS攻击原理,以及保护措施。
DDos介绍 最普遍的攻击是对网站进行分布式拒绝服务(DDoS)攻击.在一个典型的DDoS攻击中,攻击者通过发送大量的数据到服务器,占用服务资源.从而达到阻止其他用户的访问. 如果黑客使用JavaSc ...
- XSS攻击-原理学习
本文优先发布于简书https://www.jianshu.com/p/04e0f8971890 1.百度百科XSS,跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样 ...
- 155.XSS攻击原理
XSS攻击: XSS(Cross Site Script)攻击叫做跨站脚本攻击,他的原理是用户使用具有XSS漏洞的网站的时候,向这个网站提交一些恶意代码,当用户在访问这个网站的某个页面的时候,这个恶意 ...
- 浅谈XSS攻击原理与解决方法
概述 XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器 执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人 ...
- xss攻击原理与解决方法
概述 XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器 执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列 表,然后向联系 ...
- xss攻击问题以及如何防范
当用户提交评论的时候,比如如下评论内容 111 <scripy>alert(111);</scripy> 这样当现实评论的时候会先弹出111弹框,再显示评论.这就是xss攻击. ...
随机推荐
- Vue 通过 Lodash 限制操作频率
<template> <div id="watch-example"> <p> Ask a yes/no question: <input ...
- MySQL数据库改名的三种方法
前不久去面试,被问到Innodb引擎的表如何改数据库名,当时我也只回答了MyISAM改如何操作,被一些细节问题打败,真是操蛋. 如果表示MyISAM那么可以直接去到数据库目录mv就可以. Innodb ...
- python 字符串、列表和元祖之间的切换
>>> s=['http','://','www','baidu','.com'] >>> url=''.join(s) >>> url 'htt ...
- java poi导入Excel(个人代码)
案例使用的框架:jsp+spring+mybaties <form id="importForm" name="importForm" method=&q ...
- 创建数据表,自定义data element, field等。
参考:https://wenku.baidu.com/view/253ddbfaa5e9856a561260da.html 一:创建域. 使用T-CODE 11 搜索 数据操作系统. 选择domain ...
- PHP 判断括号是否闭合
一开始的思路就是判断每种括号的开闭数量是否相等,其实虽然也能实现但是搞得太复杂了: 后来查了查,只需设一个常量,左括号 +1,右括号 -1,闭合的话为0,没闭合的话不为0, 出现<0即为顺 ...
- 多态使用时,父类多态时需要使用子类特有对象。需要判断 就使用instanceof
instanceof:通常在向下转型前用于健壮性的判断,判断是符合哪一个子类对象 package Polymorphic; public class TestPolymorphic { public ...
- Python第三弹--------文件和异常
文件读取: pi_digits.txt 3.1415926535 8979323846 2643383279 file_reader.py with open('pi_digits.txt') ...
- Mongodb 基础 查询表达式
数据库操作 查看:show dbs; 创建:use dbname; // db.createCollection('collection_name'); 隐式创建,需要创建的数据库中有表才表示创 ...
- tf之get_Variable()
转自:https://blog.csdn.net/UESTC_C2_403/article/details/72327321 1. tf.get_variable(name, shape, init ...