MySQL注入笔记

本文详细介绍了MySQL数据库的基础结构,包括库、表、列和值的概念,以及如何进行数据库连接和基本的SQL操作。同时,讨论了内建库information_schema的重要性和MySQL相关函数的使用。此外,深入探讨了SQL注入的概念、危害、类型以及防御措施,特别提到了宽字节注入的原理和绕过方法。最后,通过sqli_labs实例展示了SQL注入的实战演练。
摘要由CSDN通过智能技术生成

目录

MySQL

MySQL简介

MySQL基础结构

数据库连接

基础语法

内置库知识

 MySQL相关函数

内联注释的特性

SQL注入实战

sqli_labs搭建

SQL注入简介

SQL注入漏洞的危害

SQL注入类型

类型详解

宽字节注入


  • MySQL

  • MySQL简介

MySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系型数据库管理系统)应用软件之一。

  • MySQL基础结构

库:MySQL下可以存在多个库,可以理解为一个仓库。

表:一个库下可以窜访多个表,仓库内的储物架。

列:字段名,类似表格的列,储物架上的不同的列。

值:存放的数据,存放的工具。

  • 数据库连接

明文连接

mysql -h127.0.0.1 -P3306 -uroot -proot

密文连接

mysql -uroot -p

Enter password:****

  • 基础语法

查询当前数据库版本             select version();

查询当前数据库                    select database();

查询当前数据库用户             select user();

查询当前路径                        select @@basedir;

查询所有数据库                    show databases;

选择一个数据库                    use + 数据库名;

查询当前数据库                    select database();

查询所有表名                        show tables;

创建一个数据库                     create database 数据库名;

删除一个数据库                     drop database 数据库名;

查询一个表的结构                 desc 表名;

查询服务期的系统版本          select @@version_compile_os;

查询数据库                            select schema_name from information_schema.schemata;

查询表名                               select table_name from information_schema.tables where table_schema='库名' limit 0,1;

查询列名                               select column_name from information_schema.columns where table_schema='库名' and table_name='表名' limit 0,1;

创建表

语法:create table 数据表名字(字段 类型 约束[,字段 类型 约束]);

约束:auto_increament 表示自动增长

          not null 表示不能为空

          primary key 表示主键

          default   默认值

插入数据

语法:insert into 表名(字段名1,字段名2,...)values(值1,值2,...);      //指定字段名

           insert into 表名 values(值1,值2,...);               //不指定字段名

           insert into 表名(字段名1,字段名2,...)values(值1,值2,...)(值1,值2,...)...;                                               //同时添加多条数据

删除数据           

语法:delete from 表名 where 条件表达式;               //删除指定数据

           delete from 表名;                                            //删除所有数据

更新数据

语法:update 表名 set 字段名1=值1,[,字段名2=值2,...][where 条件表达式];    //更新指定数据

           update 表名 set 字段名=xx;                            //更新全部数据

查询数据

语法:select 字段名1,字段名2,...from 表名;           //查询所有数据

           select * from 表名;                                           //查询所有数据

           select 字段名1,字段名2,...from 表名;            //查询指定的部分字段

           select 字段名1,字段名2,...from 表名 where 条件表达式;    //带关系运算符的查询

           select * 字段名1,字段名2,... from 表名 where 字段名 [NOT] IN (元素1,元素2,...);                                                   //带IN关键字的查询

           select * {字段1,字段2,...} from 表名 where 字段名[NOT] BETWEEN 值1 AND 值2;                                                             //带BETWEEN AND 关键字的查询

           select * 字段名1,字段名2,... from 表名 where 字段名 IS [NOT] NULL;                         //空值查询

           select distinct 字段名 from 表名;                        //用来过滤重复值得出现

           select * | 字段名1,字段名2,... from 表名where字段名 [NOT] LIKE '匹配字符串';                           //带LIKE关键字的查询,查询数据库中“x%”表示查询以字符x开头的字符串;下划线通配符只能表示单个字符,如果需要匹配多个字符,需要使用多个下划线通配符。

           select * | 字段名1,字段名2,... from 表名 where 条件表达式1 AND 条件表达式2;                       //带AND 关键字的查询

           select * | 字段名1,字段名2,... from 表名 where 条件表达式1 or 条件表达式2 or ...;                                        //带OR关键字的查询

  • 内置库知识

        在MySQL>5.0的版本中,把information_schema看作是一个自带的内置数据库,也是信息数据库。

        schemata表:schema_name这个字段,它存放着所有数据库库名。

        tables表:table_name用来存放所有数据库的表名。

        columns表:用来存放数据库里所有字段信息。

                            table_schema列用来存放数据库库名字段

                            table_name列用来存放所有数据

                            column_name列用来存放所有的字段/内容

  •  MySQL相关函数

hex()函数:参数可用于任何参数外面,对数据进行十六进制编码;

unhex()函数:则是用来解码,将十六进制的内容转换回十进制。

substr()函数:语法:substr(start,length).

                       从起点截取某个长度的字符串。

substring()函数:语法:substring(start,end).

                        截取两个位置之间某个长度的字符串。

mid()函数:语法:mid(column_name,start,length).

                          用于得到一个字符串的一部分。

left()函数:语法:left(string,n)。

                         得到字符串左部指定个数的字符。

updatexml()函数:语法:updatexml(目标xml文档,xml路径,更新的内容)

                                 更新xml文档的函数。

extractvalue()函数:语法:extractvalue(目标xml文档,xml路径)

                                       对xml文档进行查询的函数                                    

