2012-04-23 122 views
15

我在閱讀有關sql注入的信息,並且我知道它是如何工作的,如果有一個表單,用戶可以輸入他的用戶名和登錄名。我沒有得到的是如何沒有登錄頁面的網站可能容易受到sql注入。測試一個網站是否易受Sql注入攻擊

http://thecybersaviours.com/how-to-find-out-if-a-website-is-vulnerable-to-sql-injection

它說只是追加一個 '或 ''=' 來檢驗。我不明白這是如何幫助確定是否存在錯誤。查詢在哪裏構建?

+2

如果用戶的條目傳遞給SQL命令,則任何文本框或用戶可以輸入並輸入數據的任何頁面上的輸入都可以進行SQL注入。 – DOK 2012-04-23 13:24:08

+0

可能的重複[什麼是SQL注入?](http://stackoverflow.com/questions/601300/what-is-sql-injection) – CanSpice 2012-04-23 22:28:59

回答

16

SQL注入是嘗試通過網站界面向數據庫發出SQL命令以獲取其他信息。即,該信息存儲數據庫信息,例如用戶名和密碼。

確保附加到數據庫實例的任何腳本或頁面的首要規則是不要相信用戶輸入

您的示例正試圖在SQL語句中結束錯誤引用的字符串。要了解這一點,你首先需要understand SQL statements。在您添加'到paramater的例子,你的「注射」希望爲以下類型的語句:從用戶

SELECT用戶名,密碼其中username =「$用戶名」

通過追加'這一聲明,然後你可以添加額外的SQL PARAMATERS或查詢:' OR username --

SELECT用戶名,密碼從用戶其中username = '' 或用戶名 - 「$用戶名

是一種注射劑(一種;查詢重塑)。用戶輸入變爲注入語句到預先寫入的SQL語句中。

通常有三種類型的SQL注入方法:

  • 查詢重塑或重定向(以上)
  • 錯誤消息基於(沒有這樣的用戶/口令)
  • 盲注射

閱讀SQL Injection,How to test for vulnerabilities,understanding and overcoming SQL injection,和這個問題(和相關的)在StackOverflow about avoiding injections

編輯:

至於測試您的網站SQL注入,瞭解它獲得的不僅僅是更復雜的「追加一個符號」。如果您的網站很關鍵,並且您(或您的公司)可以負擔得起,請聘請專業筆測試人員。如果沒有,this great exaxmple/proof可以顯示一些可用於執行注射測試的常用技術。還有SQLMap可以自動化SQL注入和數據庫接管場景的一些測試。

2

來自客戶端的任何輸入都是易受攻擊的方式。包括所有表單和查詢字符串。這包括所有的HTTP動詞。

有第三方解決方案可以抓取應用程序並檢測何時會發生注射。

0

測試必須在查詢數據庫的頁面上完成,所以通常是登錄頁面,因爲它是可以造成最大傷害的頁面,但也可能是不安全的頁面。

通常情況下,您會在安全登錄後面進行數據庫查詢,但是如果您只是列出項目或您不在乎世界是否看到黑客可能會在查詢字符串的末尾附加一些sql注入。

SQL注入的關鍵是進行注入的人必須知道你的查詢數據庫,所以如果你不查詢數據庫,那麼沒有SQL注入可以完成。如果你的表單提交給數據庫,那麼是的,他們可以SQL注入。使用任一存儲過程來選擇/插入/更新/刪除或確保您準備或退出將觸及數據庫的所有語句總是很好的做法。

1

登錄頁面不是與數據庫交互的數據庫驅動網站的唯一部分。

用於構建數據庫查詢的任何用戶可編輯輸入都是SQL注入攻擊的潛在入口點。攻擊者可能不一定通過此攻擊以管理員身份登錄該網站,但可以執行其他操作。他們可以根據應用程序與數據庫交互的性質更改數據,更改服務器設置等。

'附加到輸入通常是一個很好的測試,以查看它是否生成錯誤或以其他方式在網站上產生意外的行爲。這表明用戶輸入正在用於構建原始查詢,而開發人員不希望引用單引號,這會改變查詢結構。

請記住,一個頁面可能對SQL注入是安全的,而另一個頁面可能不是。例如,登錄頁面可能會針對此類攻擊加強。但該網站其他頁面的其他頁面可能會廣泛公開。因此,例如,如果有人想以管理員身份登錄,那麼可以使用其他頁面上的SQL注入來更改管理員密碼。然後返回完美的非SQL注入登錄頁面並以管理員身份登錄。

0

保護自己的最簡單方法是使用存儲過程而不是內聯SQL語句。

然後使用「最小權限」權限,只允許訪問存儲過程,而不是直接訪問表。

+0

**注意:**使用存儲過程的行爲本身不是* *防止SQL注入。人們仍然需要了解自己在做什麼。 http://publicvoidlife.blogspot.com/2012/01/stored-procedures-and-sql-injection.html – David 2012-04-23 13:28:28

+0

你是對的。使用存儲過程可以保護您免受SQL注入攻擊,因爲他們知道如何使用它們。 但是我們可以對其他所有方面都這樣說。 SQL服務器安全性工作,當DBA知道他在做什麼。 或者,如果開發人員在錯誤消息中顯示連接字符串,那麼列表會繼續,另外一個。 我想我想說的是,預計最低等級的經驗或人才。 – 2012-04-23 13:56:40

+0

確實。我只是想避免新手用戶(如OP)對某個陳述的錯誤含義可能會失控的誤解。讓這個世界變得更美好:) – David 2012-04-23 13:59:57

3

SQL注入可以在用戶可以影響的任何輸入上完成,但在查詢中使用之前不會正確轉義。

一個例子是一個GET變量是這樣的:

http//www.example.com/user.php?userid=5 

現在,如果伴隨的PHP代碼是這樣的:

$query = "SELECT username, password FROM users WHERE userid=" . $_GET['userid']; 
// ... 

您可以輕鬆地在這裏使用SQL注入太:

http//www.example.com/user.php?userid=5 AND 1=2 UNION SELECT password,username FROM users WHERE usertype='admin' 

(當然,空格將不得不被替換爲%20,但是這更可讀。此外,這只是一個做出更多假設的例子,但這個想法應該很清楚。)