通过添加第二个查询实际上可以进行 SQL 注入吗?

Posted

技术标签:

【中文标题】通过添加第二个查询实际上可以进行 SQL 注入吗?【英文标题】:Is an SQL injection actually possible by adding a second query? 【发布时间】:2013-11-09 02:18:17 【问题描述】:

在 SO 上有很多关于 SQL 注入的警告,但我发现没有人不真的回答,这是怎么发生的?在这个问题中,我假设它是 mysqlphp

基本的 mysql_ 不接受查询中的第二个查询,对吧?

所以,基本上,这个

$unsafe = "');DROP TABLE table;--";    
mysqli_query($con,"INSERT INTO table (Column) VALUES ('$unsafe'");

实际上并没有做任何有害的事情吗?请纠正我。

我没有使用 mysqli_ 的经验,所以我会跳到 PDO 和“准备好的语句”。

当我开始使用 PDO 时,我缺乏这方面的信息,并且基本上是这样使用它,认为它是安全的。

$stm = $pdo->prepare("INSERT INTO table (Column) VALUES ('$unsafe');
$stm->execute();

但是,PDO 与 mysql_ 相同。它不支持开箱即用的多个查询,对吗?再次,纠正我这一点。

那么,如果我没记错的话,这被认为是安全的?

$stm = $pdo->prepare("INSERT INTO table (Column) VALUES (?);
$stm->execute(array($unsafe);

如果甚至不支持多个查询,无权访问数据库的恶意用户如何注入恶意数据?

还是他们?

【问题讨论】:

这是Software Engineering的问题 @FreshPrinceOfSO 随意标记它以进行迁移。 How can I prevent SQL injection in PHP?的可能重复 您的示例没有生成有效的 SQL 这不仅仅是多个查询,正如您已经研究过的那样,默认情况下确实禁用了多个查询。在您的 INSERT 请求的情况下,$unsafe 中精心设计的字符串连接表达式和 SELECT 子查询可能是攻击者揭开数据库内容所需的全部内容。 【参考方案1】:

如果甚至不支持多个查询,无权访问数据库的恶意用户如何注入恶意数据?

“SQL注入”不等于“二次查询”。

还是他们?

肯定是的。

第二个查询只是一个示例。虽然它可以是任何有效的 SQL 语句。 SQL 注入是对格式不正确的查询的利用。如果开发人员没有正确格式化 SQL,就有可能打破文字限制并将代码添加到 SQL 主体。

通过添加第二个查询真的可以进行 SQL 注入吗?

是的,取决于您使用的 API。

【讨论】:

是的,我知道这一点。虽然***.com/questions/332365/… 解释得很仔细,但它仍然只是一个 查询,完全有效的SQL。但是如果用户想在它之后添加另一个查询,就像我的例子一样。 我已经编辑了标题以实际匹配问题。因此,通过任何手段,是否可以在第一个查询之后实际添加另一个查询? 是的,但这并不重要。你问错问题了。 然后子问题:PDO 是否默认支持它?是的,在这种情况下:***.com/questions/6346674/… 但没有 try & catch? try & catch 与这个问题有什么关系?你很明白,你在问什么?【参考方案2】:

mysql + php 的两个查询是谬误

来源:http://xkcd.com/327/

如果没有经过深思熟虑的步骤,这将不适用于 mysql 和 php,因为the normal query function 只会执行 first 查询。

这并不意味着它不可能——只是它应该是very obvious。

SQL注入很真实

但以上对于 sql 注入几乎没有任何意义。有大量关于sql injection 的信息,包括large number of questions here on stack overflow。以问题中的示例为例,这是一种等效的攻击,起作用:

$id = "123 OR 1 = 1 --";
mysqli_query($con,"DELETE FROM table WHERE id = $id LIMIT 1");

即找到一个接口来删除我自己的,例如,评论,如果 id 没有被转义,那么删除所有 cmets 将是微不足道的。但这个例子只是冰山一角。

执行任意 sql 语句是可利用的

问题中的这段代码:

$stm = $pdo->prepare("INSERT INTO table (Column) VALUES ('$unsafe')");
$stm->execute();

没有使用 PDO 的任何好处 - 即,任何可以与 mysql/mysqli 驱动程序(天真地使用)一起使用的漏洞(真正大量的)都可以与以这种方式使用的 pdo 一起使用。

参数化查询防止 sql 注入

使用PDO with prepared statements 带参数转义值适当地防止sql注入攻击,所以是的,这是安全的注入:

$stm = $pdo->prepare("INSERT INTO table (Column) VALUES (?)");
$stm->execute(array($unsafe));

无权访问数据库的恶意用户如何注入恶意数据

只需找到一种执行 sql 的方法,该方法要么执行他们想要执行的操作,要么为他们提供信息以以不同的方式执行此操作。

例如:

function login() 
    $username = "irrelevant' OR is_admin = 1 --";
    $password = hash('irrelevant');
    $query = "SELECT id from users where username = '$username' AND password = '$password'";
    ...

恶意用户如何在不担心注入的情况下访问系统上的管理功能?很容易。

有关注入的一般信息,请参阅前面的参考资料。

【讨论】:

谢谢! :) + 一百万。

以上是关于通过添加第二个查询实际上可以进行 SQL 注入吗?的主要内容,如果未能解决你的问题,请参考以下文章

sql server 中union的用法

将第二个表中的第二个(条件)结果添加到 SQL 查询

sql注入是啥

Sql注入简介

测试登陆页面时,如何测试SQL注入漏洞呢

怎么检测网站存在注入漏洞 防注入都有哪些解决办法