【问题标题】:SQL injection on INSERTINSERT 上的 SQL 注入
【发布时间】:2011-10-10 17:23:28
【问题描述】:

此处描述的 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'))-- -

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

【问题讨论】:

  • 实际查看实际 SQL 的打印输出会很有帮助。不仅仅是你认为的那样。至少,您正在使用的 PHP 代码,因为您所展示的应该可以工作。
  • 我试过这个 PHP 代码: 使用此输入:sqlinjectiontest.php?value1=');%20DELETE%20FROM%20users;%20--
  • 把它放在你的问题中,而不是在评论中
  • 在字符串中使用数组时,需要将表达式包裹在{}中...'{$_GET[value1]}'...

标签: php mysql sql insert code-injection


【解决方案1】:

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

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

【讨论】:

  • 所以,您实际上是在写,如果不打开文件、编辑并再次保存,就无法进行这样的 SQL 注入。这在现实世界的 SQL 注入中是不可能的。
  • 对不起,我完全不明白那个评论。通常使用的 MySQL C API,特别是 PHP 绑定,不会在单个查询中接受多个语句。
【解决方案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'

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    相关资源
    最近更新 更多