zoukankan      html  css  js  c++  java
  • Django之CSRF跨站请求伪造(老掉牙的钓鱼网站模拟)

    首先这是一个测试的代码

    请先在setting页面进行下面操作

    注释完成后,开始模拟钓鱼网站的跨站请求伪造操作:

    前端代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
    </head>
    <body>
    <form action="" method="post">
        转账人:<input type="text" name="user">
        转账对象:<input type="text" name="to_sb">
        转账金额:<input type="text" name="money">
        <input type="submit" value="转账">
    </form>
    </body>
    </html>

    效果如下(很low):

    视图代码如下:

    def index(request):
        if request.method=='POST':
            user=request.POST.get('user')
            to_sb=request.POST.get('to_sb')
            money=request.POST.get('money')
            #打印一下转账结果
            print('%s给%s转了%s元' % (user,to_sb,money))
            return HttpResponse('转账成功')
    
        return render(request,'index.html')

    如果是一个正常的网站,运行结果应该如下:

    提交:

    后端的结果:

    这样是没有任何问题的,但是如果网站没有进行防CSRF攻击(基本不可能,现在的主流网站都有防CSRF攻击),那么钓鱼网站就可以伪装,进行跨站请求伪造

    接下来是钓鱼网站的视角:

    首先:我看见了下面这个特别low的页面,发现没有防CSRF(等会说防御),直接copy源码

    前端代码:

     然后自己做一个和原网站一模一样的网站:

     简单的模拟一下,网址已经变了

    该网址的前端页面代码:

    <body>
    <form action="http://127.0.0.1:8000/index/" method="post">
        转账人:<input type="text" name="user">
        转账对象:<input type="text" >
        <input type="text" name="to_sb" value="诈骗犯" style="display: none">
        转账金额:<input type="text" name="money">
        <input type="submit" value="转账">
    </form>>

     和原网址的代码对比,其他不变,但是转账对象的name值被取消了,并且还添加了一个input框,该input框的name值,是原转账对象的name值,value值也被写死,还把该标签隐藏,这样你在转账对象中无论输入什么,你都是白给,因为name='to_sb'的这个标签的值已经被固定了,而且该表单的action函数还是原网站,所以说钓鱼网站的后端不用写post请求来之后的操作。

    钓鱼网站的后端代码:

    def test(request):
    
        return render(request, 'test.html')

    也就是说,后端逻辑用的原网站的逻辑,只是简单的固定了转账人的值

    运行一下:

    前端钓鱼页面:

     当前网址还是:

    转账:

    跳到了原网页

    看看原网站的打印输出:

     这样已经老掉牙的钓鱼网站的模型就完成了

    防CSRF跨站请求伪造攻击:

    1.打开注释

    2.在页面中添加:

     这样防御就做好了(所以说是老掉牙的钓鱼攻击)

    测试一下:

    点击转账:

    这是因为在添加了{% csrf_token %}之后,该网站的前端代码已经改变了

     该value是随机的,刷新一下,值就会改变,也就是说,钓鱼网站不能动态的获取,那么CSRF攻击也就没用了

  • 相关阅读:
    (4.24~4.30)
    (4.17~4.23)
    (4.10~4.16)
    FFT题集
    kd树的构造与搜索
    schtasks命令
    关于[WinError 10054] 远程主机强迫关闭了一个现有的连接。
    数据去重复
    将ppt文档转换成pdf
    mvc上传
  • 原文地址:https://www.cnblogs.com/98WDJ/p/10757789.html
Copyright © 2011-2022 走看看