通过添加第二个查询实际上可以进行 SQL 注入吗?
Posted
技术标签:
【中文标题】通过添加第二个查询实际上可以进行 SQL 注入吗?【英文标题】:Is an SQL injection actually possible by adding a second query? 【发布时间】:2013-11-09 02:18:17 【问题描述】:在 SO 上有很多关于 SQL 注入的警告,但我发现没有人不真的回答,这是怎么发生的?在这个问题中,我假设它是 mysql 和 php。
基本的 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 注入吗?的主要内容,如果未能解决你的问题,请参考以下文章