如何执行SQL注入使SELECT语句UPDATE或INSERT行?

时间:2013-01-01 18:43:38

标签: php mysql sql-injection

  

可能重复:
  MySQL Injection - Use SELECT query to UPDATE/DELETE

所以我在我的网站上发现了允许执行sql注入的bug http://mysite.com/script.php?id=1 union select 1,2,3将输出Id属性等于1的所有字段以及1,2,3的额外行。我知道我必须验证用户输入以关闭我的错误。

然而我的问题却是另一回事。是否可以执行更新查询或插入查询?我可以使用 - 来评论查询,但是我不能使用由;分隔的多个语句。所以可以在我的情况下执行更新查询。如果需要,我可以显示PHP代码和SQL查询。

$sql    = "SELECT id, title, text from table where cId=$val";
$result = mysql_query($sql);
$array  = mysql_fetch_array($result);
//echo rows in table

3 个答案:

答案 0 :(得分:3)

MySQL Injection - Use SELECT query to UPDATE/DELETE来判断 所有保护你是mysql_query的限制。我不会依赖于此,特别是它不会随着时间的推移而保持这种状态。您永远不应该依赖于默认情况下禁用的功能。 也许下一个版本已经允许使用。

等语句
SELECT id, title, text from table where cId=1; DROP table table

答案 1 :(得分:0)

不,这是不可能的。很可能你运行 mysql_query ,这不允许在一次传递中运行多个查询。因此,如果您的查询以SELECT开头(就像它一样),它将不允许任何UPDATE注入

编辑:即使在输入中也使用 mysql_real_escape_string

答案 2 :(得分:0)

默认情况下,这是不可能的。虽然有mysql_query选项可以在MySQL 5.0之后的一个字符串中运行多个语句,但必须使用mysql_set_server_option进行设置。

请考虑更改您的语句命令,以使用mysql_real_escape_string

$q = mysql_fetch_array(mysql_query("SELECT id, title, text from table where cId = " . mysql_real_escape_string($val)));

您最好将代码更改为使用PDO,因为所有mysql_ *函数都已正式弃用。