首页 > 其他分享 >csrf跨站请求伪造

csrf跨站请求伪造

时间:2024-03-29 10:01:10浏览次数:22  
标签:function 跨站 return name request 校验 csrf 伪造

csrf跨站请求伪造

(1)介绍

  • 钓鱼网站

    • 我搭建一个跟正规网站一模一样的界面(中国银行)
    • 用户不小心进入我们的网站,用户给某个人打钱
    • 打钱的操作确确实实是提交给了中国银行的系统,用户的钱也确确实实减少了
    • 但是唯一不同的是打钱的账户不是用户想要转过去的账户
  • 内部本质

    • 在钓鱼网站的页面,针对对方账户,只给用户提供一个没有name属性的普通input框
    • 然后再内部隐藏一个已经写好name和value的input框
  • 网站在给用户返回一个具有提交数据功能页面的时候会给这个页面加一个唯一标识

  • 当这个页面朝后端发送post请求的时候 后端会先校验唯一标识,如果唯一标识不对直接拒绝(403 forbbiden) 如果成功则正常执行

(2)如何符合校验

  • form表单放在任意地方
<h1>我是正经网站</h1>
<form action="" method="post">
    {% csrf_token %}
    <p>username: <input type="text" name="username"></p>
    <p>target_user: <input type="text" name="target_user"></p>
    <p>money<input type="text" name="money"></p>
    <input type="submit">
    <input type="submit" value="ajax请求">
</form>
  • ajax校验方式
  • 第一种 利用标签查找获取页面上的随机字符串
