SQL注入之报错注入方法汇总

报错注入

什么是报错注入

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

响应过程:

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

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

0.2 类型

在这里插入图片描述

1、ExtractValue函数

ExtractValue()函数是MySQL数据库中用于提取XML数据中指定路径的值的函数。它基于XPath语法,允许用户根据特定的路径表达式从XML格式的数据中获取所需信息。以下是关于MySQL中ExtractValue()函数的详细讲解:

1.1语法

EXTRACTVALUE(xml_data, xpath_expression)
  • xml_data: 包含XML数据的字段或表达式。
  • xpath_expression: XPath路径表达式,用于指定要提取值的位置。

1.2 在sql注入中

在使用ExtractValue()函数时,无效的XPath表达式(xpath_expression)可能会导致报错。通过将恶意的SQL语句拼接放在xpath_expression处,可以使得该条SQL语句报错,并执行我们注入的恶意语句
例如:

SELECT * FROM users WHERE username = 'input_username' AND password = ExtractValue(1, CONCAT('username:', (SELECT database())));
1

其中payloadAND password = ExtractValue(1, CONCAT('username:', (SELECT database())));使用了extractvalue函数,将xml数据设置为1,xpath_expression部分设置为CONCAT('username:', (SELECT database())
此时的xpath_expression为“username: 数据库名”,由于1中并没有“username: 数据库名”因此会产生报错,可以从报错结果中看到我们想要的数据库名

2、uodataxml()函数

2.1 语法:

UPDATEXML(XML_document, XPath_string,new_value);

  • 第一个参数:XML_document是String格式,为XML文档对象的名称
  • 第二个参数:XPath_string (Xpath格式的字符串),Xpath语法
  • 第三个参数:new_value,string格式,替换查找到的符合条件的数据

2.2 用法:

将书标题修改为1

SELECT updatexml(doc,'/book/title','1') FROM xml;
直接将<title></title>替换为1

在这里插入图片描述

3、floor()函数

在这里插入图片描述

3.1 原理

floor()报错注入的原因是group by在向临时表插入数据时,由于rand()多次计算导致插入临时表时主键重复,从而报错,又因为报错前concat()中的SQL语句或函数被执行,所以该语句报错且被抛出的主键是SQL语句或函数执行后的结果。

参考文章:https://www.secpulse.com/archives/140616.html

这篇文章对于floor的介绍十分详细,

4、NAME_CONST()

exists(select * from (select * from(selectname_const(@@version,0)) as a join (select name_const(@@version,0)) as b) as c);

了解更多:https://www.cnblogs.com/Triomphe/p/9489639.html

5、基于join的报错方式(已知库名和表名时可用来获取列名或用于绕过","被注释的情况)

(1)Payload:

select * from(select * from 库名.表名 a join 库名.表名 b)c

(2)各元素作用

join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。

可以使用的 JOIN 类型,以及它们之间的差异。

1.JOIN: 如果表中有至少一个匹配,则返回行

2.LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行

3.RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行

4.FULL JOIN: 只要其中一个表中存在匹配,就返回行

(3)join报错注入分析:

1.比较列名是否有重复,会返回重复列名。

2.可作为连接符代替特殊字符。

(4)使用场景

已知库名和表名时可用来获取列名或用于绕过","被注释的情况。

6、基于exp的报错方式

(1)Payload:

exp(~(select * from (select user())a))

(2)各元素作用

MySQL中,explnlog的功能相反,简单介绍下,就是logln都返回以e为底数的对数

指数函数为对数函数的反函数,exp()即为以e为底的对数函数(exp注入适用于MySQL5.5.5以上)

(3)exp报错注入分析:

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

(4)使用场景

属于BigInt溢出型注入,用求反的方式爆出数据。

7、基于GeometryCollection()报错(混合数据类型)

(1)Payload:

GeometryCollection((select from(select from(select user())a)b))

(2)各元素作用

GeometryCollection 是零个或更多个 geometry(几何) 或 geography(地理) 实例的集合。

GeometryCollection 可以为空。

(3)GeometryCollection报错注入分析:

因为输入查询的数据并不满足Geometry或者Geography,会产报错,并借由此注入返回数据。

(4)使用场景

并不常用的报错方式可用来尝试。

8、基于polygon()报错

(1)Payload:

polygon((select from(select from(select user())a)b))

(2)各元素作用

Polygon 是存储为一系列点的二维表面,这些点定义一个外部边界环和零个或多个内部环。

(3)polygon报错注入分析:

因为输入查询的数据并不满足polygon函数储存数据的条件,会产生报错,并借由此注入返回数据。

(4)使用场景

并不常用的报错方式可用来尝试。

9、基于multipoint()报错

(1)Payload:

multipoint((select from(select from(select user())a)b))

(2)各元素作用

MultiPoint 是零个点或更多个点的集合。 MultiPoint 实例的边界为空。

(3)multipoint报错注入分析:

因为输入查询的数据并不满足multipoint函数储存数据的条件,会产生报错,并借由此注入返回数据。

(4)使用场景

并不常用的报错方式可用来尝试。

10、基于multlinestring()报错

(1)Payload:

multilinestring((select from(select from(select user())a)b))

(2)各元素作用

MultiLineString 是零个或多个 geometrygeographyLineString 实例的集合。

(3)multlinestring报错注入分析:

因为输入查询的数据并不满足函数储存数据的条件,会产生报错,并借由此注入返回数据。

(4)使用场景

并不常用的报错方式可用来尝试。

11、基于multpolygon()报错

(1)Payload:

multipolygon((select from(select from(select user())a)b))

(2)各元素作用

MultiPolygon 实例是零个或更多个 Polygon 实例的集合。

(3)multpolygon报错注入分析:

因为输入查询的数据并不满足函数储存数据的条件,会产生报错,并借由此注入返回数据。

(4)使用场景

并不常用的报错方式可用来尝试。

12、基于linestring()报错

(1)Payload:

linestring((select from(select from(select user())a)b))

(2)各元素作用

LineString 是一个一维对象,表示一系列点和连接这些点的线段。

(3)linestring报错注入分析:

因为输入查询的数据并不满足函数储存数据的条件,会产生报错,并借由此注入返回数据。

(4)使用场景

并不常用的报错方式可用来尝试。

了解更多:https://www.tr0jan.top/archives/6/
https://www.cnblogs.com/Triomphe/p/9489639.html
这两篇文章个人十分推崇

### SQL注入报错的原因分析与解决方案 #### 一、SQL注入报错原因 SQL注入过程中出现的报错通常是因为输入的数据破坏了原始SQL语句的语法结构,或者触发了数据库安全机制。以下是常见的几种报错场景及其成因: 1. **语法错误** 当攻击者尝试通过拼接恶意字符串来修改SQL查询逻辑时,可能会导致SQL语句无法正常解析而引发语法错误。例如,在`sqli-labs`的第一关中,如果仅闭合单引号而不处理后续部分,则可能导致前端页面显示类似“syntax error”的提示[^2]。 2. **权限不足** 数据库操作可能涉及特定用户的访问控制策略。当执行某些敏感命令(如读取文件或调用系统函数)时,若当前账户缺乏相应权限,也会抛出异常信息。 3. **防御措施生效** 现代Web应用往往配备多种防护手段对抗SQL注入威胁,比如WAF(Web Application Firewall),它能够识别并拦截可疑请求;另外还有参数化查询等编程层面的最佳实践可以有效规避此类漏洞的发生。 4. **数据类型冲突** 如果注入点预期接收整数型参数却收到字符型输入,那么转换失败同样会造成运行期崩溃现象。 #### 二、解决SQL注入报错方法 针对上述提到的各种情形,下面列举了一些通用的技术应对办法: 1. **调整测试载荷(Payload)** 对于简单的语法问题,可以通过精心设计payload使得最终形成的完整query既满足业务需求又能绕过初步筛查。举个例子来说就是采用编码技术隐藏特殊符号的真实含义直到被目标引擎解读为止。 2. **利用条件判断代替直接输出** 考虑到有些场合不允许看到确切的error message,此时可改用布尔盲注法或者其他间接方式获取所需情报而不是依赖显式的fault report. 3. **借助工具自动化探索过程** 使用像SQLMap这样的开源软件可以帮助快速定位潜在风险区域以及自动适应不同的环境配置从而减少手动调试的工作量。假如遇到Windows平台上关于SQLMap本身的setup难题的话,按照官方文档指示逐步排查直至成功部署也是必要的步骤之一[^3]. 4. **增强应用程序安全性建议** - 实施严格的输入验证流程确保所有外部传入的数据都经过适当过滤后再参与内部运算。 - 推荐始终优先选用预编译语句而非动态组装string形式的commands. - 定期审查源码查找任何可能成为突破口的位置加以修正完善。 ```python import pymysql.cursors connection = pymysql.connect(host='localhost', user='user', password='passwd', database='db', cursorclass=pymysql.cursors.DictCursor) try: with connection.cursor() as cursor: sql = "SELECT * FROM users WHERE username=%s AND password=MD5(%s)" cursor.execute(sql, ('admin', 'password')) # 参数绑定防止SQL Injection finally: connection.close() ``` 以上代码片段展示了如何安全地构建SQL查询以防范传统意义上的injection attack。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值