堆叠注入

SQL注入之堆叠注入

  之前一直以为堆叠注入不适合mysql数据库,实战中也没有尝试过堆叠注入,今天看书《web安全攻防 渗透测试指南》才发现原来mysql也可以。

问题原因:

    1、使用PDO方式查询数据。

    2、从客户端获取的参数未进行处理直接拼接到sql语句中。

解决办法:使用PDO方式查询数据的时候使用占位符。

   PDO方式查询数据能执行多行语句,但是只能返回第一条的结果。所以如果用堆叠注入的话,要用时间注入。

  测试代码:

<?php

$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."<hr>";

      //  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

对比之下可以看到第二个语句执行成功。剩下的就跟平时的时间注入一样了。