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