load_file()函数:MySQL读取本地文件。

into outfile()函数:用来导出文件。

在SQL注入时,我们可以利用load_file或者into outfile()函数对文件进行读取,或者写入webshell,但是需要注意以下几点:

  1. 要能使用union;
  2. 要有secure_file_priv权限;
  3. 必须有读取权限;
  4. 必须知道绝对路径,且目录必须是可读、可写权限;
  5. 必需小于配置文件中设置的文件大小,也就是max_allowed_packetde.

注意:若过滤了单引号,则可以将函数中的字符进行hex编码

关于secure_file_priv函数:查询方法:show variable like '%secure_file_priv%'

查询结果为:secure_file_priv NULL时,表示不允许导入导出;

查询结果为:secure_file_priv /xxx/时,表示只允许在当前目录导入导出;

查询结果为:secure_file_priv(空白)时,表示可以在任意目录进行导入导出。

MySQL5.6.34版本以后secure_file_priv的值默认为NULL。且无法用sql语句对其进行修改,只能够通过以下方式修改mysql.ini或my.cn:

        Windows:mysql.ini中添加secure_file_priv=。

        linux:/etc/my.cnf的[mysqld]下面添加local-infile=0

  • 内联注释的特性

内联注释符是一种基于注块注释衍生出来的注释风格,它可以执行整个SQL语句,内联注释有个特殊点,和MySQL版本息息相关,也就是当内联注释中出现小于或等于当前版本号的时候,内联注释符里的子句会被执行,大于时则不会被执行,注意版本的写法,例如,5.5.34,在内联注释中需要写为50534,版本号第二位加0,然后注意版本号和内联注释中间不能有空格。

%a0=空格

  • SQL注入实战

  • sqli_labs搭建

  1. 启动PHP集成环境搭建,把源码放到www目录下;
  2. 修改数据库配置文件:sql-connections\db-creds.inc;
  3. URL中访问sqli_labs所在的目录。
  • SQL注入简介

SQL注入是指web应用程序对用户输入数据的合法性未进行判断、处理,前端传入的参数是攻击者可控的,并且参数被正常的代入到数据库查询,攻击者可以通过构造不同的SQL语句来进行对数据库的操作,正常情况下攻击者可以对数据库进行高危操作,例如,数据查询、webshell写入、命令执行等操作。

SQL注入漏洞的产生必须满足两个条件:

  1. 参数是可控的;
  2. 参数可以被代入数据库进行查询。

  • SQL注入漏洞的危害

数据库信息泄露:泄露数据库中存放的数据、用户隐私等;

获取webshell:当权限为root且知道绝对路径时,可以直接写一句话木马到服务器。

网页篡改:注入出后台管理员用户,登录后台后发布恶意数据、篡改后台数据等。

网站挂马:当拿到webshell或者获取到服务器的权限后,可将一些网页木马挂在服务器上。

获取系统权限:当权限足够高时,可以获取系统主机的权限。

万能密码:利用特定的payload登录后台或者其他页面。

文件读取:读取敏感文件。

  • SQL注入类型

按数据库类型分:access、MSSQL、MySQL、Oracle、DB2等。

按提交方式分:GET、post、cookie、HTTP头、XFF。

按注入点类型分:数字型、字符型、搜索型

按执行结果分:布尔盲注、时间盲注、报错盲联合注堆叠查询注入。

  • 类型详解

数字型:

像其注入点id类型为数字,所以叫数字型注入点。

字符型:

像其注入点name=admin这种形式为字符型。

搜索型:

一些网站为了方便用户查找网站的资源,都对用户提供了搜索的功能,因为是搜索功能,往往是程序员在编写代码是忽略了对其变量的过滤,而且这样的漏洞在国内的系统中普遍地存在。搜索型注入又称文本框注入。

布尔盲注:

即可以根据返回页面判断条件真假的注入。

时间盲注:

即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即返回页面时间是否增加)。

报错注入:

即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。

联合注入:

可以使用union的情况下的注入。

堆查询注入:

可以使用执行多条语句的执行时的注入。

  • 宽字节注入

原理:程序员为了防止SQL注入,对用户输入中的单引号进行处理,在单引号加上斜杠进行转义,这样被处理好后的SQL语句中单引号不再具有作用,仅仅是内容而已,换句话说,这个单引号无法发挥和前后单引号闭合的作用,仅仅成为内容。

当某字符的大小为一个字节时,称其字符为窄字节。

当某字符的大小为两个字节时,称其字符为宽字节。

所有英文默认占一个字节,汉字占两个字节。

常见的宽字节编码:GB2312,GBK,GB18030,BIG5,shift_JIS等。

使用%df,会被转义成\,在GBK编码中,\被转义成%5c。

安全人员要绕过这个转义处理,使单引号发挥作用,有两个思路:

  1. 让斜杠失去作用;
  2. 让斜杠消失。

思路一:借鉴程序员的防范思路,对斜杠转义,使其失去转义单引号的作用,成为“内容”。

思路二:宽字节注入

       当使用MySQL使用宽字节编码,如:GBK时,两个连接在一起的字符会被认为是汉字,我们可以在单引号前加一个字符,使其和斜杠组合被认为成汉字,从未达到让斜杠消失的目的,进而使单引号发挥作用。

注意:前一个字符的ASCII要大于128,两个字符才能组合成汉字,如%df%5c%27,此时%df和%5c会被GBK认为是一个汉字,也就是繁体字,而后面的%27也就是单引号 ,这就绕过了闭合问题。

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值