1

我试图在使用 WAMP 运行的本地网页上遵循此示例。这是代码

<!DOCTYPE html>
<head>
    <title>Testing SQL injection</title>
</head>
<body>
<?php
$link = mysql_connect('localhost:3306', 'root', 'St@ck0verflow');
if(!$link)
    die('Could not connect: ' . mysql_error());
if(!mysql_select_db('opentarget', $link))//arguments are in revere order compared to mysqli
    die('Could not select database');
// a good user's name
$name = "Onetwo"; 
$query = "SELECT * FROM customers WHERE username = '$name'";
echo "Normal: " . $query . "<br />";
$result = mysql_query($query);
echo "Result: <pre>";
print_r(mysql_fetch_row($result));
echo "</pre><br /><br />";
// user input that uses SQL Injection
$name_bad = "' OR 1'"; 

// our MySQL query builder, however, not a very safe one
$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";
$result = mysql_query($query);
// display what the new query will look like, with injection
echo "Injection: " . $query_bad.'<br />Result: <pre>';
print_r(mysql_fetch_row($result));
echo '</pre>';
echo '<br />Any errors? '.mysql_errno($link) . ": " . mysql_error($link);
?>
</body>
</html>

第一个查询按预期运行,但是当我打印第二个查询的结果时,它与第一个查询相同。我以为它会打印出表格的所有内容?具体是OR 1做什么的?

我尝试从命令行直接在 MySQL 中运行错误查询,除非我做错了什么,否则我会得到空集(这与 PHP 中显示的结果不同)。

4

2 回答 2

3
$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";
$result = mysql_query($query);

看看您的 SQL 字符串变量与您放入查询函数的变量有何不同?您正在构建$query_bad但传递$querymysql_query()函数。

于 2013-08-06T16:53:20.423 回答
0

OR 1 总是计算为真,因为在 PHP 中 1=TRUE。

因此,基本上它试图向您展示当有人将错误的文本放入您在查询中使用的某些数据时会发生什么......

您原来的查询是

SELECT * FROM customers WHERE username = '$name'

但是该名称变量可能设置为以下短语:

' OR 1'

因此,您只需将它们拼凑在一起,就会看到 SQL 将返回的用户名不是只返回您想要的用户名,而是 a) '' [空白],或 b) 任何东西(因为每次 1=TRUE 所以返回该行)。

已编辑 - 添加以下行以帮助澄清

为了更好地简化这一点,想象一下 sql server 正在寻找数据。它将查看每一行并运行该WHERE语句。所以它点击第 1 行并询问does username = "harry"?。如果为真,它将返回该行,如果为假,则跳过该行。

现在,假设您从 Web 表单的输入框中加载 $name。我可能会输入“Harry”或“Tom”或其他什么。这些都是有效的。但是,如果我改为输入Harry' OR TRUE. 在每一行上,SQL 都在询问Does username='Harry' OR TRUE当然它可能将 Username=Harry 评估为 false,但逻辑表达式返回 true,因为第二部分始终为 true。

(0 OR 1) is always evaluated to TRUE.

我希望这有助于澄清。

另外,请查看此链接以更好地了解注入攻击... http://www.unixwiz.net/techtips/sql-injection.html

于 2013-08-06T16:58:36.027 回答