为什么即使SQL语句产生语法错误,此SQL注入也会成功?

时间:2012-08-09 00:04:30

标签: mysql sql-injection

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

$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在周围的DELETE查询之前解析并运行SELECT查询吗?当然,我不打算依赖这样弱的PHP代码或MySQL语法错误来防止SQL注入;这个例子引起了我的兴趣。

1 个答案:

答案 0 :(得分:2)

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