zoukankan      html  css  js  c++  java
  • 经典的MySQL Duplicate entry报错注入

    SQL注射取数据的方式有多种:

    1. 利用union select查询直接在页面上返回数据,这种最为常见,一个前提是攻击者能够构造闭合的查询。
    2.  Oracle中利用监听UTL_HTTP.request发起的HTTP请求,把QuerySet反弹回攻击者的主机。当然,HTTP服务器对URL的长度有一定限制,因此每次可返回的数据量不可过多。
    3.  基于错误消息取数据,前提是页面能够响应详细的错误描述。它的一个优点是,我们可能不必太费力去猜测和闭合SQL(可以构造子查询,让MySQL在子查询中报错)。
    4.  盲注,页面不会显示错误消息。常见基于布尔的盲注、基于时间的盲注,此类注射点利用价值相对要低一点,猜解数据的时间较长。

    本篇简单说明非常经典的基于错误回显的MySQL注射。最重要的,就是理解下面的SQL查询:

    select count(*),floor(rand(0)*2)x from information_schema.character_sets group by x;

    上面的这条SQL将报错: Duplicate entry ‘1’ for key ‘group_key’

    如下图

    mysql_error_1

    1. 为什么MySQL注射要用information_schema库?

    答案是这个库是MySQL自带的,安装之后就创建好了,所有账号都有权限访问。攻击者无需猜解库名、表名。跟Oracle注射使用dual类似。

    2. 如何利用报错取数据?

    利用报错,攻击者把目标数据concat连接到floor()函数的前后即可。

    例如,下面的语句用于获取MySQL Server版本,构造:

    mysql> select count(*),concat( floor(rand(0)*2), 0x5e5e5e, version(), 0x5e5e5e) x from information_schema.character_sets
    group by x;
    ERROR 1062 (23000): Duplicate entry ‘1^^^5.5.28^^^’ for key ‘group_key’

    通过报错,即可知道当前数据库是5.5.28。0x5e5e5e是3个尖括号的16进制表示。 自动化SQL注射工具通常会在目标数据前后做类似的标记,方便程序提取。

    加上标记,也可以方便攻击者在大的页面中搜索。

    3. 为何这条语句会报错?

    rand(0)是把0作为生成随机数的种子。首先明确一点,无论查询多少次,无论在哪台MySQL Server上查询,连续rand(0)生成的序列是固定的。

    应用floor函数(取浮点数的整数部分)后,结果变成了:

    可以看到,第二行和第三行的值都是1。这也是最终引起MySQL报错Duplicate entry的地方。

    实际上,我们分开执行下面的两种查询,都是不会出错的:

    a) select floor(rand(0)*2) x from information_schema.character_sets group by x;

    上面的查询根据x列的值进行分组,得到:

    b) select count(*), floor(rand(0)*2) x from information_schema.character_sets;

    得到information_schema.character_sets总共有39行:

    请注意,这里x的值出现的是0。

    c) 将上述语句结合后即报错

    select count(*), floor(rand(0)*2) x from information_schema.character_sets group by x;

    我们预期的结果, 其实是:

    然而MySQL在内部处理中间结果的时候,出现了意外,导致报错。

    参考链接: SQL Injection attack – What does this do?

  • 相关阅读:
    数据存储检索之B+树和LSM-Tree
    Kylin构建Cube过程详解
    关于maven打包乱码报错问题解决
    很详尽KMP算法 转载
    计算机源码反码补码
    Lombok实现链式编程 转载
    java适配器模式
    ubuntu卸载软件步骤(转)
    JMeter压测的使用
    @valid注解的使用(转载)
  • 原文地址:https://www.cnblogs.com/dsli/p/7445966.html
Copyright © 2011-2022 走看看