INSERT上的SQL注入

时间:2011-07-22 01:54:04

标签: php mysql sql insert code-injection

这里描述的INSERT上的SQL注入似乎不适用于MySQL。 SQL injection on INSERT

当我使用此声明时:

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

将此值作为'value1'变量值:

'); 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作为变量值进行SQL注入:

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

但它也不起作用,并返回语法错误。

2 个答案:

答案 0 :(得分:3)

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

但是,单个查询中的PHP mysql API does not support multiple statements。 (基础MySQL C API必须是explicitly instructed to support this functionality,绑定不能这样做。)

答案 1 :(得分:2)

正如@pilcrow指出的那样,mysql_query只会接受一个声明。你的例子实际上是两个陈述:

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

DELETE FROM users;

PHP mysql API会立即拒绝,因此您无法使用它来测试SQL注入。

该陈述的另一个问题是使用注释字符。 MySQL Comment Syntax表示:

  

从“ - ”序列到行尾。在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'

另外请记住,删除数据对于除了想要造成中断的恶意黑客之外的任何人都没有多大用处。另一方面,获取您不应该访问的机密数据可能非常有用。