君衍.
SQL-Labs靶场通关教程:
SQL注入第一课
SQL无列名注入
SQL报错注入原理
简单的SQL练习,联合注入、报错注入
POST提交方式注入
HTTP头部注入
二次注入
一些绕过案例
HTTP参数污染攻击
一、36关 GET单引号宽字节注入
请求方式 | 注入类型 | 拼接方式 |
---|---|---|
GET | 联合、报错、布尔盲注、延时盲注 | id=‘$id’ |
首先我们进行测试(使用?id=1\,查看过滤后的回显)
这里可以看到对我们的注释符进行了注释以及单双引号进行测试会发现都是如此:
所以这里我们判断使用了过滤函数进行了过滤,所以我们首先查看源码。
1、源码分析
<?php
//including the Mysql connect parameters.
include("../sql-connections/sqli-connect.php");
error_reporting(0);
function check_quotes($con1, $string)
{
$string=mysqli_real_escape_string($con1, $string);
return $string;
}
// take the variables
if(isset($_GET['id']))
{
$id=check_quotes($con1, $_GET['id']);
//echo "The filtered request is :" .$id . "<br>";
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
// connectivity
mysqli_query($con1, "SET NAMES gbk");
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
if($row)
{
echo 'Your Login name:'. $row['username'];
echo 'Your Password:' .$row['password'];
}
else
{
print_r(mysqli_error($con1));
}
}
else {
echo "Please input the ID as parameter with numeric value";}
?>
源码大致与前几关相同,都是先过滤,后查询,查询成功输出查询到的信息,如果没有查询成功,那么输出报错信息。我们主要看下这个过滤函数,从而计划如何进行绕过:
function check_quotes($con1, $string)
{
$string=mysqli_real_escape_string($con1, $string);
return $string;
}
可以看到里面主要使用了mysqli_real_escape_string
函数,在官网进行查看:
可以看到官网说明对SQL语句特殊字符进行转义:
危险字符 | 转义后 |
---|---|
\ |
\\ |
' |
\' |
" |
\" |
我们可以看到其实和前几关差不多,尤其32关,就过滤函数不一样,剩下的都一样。
2、联合查询注入
上面我们消除了转义符号的威胁,下面我们即可轻松的搭配别的注入方式完成注入,之前通过源码分析,由于查询成功输出了查询到的信息,所以我们将使用联合查询的方式完成注入。
1、猜测字段
?id=1%df' order by 4--+
从上面我们可以看到并没有第四列,所以我们尝试使用3来进行测试:
?id=1%df' order by 3--+
可以看到这里显示了通过1查询到的信息,所以后面的内容为真,即为该表的列数为3列,下面我们测试使用联合查询进行注入:
2、测试使用联合查询注入观察回显
?id=-1%df' union select 1,2,3--+
这里我们可以看到回显的点在2与3字段,所以我们直接随便选一个更改payload完成注入即可:
3、爆出数据库中的表名
?id=-1%df' union select 1,group_concat(table_name)