堆叠注入

SQL注入之堆叠注入 之前一直以为堆叠注入不适合mysql数据库,实战中也没有尝试过堆叠注入,今天看书《web安全攻防 渗透测试指南》才发现原来mysql也可以。
问题原因:
1、使用PDO方式查询数据。
2、从客户端获取的参数未进行处理直接拼接到sql语句中。
解决办法:使用PDO方式查询数据的时候使用占位符。
PDO方式查询数据能执行多行语句,但是只能返回第一条的结果。所以如果用堆叠注入的话,要用时间注入。
测试代码:

$host = "127.0.0.1";
$port = "3306"; //
$username = "root";
$password = "root";
$dbname = "information_schema";
$charset = "utf8";
$dsn = "mysql:dbname=$dbname; host=$host";
try{
$pdo = new Pdo($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 设置sql语句查询如果出现问题 就会抛出异常
set_exception_handler("cus_exception_handler");
} catch(PDOException $e){
die("连接失败: ".$e->getMessage());
}
function cus_exception_handler($e)
{
【堆叠注入】die("sql 异常: ".$e->getMessage());
}
//查询数据
$query1 = "select * from schemata where schema_name='".$_GET['table']."'";
$state = $pdo->query($query1);
echo $query1."";
//query执行一条SQL语句,如果通过,则返回一个PDOStatement对象,可以直接遍历这个返回的记录集 (query用于select)
$res = $state->fetch(PDO::FETCH_ASSOC); // 获取结果集中的一行数据
print_r($res);
?>
测试语句1:http://127.0.0.1/phpinfo.phP?table=mysql
堆叠注入
文章图片
测试语句2:http://127.0.0.1/phpinfo.phP?table=mysql%27; select%20sleep(5)%20%23
堆叠注入
文章图片
对比之下可以看到第二个语句执行成功。剩下的就跟平时的时间注入一样了。
更新信息:堆叠注入危害比其他的注入危害高,如果mysql用户权限足够,可以执行添加删除数据库的操作。
创建数据库:127.0.0.1/phpinfo.phP?table=mysql'; create database test --+
删除数据库:127.0.0.1/phpinfo.phP?table=mysql'; drop database test --+

    推荐阅读