SQL注入:是否可以修改select的子查询?

时间:2012-02-15 14:05:50

标签: mysql security sql-injection

是否可以在SELECT-Query中修改数据库的子查询?相关数据库是一个mysql数据库。

更多细节: 相关查询如下所示:

SELECT * FROM table WHERE id = $x

变量$ x可以替换为任何东西。唯一的限制是,查询是通过php的mysql_query()执行的,这会阻止执行多个后续查询。在这种情况下,修改数据库很容易,只需设置

即可
$x = "42; DROP TABLE foo;"

3 个答案:

答案 0 :(得分:3)

编辑:

mysql_query()仅阻止早于5.0的MySql版本中的多个查询。 MySql 5.0 or later will allow multiple commands separated by ; when using mysql_query().

所以,是的,a SQL Injection attack能够执行用于连接数据库的登录所具有的权限。

如果使用管理员权限进行连接,则攻击可以对数据库进行基本上任何可能的修改。

例如,假设您将$ email值连接到下面的SQL字符串:

"SELECT email, passwd, login_id, full_name
  FROM members
 WHERE email = '" + $email + "'"

但是我们可以说$ email值包含字符串:

        x';INSERT INTO members ('email','passwd','login_id','full_name') 
        VALUES ('steve@unixwiz.net','hello','steve','Steve Friedl');--

您最终得到以下声明:

SELECT email, passwd, login_id, full_name
  FROM members
 WHERE email = 'x';
        INSERT INTO members ('email','passwd','login_id','full_name') 
        VALUES ('steve@unixwiz.net','hello','steve','Steve Friedl');--';

即使您用于连接数据库的登录不允许进行修改,也可以使用SQL注入攻击来清除数据库中的每一点数据......

绝对建议您在客户端应用程序中使用某种形式的参数化查询来保护自己。

答案 1 :(得分:2)

可以想象,子查询可以在SELECT语句中修改数据库。只要使用的API允许每个语句多次查询,以下示例就可以工作:

考虑填充以下错误数据的injectvar。其目的是在子查询WHERE子句中使用:

injectvar = "0); DELETE FROM tbl; --"

SELECT a, b
FROM tbl 
WHERE a IN (SELECT DISTINCT c FROM tbl2 WHERE d = injectvar)

结果:

SELECT a, b
FROM tbl 
WHERE a IN (SELECT DISTINCT c FROM tbl2 WHERE d = 0); DELETE FROM tbl; --)

只要注入代码可以形成有效的SQL语句,您就会遇到麻烦。在这种情况下,它需要使用)关闭子查询,攻击者需要了解您的查询结构。盲目尝试注射攻击会更加困难,但如果机器人正在这样做,则完全有可能。

答案 2 :(得分:-2)

我认为提出这样的问题毫无意义。

那么如果你对一种特定的注射方法得到否定答案呢? 你认为自己安全吗?如果可以注射 - 它不是什么问题。一个或另一个 - 它并不重要。阅读并不比写作更具灾难性。