INSERT时的SQL注入


SQL injection on INSERT

此处描述的INSERT上的SQL注入似乎不适用于MySQL。INSERT

的SQL注入

当我使用这个语句时:

INSERT INTO COMMENTS VALUES('122','$_GET[value1]');

用'value1'作为变量value:

'); DELETE FROM users; --

这个错误返回:

Error: 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 'DELETE FROM users; --')' at line 1

怎么了? ?

PS:有人建议我做一个SQL注入与此变量值:

',(SELECT group_concat(table_name) FROM information_schema.tables INTO OUTFILE '/var/www/tables.txt'))-- -

但是它也不能工作,并且返回一个语法错误。

您的注入将单个SQL语句(INSERT ...)变为多个SQL语句(INSERT ...; DELETE ...)。

然而,PHP mysql API不支持在单个查询中包含多个语句。(底层MySQL C API必须明确指示支持此功能,而您的绑定不支持此功能。)

正如@pilcrow指出的,mysql_query只接受一条语句。你的例子实际上是两个语句:

INSERT INTO COMMENTS VALUES('122','value');

:

DELETE FROM users;

PHP mysql API会立即拒绝这个,所以你不能用它来测试SQL注入。

语句的另一个问题是注释字符的使用。MySQL注释语法声明:

从"——"序列到行尾。在MySQL中,"——"(双破折号)注释样式要求第二个破折号后面跟着至少一个空白或控制字符(如空格、制表符、换行等等)。这种语法与标准SQL略有不同注释语法,如第1.8.5.5节所讨论的," '——'作为的开始评论"。

所以你必须在--后面有空格。如果使用#,则不需要后面的空格。

开始SQL注入测试的一个更简单和更安全的方法是尝试一个简单的SELECT:

$value = "1' OR 1; -- ";
$sql = "SELECT * FROM mytable WHERE id = '$value'";
print "$sql'n";
// SELECT * FROM mytable WHERE id = '1' OR 1; #'
$result = mysql_query($sql,$con);
// Should return multiple rows (if your table has multiple rows):
while ($row = mysql_fetch_assoc($result)) {
    print "{$row['id']}'n";
}

由于PHP mysql API拒绝多条语句,一些更常用的SQL注入示例将不起作用,这是一件好事。然而,正如你从上面的简单例子中看到的,它并不能阻止其他形式的SQL注入。

想想这样的语句会受到怎样的影响:

DELETE FROM mytable WHERE id = '1'

还要记住,删除数据可能对任何人都没有多大用处,除了那些只想造成破坏的恶意黑客。另一方面,获取你不应该有权访问的机密数据可能非常有用。