为什么单引号会导致我的应用程序出错?

时间:2016-12-29 08:37:44

标签: php mysql sql-injection

我从一本关于SQL注入的书中得到了以下易受攻击的代码。但是当我尝试利用它并将0 0添加到输入时,它会给我一个这样的错误:

  

您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的'''附近使用正确的语法

为什么我会收到此错误?

'

1 个答案:

答案 0 :(得分:2)

我不知道您的引用字符是什么,但让我们看看这行代码:

// build dynamic SQL statement
$SQL = “SELECT ∗ FROM table WHERE field = ‘$_GET[“input”]’;”;
// execute sql statement
$result = mysql_query($SQL);
// check to see how many rows were returned from the database
$rowcount = mysql_num_rows($result);
// iterate through the record set returned
$row = 1;
while ($db_field = mysql_fetch_assoc($result))
{
if ($row <= $rowcount)
{
print $db_field[$row]. “<BR>”;
$row++;
}
}

因此,假设您想要利用它并获取所有行。如果设置$SQL = "SELECT ∗ FROM table WHERE field = '$_GET[input]';"; ,则会得到以下SQL:

$_GET[input] = "' OR 1=1"

这是无效的SQL。为什么?因为最后你有一个SQL解释器不理解的迷路SELECT ∗ FROM table WHERE field = '' OR 1=1';" 。在一个条件之后,没有假设是报价的开头,所有报价应该被关闭!这就是你得到错误的原因。

因此,要成功注入,您需要确保生成有效的SQL。在这种情况下,您可以尝试使用生成此内容的有效负载'

' OR '' = '

或者只需使用SELECT ∗ FROM table WHERE field = '' OR '' = '';" 中的评论来中和查询的其余部分:

' OR 1=1 --