<script>
    $('#b1').click(function (){
        $.ajax({
            url: '',
            type:'post',
            data:{'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()},
            success:function (){
            }
        })
    })
</script>
  • 第二种 利用模版语法提供的快捷书写
<script>
    $('#b1').click(function () {
        $.ajax({
            url: '',
            type: 'post',
            data: {'csrfmiddlewaretoken': '{{ csrf_token }}'},
            success: function () {
            }
        })
    })
</script>
  • 第三种 通用方式 导入js代码
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

var csrftoken = getCookie('csrftoken');

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

$.ajaxSetup({
    beforeSend: function (xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});
<!DOCTYPE html>
<html lang="en">
<head>
    {% load static %}
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="{% static 'mysetup.js' %}"></script>
</head>
<body>
<h1>我是正经网站</h1>
<form action="" method="post">
    <p>username: <input type="text" name="username"></p>
    <p>target_user: <input type="text" name="target_user"></p>
    <p>money<input type="text" name="money"></p>
    <input type="submit">
    <input type="submit" value="ajax请求" id="b1">
</form>
</body>
<script>
    $('#b1').click(function () {
        $.ajax({
            url: '',
            type: 'post',
            data: {'username': 'heart'},
            success: function () {
            }
        })
    })
</script>
</html>

(3)csrf相关装饰器

  • 网站整齐都不校验csrf,就单单几个视图需要校验

  • 网站整体都校验csrf,就单单几个视图函数不校验

from django.views.decorators.csrf import csrf_protect,csrf_exempt
"""
csrf_protect 需要校验 把中间件注释
csrf_exempt 忽视校验 把中间件打开
"""

(1)csrf_protect 需要校验

  • FBV直接写在函数上即可
@csrf_protect
@csrf_exempt
def transefer(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        target_user = request.POST.get('target_user')
        money = request.POST.get('money')
        print(f'{username}给{target_user}转了{money}元')
    return render(request, 'transefer.html')
  • CBV和之前用装饰器的方法一样
from django.views.decorators.csrf import csrf_protect,csrf_exempt
from django.views import View
from django.utils.decorators import method_decorator

# 第二种方式
@method_decorator(csrf_protect,name='post')
class MyCsrfToken(View):
    # 第三种方式
    def dispatch(self, request, *args, **kwargs):
        return super(MyCsrfToken, self).dispatch(request, *args, **kwargs

    def get(self,request):
        return HttpResponse('get')
    
    # 第一种方式
    @method_decorator(csrf_protect)
    def post(self,request):
        return HttpResponse('post')

(2)csrf_exempt 忽视校验

  • 只能给dispatch方法加才有效
from django.views.decorators.csrf import csrf_protect,csrf_exempt
from django.views import View
from django.utils.decorators import method_decorator


@method_decorator(csrf_exempt,name='dispatch')
class MyCsrfToken(View):
    
    # 只能给dispatch方法加才有效
    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super(MyCsrfToken, self).dispatch(request, *args, **kwargs

    def get(self,request):
        return HttpResponse('get')
    
    def post(self,request):
        return HttpResponse('post')

标签:function,跨站,return,name,request,校验,csrf,伪造
From: https://www.cnblogs.com/ssrheart/p/18103142

相关文章

  • DVWA-CSRF通关教程-完结
    DVWA-CSRF通关教程-完结文章目录DVWA-CSRF通关教程-完结Low页面使用源码分析漏洞利用Medium源码分析漏洞利用High源码分析漏洞利用impossible源码分析Low页面使用当前页面上,是一个修改admin密码的页面,只需要输入新密码和重复新密码,即可修改admin密码。源码......
  • Day52:WEB攻防-XSS跨站&反射型&存储型&DOM型&标签闭合&输入输出&JS代码解析
    目录XSS跨站-输入输出-原理&分类&闭合XSS跨站-分类测试-反射&存储&DOM反射型XSS存储型XSSDOM-base型XSS:(某案例测试)知识点:1、XSS跨站-输入输出-原理&分类&闭合2、XSS跨站-分类测试-反射&存储&DOMXSS跨站-输入输出-原理&分类&闭合漏洞原理:接受输入数据,输出显......
  • Day53:WEB攻防-XSS跨站&SVG&PDF&Flash&MXSS&UXSS&配合上传&文件添加脚本
    目录MXSSUXSS:UniversalCross-SiteScriptingHTML&SVG&PDF&SWF-XSS&上传&反编译(有几率碰到)SVG-XSSPDF-XSSPython生成XSSFlash-XSS知识点:1、XSS跨站-MXSS&UXSS2、XSS跨站-SVG制作&配合上传3、XSS跨站-PDF制作&配合上传4、XSS跨站-SWF制作&反编译&上传XSS......
  • XSS跨站脚本攻击
    免责声明传播、利用本博客所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本博客及作者不为此承担任何责任,一旦造成后果请自行承担!谢谢!XSS跨站脚本攻击XSS是什么XSS全称呼跨站脚本,是将任意JavaScript代码插入到Web用户页面里执行以达到攻击目的的......
  • Django框架之csrf跨站请求
    【一】跨站请求伪造介绍【1】引入CSRF(Cross-SiteRequestForgery)跨站请求伪造是一种常见的网络攻击方式。攻击者通过诱导受害者访问恶意网站或点击恶意链接将恶意请求发送到目标网站上利用受害者在目标网站中已登录的身份来执行某些操作从而达到攻击的目的。【2】举......
  • Django csrf跨站请求伪造,校验,CBV忽略与允许csrf校验
    csrf跨站请求伪造钓鱼网站,搭建一个网站与正规网站一模一样的界面,用户进入到我们的网站中,给指定用户转账,汇款确实提交到银行,但是收款人确实我们自己定义的人。本质在钓鱼网站的页面针对对方账户,只给用户提供一个没有name属性的普通input框,在内部则隐藏一个已经写好的name和value......
  • SSRF(服务器请求伪造)
    相关函数(php)file_get_contenes()fsockopen()curl_exec()fopen()发掘漏洞当一个服务器有可以解析或读取一个url的时候抓包发现某些参数带有url关键字可能存在ssrf漏洞有某个参数的值是http://的链接原理由于函数使用不当造成的file_get_contents()fsockopen()cur......
  • CSRF & SSRF
    CSRF&SSRFCSRFCSRF(Cross-SiteRequestForgery)(跨站请求伪造漏洞)原理用户访问网站,网站给用户cookie,此时攻击者给用户发送了一个诱惑链接,链接里有对该网站的访问代码,用户点击攻击者的链接后,触发恶意代码,攻击者就利用用户的cookie,执行了对网站的请求(以接口形式调用请求)......
  • xss跨站脚本攻击
    xss(cross-sitescripting)本因为css,因与css样式重名所以更名为xss。xss主要基于js完成恶意攻击XSS危害盗取用户账号窃取用户cookie,冒充用户身份进入网站劫持用户会话,执行任意操作刷流量,执行弹窗广告传播蠕虫病毒XSS漏洞验证PoC(ProofofConcept,概念验证,漏洞验证)EXP(......
  • csrf防御的思考
    关于csrf防御什么是csrfcsrf就是攻击者利用受信任用户的浏览器(利用浏览器的cookie),在其已经登录某个站点(A站点)的情况下,在用户不知情的情况下在A站点执行了恶意操作。恶意url一旦点击,发送请求时浏览器会自动携带cookie从上面简介可知,发生csrf主要在于A站点,没有对发起的请求进行充......