Webug4.0靶场通关笔记17- 第21关文件上传(htaccess)
目录
第21关 文件上传(htaccess)
1.打开靶场
2.源码分析
(1)右键源码
(2)源码分析
3.渗透实战
(1)配置环境
(2)构造脚本
(3)访问脚本
本文通过《webug4.0靶场第21文件上传之htaccess》对客户端前端和服务端的代码进行审计,基于代码审计来分析渗透思路并进行渗透实战,另外本关卡源码有bug需要修改后才可能渗透成功。
第21关 文件上传(htaccess)
1.打开靶场
进入webug4.0靶场的第21关卡文件上传(htaccess),完整URL地址如下所示。
http://192.168.71.1/webug4/control/upload_file/upload_file_5.php
进入靶场后发现这是一个注册账号的页面,包含文件上传的功能,具体如下图所示。
2.源码分析
(1)右键源码
如下所示右键查看源码,发现本关卡依旧存在客户端js绕过,在前端通过js脚本使用白名单校验文件的后缀,具体如下所示。
(2)源码分析
查看upload_file_5.php代码,这段代码的主要功能是处理文件上传操作,源码中过滤了.htacess后缀,不知道写代码的是怎么想的,正常应该是黑名单中无.htaccess才能叫htacess关卡才对,这样才好上传啊。
<?php
// 引入公共配置文件,通常这里面会定义一些全局常量、函数或者加载必要的类库等
require_once "../../common/common.php";// 检查会话中是否存在 'user' 变量
// 如果不存在,说明用户未登录,将用户重定向到登录页面
if (!isset($_SESSION['user'])) {header("Location:../login.php");
}// 定义允许上传的图片文件扩展名数组
$filter = array(".jpg", '.png', '.gif');// 检查上传文件是否出现错误
// 如果存在错误,直接终止脚本执行
if ($_FILES['file']['error']) {die();
}// 检查是否通过 POST 方法提交了表单,并且提交按钮名为 'submit'
if (isset($_POST['submit'])) {// 检查上传文件保存的目录是否存在if (file_exists(TPMELATE."/upload/")) {// 定义不允许上传的文件扩展名数组,包含各种常见的可执行脚本文件扩展名$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");// 获取上传文件的原始文件名,并去除首尾空格$file_name = trim($_FILES['file']['name']);// 获取上传文件的扩展名,包含点号$file_ext = strrchr($file_name, '.');// 将扩展名转换为小写,方便后续比较$file_ext = strtolower($file_ext); // 去除 Windows 系统中可能存在的 ::$DATA 后缀,这是 NTFS 文件系统的流数据标记$file_ext = str_ireplace('::$DATA', '', $file_ext);// 再次去除扩展名首尾的空格$file_ext = trim($file_ext); // 检查文件扩展名是否不在禁止上传的扩展名数组中if (!in_array($file_ext, $deny_ext)) {// 获取上传文件在服务器上的临时文件路径$temp_file = $_FILES['upload_file']['tmp_name'];// 拼接上传文件的保存路径$img_path = TPMELATE."/upload/".'/'.$file_name;// 尝试将临时文件移动到指定的保存路径if (move_uploaded_file($temp_file, $img_path)) {// 若移动成功,设置上传成功标志$is_upload = true;} else {// 若移动失败,设置错误消息$msg = '上传出错!';}} else {// 若文件扩展名在禁止上传的数组中,设置错误消息$msg = '此文件类型不允许上传!';}} else {// 若上传文件保存的目录不存在,设置错误消息$msg = TPMELATE."/upload/" . '文件夹不存在,请手工创建!';}
}// 引入上传文件的 HTML 页面
require_once TPMELATE."/upload_file_1.html";
这样就只能是先通过生僻字法上传.htaccess文件(完全没意义啊,因为这样子直接可以上传php文件了,又何苦多此一举),再进行处理才能符合这个题目的含义。猜测是靶场的开发者写代码时出了异常,产生了bug,对其进行简单修改,将黑名单的.htaccess删掉,这样就可以通过.htaccess 文件解析使上传图片成功。
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
除此之外,这个关卡啥报文都上传不成功,代码具有大bug,需要对文件上传部分进行处理,这是因为$temp_file = $_FILES['upload_file']['tmp_name'];这句话处理有问题,需要修改为
$temp_file = $_FILES['file']['tmp_name'];
修改后的代码如下所示。
<?phprequire_once "../../common/common.php";
if (!isset($_SESSION['user'])) {header("Location:../login.php");
}
$filter = array(".jpg", '.png', '.gif');if ($_FILES['file']['error']) {die();
}if (isset($_POST['submit'])) {if (file_exists(TPMELATE."/upload/")) {$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");$file_name = trim($_FILES['file']['name']);$file_ext = strrchr($file_name, '.');$file_ext = strtolower($file_ext); //转换为小写$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA$file_ext = trim($file_ext); //首尾去空if (!in_array($file_ext, $deny_ext)) {$temp_file = $_FILES['file']['tmp_name'];$img_path = TPMELATE."/upload/".'/'.$file_name;if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true;} else {$msg = '上传出错!';}} else {$msg = '此文件类型不允许上传!';}} else {$msg = TPMELATE."/upload/" . '文件夹不存在,请手工创建!';}
}require_once TPMELATE."/upload_file_1.html";
3.渗透实战
由于对文件的检查是客户端处理,故而可以在客户端上传图片,绕过客户端的前端检查然后在bp中修改报文并将报文后缀改为info.jpg 发送到服务器。
(1)配置环境
windows下的php study的php需要配置为ts版本才可以支持.htaccess,否则不支持。
首页启动Apache(注意不是Nginx),如下所示。
php版本不可以是nts版本,需要切换为ts版本。
(2)构造脚本
将info.php修改为info.jpg,如下所示。
bp开启拦截功能,firefox浏览器开启代理。
将info.jpg上传,并使用bp抓包,同时将报文发送给repeater。
点击发送,成功上传info.jpg,接下来上传.htaccess文件,直接在bp中修改报文内容如下所示,文件名改为.htaccess,内容改为如下内容。
<FilesMatch "info.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
.htaccess文件的作用是将指定info.jpg按照php格式执行,这样上传info.jpg后,这个info.jpg将被当作php文件执行。
(3)访问脚本
http://192.168.71.1/webug4/template/upload/info.jpg
如下所示访问渗透成功,访问的正是ts版本的服务器内容。
相关文章:
Webug4.0靶场通关笔记17- 第21关文件上传(htaccess)
目录 第21关 文件上传(htaccess) 1.打开靶场 2.源码分析 (1)右键源码 (2)源码分析 3.渗透实战 (1)配置环境 (2)构造脚本 (3)访问脚本 本文通过《webu…...
ASP.NET Core 中间件
文章目录 前言一、中间件的本质定义:类比: 二、作用场景:三、中间件的执行顺序四、中间件的配置方式1)委托形式(最常见):2)类形式: 五、核心方法六、注意事项七、中间件 …...
Linux:进程间通信---命名管道共享内存
文章目录 1.命名管道1.1 命名管道是什么1.2 如何创建命名管道1.3 如何通过命名管道实现进程间通信 2. 共享内存2.1 共享内存的原理2.2 共享内存的系统接口与接口的调用2.3 共享内存的挂接2.4 共享内存的特性 序:在上一章对用来进行进程间通信的匿名管道进行了详细的…...
一个基于Asp.Net Core + Angular + Bootstrap开源CMS系统
从零学习构建一个完整的系统 推荐一个功能强大、易于扩展、安全可靠的开源内容管理系统,适用于各种类型和规模的网站。 项目简介 MixCoreCMS是一个基于.NET Core框架的开源内容管理系统(CMS),提供了丰富的的基础功能和插件&…...
ECMAScript 6(ES6):JavaScript 现代化的革命性升级
1. 版本背景与发布 发布时间:2015 年 6 月,由 ECMA International 正式发布,标准编号为 ECMA-262 Edition 6(后称 ES2015)。历史意义: JavaScript 诞生 20 年后的革命性升级,首次引入类&#…...
基于WebUI的深度学习模型部署与应用实践
引言 随着深度学习技术的快速发展,如何将训练好的模型快速部署并提供友好的用户交互界面成为许多AI项目落地的关键。WebUI(Web User Interface)作为一种轻量级、跨平台的解决方案,正被广泛应用于各类AI模型的部署场景。本文将详细介绍基于Python生态构建WebUI的技术方案,包…...
MySQL表的增删查改
目录 一、MySQL表的增删查改二、Create单行数据全列插入多行数据 指定列插入插入否则更新替换数据 三、RetrieveSELECT 列WHERE 条件NULL的查询结果排序筛选分页结果 四、Update将孙悟空同学的数学成绩修改为80分将曹孟德同学的数学成绩修改为60分,语文成绩修改为7…...
Android第六次面试总结之Java设计模式(二)
一、适配器模式(Adapter Pattern) 1. ListView vs RecyclerView 的 Adapter 核心区别?为什么 RecyclerView 需要 ViewHolder? 解答: 核心区别: 特性ListView.Adapter(如 ArrayAdapter…...
QuecPython+腾讯云:快速连接腾讯云l0T平台
该模块提供腾讯 IoT 平台物联网套件客户端功能,目前的产品节点类型仅支持“设备”,设备认证方式支持“一机一密”和“动态注册认证”。 BC25PA系列不支持该功能。 初始化腾讯 IoT 平台 TXyun TXyun(productID, devicename, devicePsk, ProductSecret)配置腾讯 IoT…...
说下RabbitMQ的整体架构
RabbitMQ 是一个基于 AMQP(Advanced Message Queuing Protocol) 协议的开源消息中间件,RabbitMQ的整体架构围绕消息的生产、路由、存储和消费设计,旨在实现高效、可靠的消息传递,它由多个核心组件协同工作。 核心组件 …...
Qt Creator 网络编程----Socket客户端服务端
1、在Qt项目中的.pro中添加 network模块,用于Socket网络编程使用 QT network 2、相关Tcp网络通信协议头文件 #include <QtNetwork/QTcpServer> #include <QtNetwork/QTcpSocket> #include <QtNetwork/QHostAddress> 3、Qt socket运行实…...
《深度学习实践教程》[吴微] ch-5 3/5层全连接神经网络
一、练习课本上3层全连接神经网络识别手写数字。 答案代码: import torch from torch import nn, optim from torch.autograd import Variable from torch.utils.data import DataLoader from torchvision import datasets, transforms# 定义一些超参数 batch_size…...
OrcaFex11.5
OrcaFlex 11.5是一款专业的海洋工程动态分析软件 由英国Orcina公司开发 主要用于模拟和分析海洋结构物在复杂海洋环境中的动态响应 该软件广泛应用于海上油气开发 海上风电 海洋可再生能源等领域 OrcaFlex 11.5具有强大的建模和仿真能力 支持多种海洋结构物的模拟 包括船舶 …...
MUX-vlan
MUX-VLAN 理论环节 1. 定义与核心作用 Principal VLAN(主VLAN) 是 MUX VLAN(Multiplex VLAN)架构的核心组件,充当公共资源的访问枢纽,实现以下核心功能: 资源共享:允许所有从VLAN…...
vue3中解决 return‘ inside ‘finally‘ block报错的问题
vue3中解决 return’ inside ‘finally’ block报错的问题 这个错误信息通常表明你在使用Vue 3框架时,在finally块中不正确地使用了return语句。在JavaScript中,finally块是保证执行的最后一个代码块,用于释放资源或执行清理操作,…...
TestStand API 简介
TestStand API 简介 在自动化测试领域,TestStand 凭借其灵活的架构和强大的功能,成为众多开发者的首选工具。而 TestStand API(Application Programming Interface,应用程序编程接口)则是打开 TestStand 强大功能的 “…...
vue2+element实现Table表格嵌套输入框、选择器、日期选择器、表单弹出窗组件的行内编辑功能
vue2element实现Table表格嵌套输入框、选择器、日期选择器、表单弹出窗组件的行内编辑功能 文章目录 vue2element实现Table表格嵌套输入框、选择器、日期选择器、表单弹出窗组件的行内编辑功能前言一、准备工作二、行内编辑1.嵌入Input文本输入框1.1遇到问题1.文本框内容修改失…...
【Docker系列】使用格式化输出与排序技巧
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
针对面试-redis篇
1. 缓存穿透 什么是缓存穿透? 缓存穿透就是有人查询一个不存在的数据,数据库查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库。 解决方案一:缓存空数据 当数据库中不存在该数据时,直接把查到的空数据给…...
HTML8:媒体元素
视频和音频 视频元素 video 音频 audio <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>媒体元素学习</title> </head> <body> <!--音频和视频 src:资源路径 controls:控制条…...
把其他conda的env复制到自己电脑的conda上
把其他conda的env复制到自己电脑的conda上 一 拷贝 将要拷贝的env环境拷贝到自己电脑的放置env环境的文件夹中 二 添加配置 找到.conda文件夹下的environments.txt文件,添加配置 三 测试 查看环境是否拷贝成功 激活环境 自此就拷贝成功了!&am…...
抖音热门视频评论数追踪爬虫获取
自动追踪抖音账号收藏夹视频的评论数变化 功能: 1、自动追踪特定抖音账号收藏夹视频热度变化,评论增速超过x,自动通知到钉钉或飞书 2、最新最先进的js逆向算法,无封号风险 3、支持私有化定制 4、可同时追踪500-5w个视频的热度…...
Hive优化秘籍:大数据处理加速之道
目录 一、认识 Hive 性能瓶颈 二、优化从基础开始:查询语句 2.1 列与分区裁剪 2.2 谓词下推 2.3 合理使用排序 三、解决数据倾斜难题 3.1 数据倾斜原因剖析 3.2 针对性优化策略 四、优化 join 操作 4.1 MapJoin 的应用 4.2 大表 join 优化技巧 五、调整 …...
机器学习例题——预测facebook签到位置(K近邻算法)和葡萄酒质量预测(线性回归)
一、预测facebook签到位置 代码展示: import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import…...
10B扩散文生图模型F-Lite技术报告速读
F Lite 技术报告解析 一、研究背景与目标 F Lite 是一个开源的 100 亿参数文本到图像的扩散变换器(DiT)模型。该研究的目标是探索在中等数据规模和计算资源条件下,大规模扩散模型的性能边界。F Lite 基于 Freepik 内部数据集训练࿰…...
源码分析之Leaflet中Marker
概述 Marker类用于创建一个标记点对象,可以用于在地图上添加标记点。Marker类继承自Layer类,提供了一些方法用于创建标记点对象。 源码分析 源码实现 Marker类实现如下: export var Marker Layer.extend({options: {icon: new IconDefault(), // 默认图标实例…...
从0开始学习大模型--Day2--大模型的工作流程以及初始Agent
大模型的工作流程 分词化(Tokenization)与词表映射 分词化(Tokenization)是自然语言处理(NLP)中的重要概念,它是将段落和句子分割成更小的分词(token)的过程。 将一个…...
P48-56 应用游戏标签
这一段课主要是把每种道具的游戏Tag进行了整理与应用 AuraAbilitySystemComponentBase.h // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "AbilitySystemComponent.h"…...
4.29 tag的完整实现和登录页面的初步搭建
解释了v-for中每个属性的作用: 打印当前route的信息:(里面会有path的信息)当前的路由信息吧! handleMenu() 菜单选择!点击左侧菜单的栏目就会显示在Home.vue的tag上 这个方法的作用是让Home.vue上出现对应的…...
【Vue.js】 插槽通信——具名插槽通信
目录 前景基本语法命名规则默认内容使用建议 具体实例父组件 index.vue子组件 Category.vue 效果 前景 下面的父子组件代码仍然在Vue.js演练平台直接运行 基本语法 在子组件中定义插槽 <!-- Category.vue --> <slot name"插槽名称">默认内容</slo…...
从设备交付到并网调试:CET中电技术分布式光伏全流程管控方案详解
四月的最后一个工作日,当分布式光伏电站并网指示灯依次亮起的瞬间,CET中电技术与客户共同交出了一份满意的答卷。面对430政策窗口期的考验,我们凭借可靠的技术和高效的团队协作,在系统调试与并网对接的每个步骤都展现出过硬能力&a…...
(十)深入了解AVFoundation-采集:录制视频功能的实现
引言 在前文章中,我们深入探讨了如何通过 AVCaptureSession 配置 iOS 中的捕捉输入及输出。并通过使用 AVCaptureDeviceInput 和 AVCapturePhotoOutput,我们实现了基础的照片捕获功能,并配置了 PHPreviewView 来显示实时预览。 在本篇中&am…...
数据分析汇报七步法:用结构化思维驱动决策
在当今数据驱动的商业环境中,高效的数据汇报不仅是信息传递的工具,更是撬动决策的杠杆。基于您提供的五张核心图示,我们提炼出一套「七步汇报框架」,将复杂的数据分析转化为清晰的行动指南。这套方法论通过「现状-诊断-预见…...
推荐两本集成电路制作书籍
本书共分19章,涵盖先进集成电路工艺的发展史,集成电路制造流程、介电薄膜、金属化、光刻、刻蚀、表面清洁与湿法刻蚀、掺杂、化学机械平坦化,器件参数与工艺相关性,DFM(Design for Manufacturing)ÿ…...
认识Grafana及其面板(Panel)
Grafana简介 Grafana 是一款开源的数据可视化与监控平台,以其强大的数据展示能力、灵活的插件生态和广泛的兼容性,成为企业监控、IT运维、DevOps、物联网(IoT)和业务分析等领域的核心工具。 数据源(Data Source) 对于Grafana而言,Promethe…...
FlinkCDC采集MySQL8.4报错
报错日志 原因: MySQL8.4版本中弃用show MASTER STATUS语法 改为:SHOW BINARY LOG STATUS 解决方案: 1、降MySQL版本 2、修改源码...
Webview通信系统学习指南
Webview通信系统学习指南 一、定义与核心概念 1. 什么是Webview? 定义:Webview是移动端(Android/iOS)内置的轻量级浏览器组件,用于在原生应用中嵌入网页内容。作用:实现H5页面与原生应用的深度交互&…...
人工智能如何革新数据可视化领域?探索未来趋势
在当今数字化时代,数据如同汹涌浪潮般不断涌现。据国际数据公司(IDC)预测,全球每年产生的数据量将从 2018 年的 33ZB 增长到 2025 年的 175ZB。面对如此海量的数据,如何有效理解和利用这些数据成为了关键问题。数据可视…...
探索Hello Robot开源移动操作机器人Stretch 3的新技术亮点与市场定位
Hello Robot 推出的 Stretch 3 机器人凭借其前沿技术和多功能性在众多产品中占据优势。Stretch 3 机器人采用开源设计,为开发者提供了灵活的定制空间,能够满足各种不同的需求。其配备的灵活手腕组件和 Intel Realsense D405 摄像头,显著增强了…...
机器人系统设置
机器人系统设置 机器人系统设置与操作指南 1. 系统设置基础功能 偏好设置 控制柜名称修改:通过文本框输入新名称并确认主题切换:支持橙色/蓝色主题(需重启生效) 语言与日期 系统语言/键盘语言设置时间格式:支持系统时…...
C/C++ 扩展智能提示太慢或无法解析项目
问题 C/C 扩展不解析项目,导致源码中的变量、函数都为灰色状态,无法进行跳转。 有时候 log 会报如下错误: Attempting to get defaults from C compiler in "compilerPath" property: D:/Development/Tools/mingw64/bin/gcc.exe…...
通过Kubernetes 外部 DNS控制器来自动管理Azure DNS 和 AKS
前言: 将应用程序及其服务部署到 Kubernetes 集群后,一个问题浮现:如何使用自定义域名访问它?一个简单的解决方案是创建一条 A 记录,将域名指向服务 IP 地址。这可以手动完成,但随着服务数量的增加&#x…...
Elasticsearch知识汇总之ElasticSearch监控方案
八 ElasticSearch监控方案 8.1 ElasticSearch监控指标 监控指标为磐基生产项指标,以下‘监控项名称’‘指标名称 ‘使用的公式‘都已详细说明,图表如下: 监控项名称 指标英文名称 使用的公式 elasticsearch集群健康状态 Elastic_Cluster…...
【能力比对】K8S数据平台VS数据平台
🔥🔥 AllData大数据产品是可定义数据中台,以数据平台为底座,以数据中台为桥梁,以机器学习平台为中层框架,以大模型应用为上游产品,提供全链路数字化解决方案。 ✨AllData数据中台官方平台&…...
AutoDL+SSH在vscode中远程使用GPU训练深度学习模型
注册AutoDL账号 AutoDL官网:AutoDL 注册登录之后,如果你是学生,一定要进行学生认证,可以省钱。 认证之后,打开算力市场, 进行GPU选择 根据自己需要的环境选择版本 ,选好之后创建并开机 这里注…...
【C语言干货】野指针
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、什么是野指针?二、野指针的三大成因 1.指针未初始化2.指针越界访问2.指针指向已释放的内存 前言 提示:以下是本篇文章正文内容&…...
QT生成保存 Excel 文件的默认路径,导出的文件后缀自动加(1)(2)等等
//生成保存 Excel 文件的默认路径 QString MainWidget::getDefaultFilePath() const { QString basePath pathEdit->text(); if (basePath.isEmpty() || !QDir(basePath).exists()) { basePath QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); } r…...
React Native【详解】搭建开发环境,创建项目,启动项目
下载安装 node https://nodejs.cn/download/ 查看 npx 版本 npx -v若无 npx 则安装 npm install -g npx创建项目 npx create-expo-applatestRN_demo 为自定义的项目名称 下载安装 Python 2.7 下载安装 JAVA JDK https://www.oracle.com/java/technologies/downloads/#jdk24-…...
AIDC智算中心建设:存储核心技术解析
目录 一、智算中心存储概述 1、存储发展 2、智算存储指导政策 3、智算智能存储必要性 二、智算中心存储架构及特征 1、智算存储中心架构 2、智算存储特征 三、智算中心存储核心技术解析 1、长记忆存储范式为推理提质增效 2、数据编织加强全局数据高效处理 3、超节点…...
第11次:用户注册(完整版)
第一步:定义用户模型类 class User(AbstractUser):mobile models.CharField(max_length11, uniqueTrue, verbose_name手机号)class Meta:db_table tb_userverbose_name 用户verbose_name_plural verbose_namedef __str__(self):return self.username第二步&…...