报错注入流程 以DVWA靶机为例演示报错注入过程。已知在id参数点使用单引号,后台SQL含两列值。通过构造输入`1’ and (extractvalue(1,concat(0x7e,(select user()),0x7e))) #`,数据库返回错误信息,揭示当前用户名。调整输入为`1’ and (extractvalue(1,concat(0x7e,(select database()),0x7e)...
SQL注入系列篇 | 报错注入
报错注入概念
在数据库操作中,当SQL语句结构不正确时,数据库通常会返回错误信息。攻击者利用这一特性构造特殊SQL语句,触发数据库报错,从而从错误信息中获取所需信息。然而,确保SQL结构的正确性是关键。例如,在MySQL中,语句`select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e));`因缺少右括号而引发结构错误,而非我们所期待的报错信息。
当正确添加右括号,如`select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e));`,数据库能正确执行查询,若在执行阶段出现错误,攻击者可捕获报错信息,从而获取有价值的数据。
报错注入流程
以DVWA靶机为例演示报错注入过程。已知在id参数点使用单引号,后台SQL含两列值。通过构造输入`1’ and (extractvalue(1,concat(0x7e,(select user()),0x7e))) #`,数据库返回错误信息,揭示当前用户名。调整输入为`1’ and (extractvalue(1,concat(0x7e,(select database()),0x7e))) #`,显示当前数据库名。接着,输入`1’ and (extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = database()),0x7e))) #`,披露所有表名。通过适当修改SQL,可完全获取数据表信息。
报错函数及原理剖析
本次演示利用extractvalue函数实现报错注入,其他如updatexml、exp、multipoint等函数也有类似效果。我们以`1’ and (extractvalue(1,concat(0x7e,(select database()),0x7e))) #`为例分析,后台处理程序显示,构造的SQL为`extractvalue(xml_document,xpath_string)`。数据库执行此函数查询XML文档,需要输入参数,第一个为XML内容或路径,第二个为XPath。构造输入`extractvalue(1,concat(0x7e,(select database()),0x7e))`时,数据库检查SQL结构完整,检测函数参数格式。解析第二个参数时,`select database()`解析为 `'dvwa'`,通过`concat`连接为`~dvwa~`。数据库检测`~dvwa~`是否满足XPath格式,因其不符合而引发报错。
后台SQL及拼接后的原型
报错注入通过构造特殊SQL引发数据库报错,从错误信息中获取敏感数据。若服务器未妥善处理这类错误,攻击者能通过页面错误回显获取信息。注意确保SQL结构正确,以及理解报错注入的原理与流程,是有效防御的关键。2024-10-26