Web安全攻防:08---SQL注入之时间注入、堆叠查询注入、二次注入、宽字节注入、cookie注入、base64注入、XFF注入

一、时间注入

  • 与Boolean注入不同的之处在于,时间注入是利用sleep()或benchmark()等函数让MySQL的执行时间边长
  • 时间盲注多于MySQL中的IF语句结合使用。IF(expr1,expr2,expr3)语句含义为:如果expr为true,则IF返回expr2,否则返回expr3

演示案例

  • 时间注入攻击的测试地址:http://www.xxx.com/sql/time/time.php?id=1
  • 第一步:下面我们判断数据库库名长度是否大1,如果大于1,MySQL语句延迟5秒返回,否则返回1。从图中可以看出时间为5267毫秒,也就是5.267秒,因此执行了sleep(5)函数,所以可以得出数据库库名长度大于1

Web安全攻防:08---SQL注入之时间注入、堆叠查询注入、二次注入、宽字节注入、cookie注入、base64注入、XFF注入_第1张图片

  • 第二步:我们接着判断数据库名长度是否大于10,结果显示执行时间为404毫秒,因此可以知道IF没有执行sleep(5)函数,所以数据库库名长度是不大于10的

Web安全攻防:08---SQL注入之时间注入、堆叠查询注入、二次注入、宽字节注入、cookie注入、base64注入、XFF注入_第2张图片

  • 第三步:接着我们判断数据库库名的第一个字符是否等于“s”,结果显示执行的时间为5176毫秒,因此可以知道数据库库名是以字符“s”开头的

Web安全攻防:08---SQL注入之时间注入、堆叠查询注入、二次注入、宽字节注入、cookie注入、base64注入、XFF注入_第3张图片

  • 第四步:后面我们就可以以此类推,的哦出数据库的库名、表名、字段名和具体数据了

时间注入代码分析

  • 程序获取GET参数ID,通过preg_match判断参数ID是否存在Union等危险字符,然后将参数ID拼接到SQL语句中。从数据库中查询SQL语句,如果有结果返回yes,否则返回no
  • 但是由于此处没有过滤sleep等字符,因此我们可以使用时间盲注
no");
}

$result = mysqli_query($con,"select * from users where `id`='".$id."'");

$row = mysqli_fetch_array($result);

if ($row) {
	exit("yes");
}else{
	exit("no");
}


?>

二、堆叠查询注入

  • 堆叠查询注入可以执行多条语句,多语句之间以分号隔开;堆叠查询注入就是利用这个特点,在第二个SQL语句中构造自己要执行的语句

演示案例

  • 时间注入攻击的测试地址:http://www.xxx.com/dd.php?id=1
  • 首先访问id=1',页面返回MySQL错误;再访问id=1'%23,页面返回正常结果。此处可以使用Boolean注入、时间注入、也可以使用堆叠注入
  • 第一步:使用堆叠注入查询用户名称
  • 尅看到第二条SQL语句就是时间盲注的语句

Web安全攻防:08---SQL注入之时间注入、堆叠查询注入、二次注入、宽字节注入、cookie注入、base64注入、XFF注入_第4张图片

  • 第二步:通过构造不同的时间注入语句,可以得到完整的数据库库名、表名、字段名、具体数据
  • 例如下面获取数据库的表名

Web安全攻防:08---SQL注入之时间注入、堆叠查询注入、二次注入、宽字节注入、cookie注入、base64注入、XFF注入_第5张图片

堆叠查询注入代码分析

  • 程序获取GET参数ID,使用PDO的方式进行数据查询,但仍将参数ID拼接到查询语句,导致PDO没起到预编译的效果,程序仍然存在SQL注入漏洞
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $conn->query("SELECT * FROM users where `id` = '" . $_GET['id'] . "'");

    $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
    foreach($stmt->fetchAll() as $k=>$v) {
        foreach ($v as $key => $value) {
            echo $value;
        }
    }
    $dsn = null;
}
catch(PDOException $e)
{
    echo "error";
}
$conn = null;
?>
  • 使用PDO执行SQL语句时,可以执行多语句,不过这样通常不能直接得到注入结果,因为PDO只会返回第一条SQL语句执行的结果,所以第二条语句中可以用update更新数据或者使用时间盲注获取数据
  • 例如访问dd.php?id=1';select if(ord(substring(user(),1,1))=114,sleep(3),1);%23时,执行的语句为:

 

  • 此时SQL语句分为两条,第一条select * from users where 'id'='1',而select if(ord(substring(user(),1,1))=114,sleep(3),1);#则是我们构造的时间盲注语句

三、二次注入



四、宽字节注入


 
The Query String is : ".$sql ."
"; ?>

五、cookie注入

";
?>

六、base64注入

";
	echo "user:".$row['username']."
"; echo "pass:".$row['password']."
"; echo "
"; } mysql_close($conn); echo "now use".$sql."
"; ?>

七、XFF注入

";
?>

 

你可能感兴趣的:(Web安全攻防)