【问题标题】:Why does this SQL injection succeed even though the SQL statement produces a syntax error?为什么即使 SQL 语句产生语法错误,此 SQL 注入也会成功?
【发布时间】:2012-08-09 00:04:30
【问题描述】:

this question 和一些 cmets 中,这个输入:

$input = '; DELETE FROM table_name ; #';

建议作为 SQL 注入此 PHP 语句的示例:

$input = $_POST['input'];
'SELECT '.$input.' FROM table_name'

我切入正题,直接在 MySQL 中使用了一个示例,尽管我使用 * 代替了 #。结果是一样的。

CREATE TABLE a_table (
 id INT NOT NULL);

INSERT INTO a_table (id) VALUES (1), (2), (3), (4), (5);
SELECT * FROM a_table;
SELECT ; DELETE FROM a_table; * FROM a_table;
SELECT COUNT(*) FROM a_table;

这个输出:

mysql> SELECT * FROM a_table;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
+----+
5 rows in set (0.00 sec)

mysql> SELECT ; DELETE FROM a_table; * FROM a_table;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Query OK, 5 rows affected (0.03 sec)

mysql> SELECT * FROM a_table;
Empty set (0.00 sec)

尽管语法错误,为什么这个 SQL 注入会成功?这是因为 MySQL 在周围的 SELECT 查询之前解析并运行 DELETE 查询吗?当然,我不打算依靠这样弱的 PHP 代码或 MySQL 语法错误来防范 SQL 注入。这个例子让我很感兴趣。

【问题讨论】:

    标签: mysql sql-injection


    【解决方案1】:

    查询仍在运行,因为 mysql 使用; 来分隔每个查询,并且如果您允许它这样做,即使出现语法错误,它也会继续运行查询。在 SequelPro 中运行查询我收到一条关于语法错误的消息,它会提示我是否要继续运行所有查询或停止。但是,直接在 MySQL 命令行中运行它们,查询将继续运行,MySQL 只会给出错误消息并按预期继续下一个查询(与 PHP 代码发生的情况相同)。

    【讨论】:

    • 那是……实际上很合乎逻辑。你在 SequelPro 中使用SELECT * 作为第一个查询得到相同的结果吗?这仍然是一个错误,尽管是一个不同的错误。
    • 我觉得答案应该解决“自动提交”的使用(或缺少)。也就是说,如果失败的 SQL 命令是事务的一部分,是否会存在相同的行为?
    • 是的,在这种情况下它会给出不同的错误,但其他查询仍在运行。 @pst 确实有一个好点。这些查询会运行,每个查询的结果会自动提交,但您可以关闭自动提交。在事务中,如果其中一个查询失败,事务将回滚到前一个状态。然后删除将不起作用,因为数据库将返回到事务开始之前的状态。
    猜你喜欢
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    相关资源
    最近更新 更多