Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL注入:是否可以修改select的子查询?_Mysql_Security_Sql Injection - Fatal编程技术网

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

Mysql SQL注入:是否可以修改select的子查询?,mysql,security,sql-injection,Mysql,Security,Sql Injection,是否可以让子查询在SELECT查询中修改数据库?相关数据库是一个mysql数据库 更多详情: 相关查询如下所示: SELECT * FROM table WHERE id = $x 变量$x可以用任何东西替换。唯一的限制是,查询是通过php的mysql_query()执行的,这会阻止执行多个后续查询。在这种情况下,修改DB将很容易,只需设置 $x = "42; DROP TABLE foo;" 编辑: mysql\u query()仅在5.0之前的mysql版本中阻止多个查询 因此,是的,能

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

更多详情: 相关查询如下所示:

SELECT * FROM table WHERE id = $x
变量$x可以用任何东西替换。唯一的限制是,查询是通过php的mysql_query()执行的,这会阻止执行多个后续查询。在这种情况下,修改DB将很容易,只需设置

$x = "42; DROP TABLE foo;"
编辑:

mysql\u query()
仅在5.0之前的mysql版本中阻止多个查询

因此,是的,能够执行登录名有权执行的用于连接数据库的任何命令

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

例如,假设将$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注入攻击也可以用来刮取数据库中的每一点数据


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

可以想象,可以在
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语句,您就会遇到麻烦。在这种情况下,需要使用
关闭子查询,攻击者需要了解您的查询结构。盲目地尝试注射攻击会更加困难,但如果机器人正在这样做,这是完全可能的。

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

那么,如果你得到一个关于某个特定注射方法的否定答案呢?

你认为自己安全吗?如果注射是可能的-无论是哪种注射都无所谓。一个或另一个-没关系。阅读的灾难性不亚于写作。

我知道sql注入,但完成当前查询的明显方法是简单地添加一个“;”在此处添加另一条语句不起作用-请参见上面的“我的编辑”。创建一个只有读取权限的SQL用户,并在该用户上运行查询。简单和安全。这就是我想要做的-我只是想寻找一种方法来证明使用这种查询的网站是不安全的(显然是…),你更新的例子并没有显示一个技术意义上的术语。。。你问的是多个命令而不是具体的子查询吗?不,更新后的示例显示了它不起作用的方式,但我已经尝试过了。像你这样的查询也是我的想法。但是,这样的查询总是产生语法错误,从“DELETE”开始。@Jost请参见上面的更改。您认为
1=1和DELETE
在MySQL中无法像在Oracle或SQL Server中那样工作,这是正确的。但是,如果所使用的API允许多个查询,那么通过使用
终止第一条语句,上述操作现在就可以工作了
@Jost上述方法在标准的PHP
mysql_query()
中不起作用,例如,其中只执行一个查询(直到第一个
)。但是,我并没有要求这个问题让我感到节省—我知道如何防止SQL注入。此问题的目的是能够向客户演示特定站点上的漏洞。您也可以在不删除表的情况下演示漏洞。这就是问题所在。@Col.Shrapnel我想我在我的回答摘要中提到了你的意思。。。“即使您用于连接数据库的登录名不允许进行修改,SQL注入攻击也可以用来从数据库中刮取每一点数据…”