【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

🤵‍♂️ 个人主页: @计算机魔术师 👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
🌐 推荐一款找工作神器网站: ​​牛客网🎉🎉|笔试题库|面试经验|实习招聘内推 ​​​ 还没账户的小伙伴 ​​​速速点击链接跳转牛客网登录注册​​ 开始刷爆题库,速速通关面试吧🙋‍♂️
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

该文章收录专栏 ✨—【Django | 项目开发】从入门到上线 专栏—✨

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
@[toc]
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

一、演示CSRF漏洞

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

二、环境准备

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

假设我们此时有一个视图用于创建 ​ ​hr​​​管理员,不受​ ​csrf_token​​保护的情况

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
* 创建注册模板页面
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
{% extends 'base.html' %}

{% block content %}

{# onload = 'document.EvilForm.submit() #}
<form action="/create_hr_user/" method="post" name="EvilForm">
{# required 表示必填 #}
First name <input name="username" value="attacker" type="text" required/>
First password <input name="username" value="attacker123" type="password" required/>
Second password <input name="username" value="attacker123" type="password" required/>

<input type="submit" value="提交"/>
</form>


{% endblock %}

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
* 创建对应视图
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
![【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"z")
"""演示CSRF漏洞(cross site request forge)"""from django.contrib.auth.models import Group, Userfrom django.views.decorators.csrf import csrf_exemptfrom django.contrib.auth.decorators import permission_requiredfrom django.contrib import messages@csrf_exempt  # 设置为不处理csrf攻击@permission_required('auth.add_user')  # 只允许拥有创建用户的权限的用户def create_hr_user(request):    if request.method == 'GET':        return render(request, 'create_hr_user.html', {})    if request.method == 'POST':        username = request.POST.get('username')        password = request.POST.get('password')        hr_group = Group.objects.create(name='hr')        user = User(is_superuser=False, username=username, is_staff=True, is_active=True)        user.set_password(password)        user.save()        # 添加一个群组对象        user.groups.add(hr_group)        messages.info(request, '成功添加用户hr ')        return render(request, 'create_hr_user.html')    return render(request, 'create_hr_user.html')
![【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"z")

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
* 添加​ &#x200B;url&#x200B;
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
![【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"z")
from django.conf import settings# 演示CSRF 跨站请求伪造# 测试是否为开发环境if settings.DEBUG:    urlpatterns += (        path('create_hr_user', jobs.views.create_hr_user, name='create_hr_user')    )
![【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"z")

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
表单演示
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

三、模拟黑客🐱‍👤

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
现在让我们看看如何在管理员不知情的情况下添加用户
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

攻击者提供一个页面,诱导管理员点击该页面,此时改​ &#x200B;url&#x200B;​​会自动提交,改​ &#x200B;url&#x200B;​会直接调用之前创建管理员的页面,创建用户

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
作为一名黑客,我现在创建了一个页面,当超级管理员单击更改页面链接时,将自动创建该页面。(跨站点行为)
[En]

As a hacker, I now create a page, which will be automatically created when the Super Admin clicks the change page link. (cross-site behavior)

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body onload='document.EvilForm.submit()' >
<form action="http://127.0.0.1:8000/create_hr_user/" method="post" name="EvilForm">
First name <input name="username" value="attacker_coming" type="text" required/>
First password <input value="attacker123" type="password" name="password" required/>
Second password <input value="attacker123" type="password" name="retype_password" required/>

<input type="submit" value="提交"/>
form>


body>
html>

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
让我们在此页面上运行服务器(端口7000)
[En]

Let’s run the server on this page (port 7000)

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
![【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"z")
python -m http.server 7000
![【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"z")

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
此时,管理员将访问此页面。
[En]

At this point, the administrator visits this page.

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
自动添加成功!😱
[En]

Automatically added successfully! 😱

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
这里演示是让管理员自动创建了一名​ &#x200B;hr&#x200B;​,但实际上我们还可以进行账号转账,信息泄露等其他操作🤯。
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

四、解决办法

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

我们只要使用django自带​ &#x200B;csrf &#x200B;​​处理即可,django在处理每一个页面都会传递一个​ &#x200B;csrf_token&#x200B;​​,在表单form中则需要添加​ &#x200B;{% token %}&#x200B;​​ 在页面渲染出来,这样客户端页面会将​ &#x200B;csrf_token&#x200B;​​带回服务器,服务端检查​ &#x200B;token&#x200B;​,合法则则正常处理请求

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
修改原视图 — 删除​ &#x200B;@csrf_exempt&#x200B;​ :
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
![【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"z")
@permission_required('auth.add_user')  # 只允许拥有创建用户的权限的用户def create_hr_user(request):    if request.method == 'GET':        return render(request, 'create_hr_user.html', {})    if request.method == 'POST':        username = request.POST.get('username')        password = request.POST.get('password')        hr_group = Group.objects.get(name='HR')        user = User(is_superuser=False, username=username, is_staff=True, is_active=True)        # hash 哈希加密密码(如果是明文会报错)        user.set_password(password)        user.save()        # 添加一个群组对象        user.groups.add(hr_group)        messages.info(request, '成功添加用户hr!!!')        return render(request, 'create_hr_user.html')    return render(request, 'create_hr_user.html')
![【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"z")

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
此时,我们再次访问恶意页面(访问失败🎉🎉🎉)
[En]

At this point, we visit the malicious page again ( * failed to access * 🎉🎉🎉)

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
这是因为没有密钥&#x200B;<strong>token</strong>&#x200B;没有用作安全校验的&#x200B;<strong>csrf_token</strong>&#x200B;.,服务在请求一个页面会在​ &#x200B;request&#x200B;​​的​ &#x200B;head&#x200B;​​头部存放​ &#x200B;csrftokn&#x503C;&#x200B;​​,一般是放在​ &#x200B;cookie&#x200B;​​中,当页面响应中会在​ &#x200B;response&#x200B;​​中返回​ &#x200B;cookie&#x200B;​​此时服务器如果在​ &#x200B;cookie&#x200B;​​中找到所发送对应的​ &#x200B;csrftoken&#x200B;​则会对其请求进行处理,否则访问失败
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
并且先前为演示文稿创建的表单模板将不可访问。
[En]

And the form template previously created for the presentation will not be accessible.

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
这是由于没有 ​ &#x200B;{csrf_token%}&#x200B;​,添加代码即可访问
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
<form action="/create_hr_user/" method="post" name="EvilForm">
{# required 表示必填 #}
{% csrf_token %}
First name <input name="username" value="attacker" type="text" required/>
First password <input value="attacker123" type="password" name="password" required/>
Second password <input value="attacker123" type="password" name="retype_password" required/>

<input type="submit" value="提交"/>
form>

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

五、SQL注入攻击漏洞

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
我们需要使用​ &#x200B;map&#x200B;​​的方法传参就可以避免这种漏洞, 这种漏洞与​ &#x200B;xxs&#x200B;​漏洞是类似的(上一篇文章)
【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
![【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"z")
🤞在这里,如果你有任何问题,🤞🎩欢迎博客作者的私信。哦,博主们会尽力为你答疑解惑的!如果🎩🥳对你有帮助,那么你的赞扬就是对博客作者最大的支持!🥳<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>🤞 is here, if you have any questions, 🤞 🎩 welcome private messages from bloggers. Oh, bloggers will try their best to answer questions for you! If 🎩 🥳 is helpful to you, your praise is the greatest support for bloggers! 🥳</font>*</details>
![【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"z")

Original: https://blog.51cto.com/u_15691039/5637380
Author: 计算机魔术师
Title: 【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/500220/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • pandas 常用 API

    https://www.pypandas.cn/docs/getting_started/10min.html#%E7%94%9F%E6%88%90%E5%AF%B9%E8%B1%…

    Python 2023年8月21日
    094
  • Python之pip和venv

    python除了官方的标准库,还有很多第三方库,网址: https://pypi.org/我们可以使用pip命令来安装它。pip是python的第三方库安装工具。 pip命令 pi…

    Python 2023年9月18日
    093
  • 相关系数与python实现

    文章目录 1. 皮尔逊相关系数 2. 斯皮尔曼相关系数 3. kendall 系数 参考资料 皮尔逊相关系数 适用数据:用于横向两个连续性随机变量间的相关系数。数据要求:实验数据之…

    Python 2023年8月28日
    085
  • pandas学习汇总(关于怎样处理数据与分析)

    不知道有没有小伙伴跟我一样,之前也断断续续学习过python相关的知识,可是迟迟就是入不了门,开始是出现了问题,不知道怎么解决问题,动不动就是入门到放弃;后续是认认真真看视频,认认…

    Python 2023年8月7日
    080
  • 瑞吉外卖实战项目全攻略——第六天

    瑞吉外卖实战项目全攻略——第六天 该系列将记录一份完整的实战项目的完成过程,该篇属于第六天 案例来自B站黑马程序员Java项目实战《瑞吉外卖》,请结合课程资料阅读以下内容 该篇我们…

    Python 2023年10月18日
    097
  • Prometheus学习记录【一】

    Prometheus学习记录【一】 1 写在前面 * 1.1 缘起何处? 1.2 现有技能 1.3 学习目标 2 正文 * 2.1 从了解监控开始 – 2.1.1 监控…

    Python 2023年6月11日
    088
  • python—模仿键盘

    python—模仿键盘 原创 夕陌2022-07-19 11:24:32©著作权 文章标签 文本框 百度 搜索 文章分类 Python 后端开发 ©著作权归作者所有:来…

    Python 2023年5月25日
    0183
  • Single electron atomic structure

    def playscene1(): title = Text(‘单电子原子结构’, font=’STZhongsong’) ext({1:’1913年,丹麦物理学家 Bohr 提出…

    Python 2023年6月12日
    0105
  • Python ORM框架:SQLAlchemy 的基础用法

    文章目录 一、SQLAlchemy 介绍 * 1.1 ORM 的概念 1.2 SQLAlchemy介绍 1.3 架构 1.4 异步 1.5 安装 二、SQLAlchemy 快速入门…

    Python 2023年8月4日
    097
  • RuntimeError: DataLoader worker (pid(s) 8548, 6916) exited unexpectedly

    经过了两天的摸索,对于这个问题,终于圆满的解决了,对于一个深度学习的小白来说,面对这样的问题,实在太难受了。 在这几天里,不断去找一些博客的经验,很多都说把num_workers设…

    Python 2023年9月27日
    097
  • 对给定的数组进行重新排列numpy.random.shuffle()和numpy.random.permutation()

    【小白从小学Python、C、Java】 【计算机等级考试+500强双证书】 【Python-数据分析】 对给定的数组进行重新排列 numpy.random.shuffle()和 …

    Python 2023年8月26日
    0102
  • 什么是广播机制

    学过代数的同学可能会知道,矩阵运算往往都是在两个维度相同或者相匹配(前面矩阵的列数等于后一个矩阵的行数)的矩阵之间定义的。比如加减法需要两个矩阵的维度相同,乘法需要前一个矩阵的列数…

    Python 2023年8月29日
    0119
  • yolov5的head修改为decouple head

    yolov5的head修改为decouple head yolox的decoupled head结构 本来想将yolov5的head修改为decoupled head,与yolox…

    Python 2023年8月1日
    081
  • 2023跨年代码(烟花+雪花)

    一眨眼,马上就2023年了,祝大家在新的一年里:身体健康平安,生活充实饱满,事业步步高升,心情阳光灿烂,财运滚滚而来,家庭美满幸福,新年开心快乐! 本文将给大家分享一些跨年代码,基…

    Python 2023年8月12日
    0196
  • [深度学习]如何替换YoloV5的主干网络:Flexible-Yolov5

    Flexible-Yolov5:可自定义主干网络的YoloV5工程实践 本文目录: 概述 理论学习与环境配置 准备自己的数据集 修改或调整自定义的主干网络 部署训练 一、概述 Yo…

    Python 2023年8月2日
    0125
  • Scrapy与MongoDB交互

    Pipeline.py class MongoDBPipeline: def __init__(self,conn,database): self.conn = conn self…

    Python 2023年10月5日
    065
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球