簡體   English   中英

為什么這個測試SQL注入沒有返回表中的所有行?

[英]Why isn't this test SQL injection returning all rows in the table?

我試圖在我使用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中顯示的結果不同)。

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

查看您的SQL字符串變量與您在查詢函數中放入的變量的不同之處? 您正在構建$query_bad但將$query傳遞給mysql_query()函數。

OR 1始終求值為true,因為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' 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM