这里描述的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注入:
',(SELECT group_concat(table_name) FROM information_schema.tables INTO OUTFILE '/var/www/tables.txt'))-- -
但它也不起作用,并返回一个语法错误。
发布于 2011-07-22 11:26:07
您的注入将单个SQL语句(INSERT ...)转换为多个SQL语句(INSERT ...; DELETE ...)。
但是,PHP mysql API在单个查询中使用does not support multiple statements。(底层的MySQL C应用程序接口必须是explicitly instructed to support this functionality,而您的绑定不是这样做的。)
发布于 2011-07-22 21:29:10
正如@pilcrow指出的那样,mysql_query将只接受一条语句。您的示例实际上是两个语句:
INSERT INTO COMMENTS VALUES('122','value');和:
DELETE FROM users;PHP会立即拒绝它,所以您不能用它来测试mysql注入。
该语句的另一个问题是注释字符的使用。MySQL Comment Syntax声明:
从“--”序列到行尾的
。在MySQL中,“--”(双破折号)注释样式要求第二个破折号后跟至少一个空格或控制字符(如空格、制表符、换行符等)。此语法与1.8.5.5小节“‘--’作为注释开头”中讨论的标准SQL注释语法略有不同。
所以你必须在--后面有空格。如果您使用#,则不需要后面的空格。
开始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注入示例将不起作用,这是一件好事。但是,正如您从上面的简单示例中所看到的,它不会阻止SQL注入上的其他表单。
想一想像这样的语句会受到怎样的影响:
DELETE FROM mytable WHERE id = '1'还要记住,删除数据可能对任何人都没有多大用处,除了恶意黑客,他们只是想造成破坏。另一方面,获取您不应该访问的机密数据可能非常有用。
https://stackoverflow.com/questions/6784902
复制相似问题