如果你每天訪問的網站需要登錄
那麼你的登錄用戶名和密碼很可能是保存在關系數據庫中
其他網站用戶的登錄信息也和你一起保存在數據庫中
但願你的密碼保存前經過加密處理
如果是明文存儲的話簡直太可怕了
不幸的是有一些網站存在安全漏洞攻擊者可以通過一種叫做SQL注入的攻擊技術竊取到存儲在數據庫中的密碼信息
更令人擔憂的是即使數據庫打上所有補丁也不能避免這種攻擊這不是一個補丁問題更多的與數據庫工作方式及系統設計有關
這種攻擊可以針對任何包含來自數據庫的數據的網頁如一個搜索頁面客戶意見反饋頁面不管數據庫是MySQLSQL Server還是Oracle都無法避免這種攻擊SQL注入攻擊不僅是針對SQL Server的
通常在數據庫中使用一個表來存儲用戶登錄信息這個表至少有兩列一列存儲用戶名(username)另一列存儲密碼(password)而表名通常會被取為users或類似的名字
當用戶在網站上提交他們的詳細信息時數據庫將會解析username和password然後轉換為SQL字符串發送給數據庫數據庫引擎接收到的SQL類似
SELECT * FROM users WHERE username =
fredsmith
AND password =
userspassword
這是一個非常標准的SQL語句無論你使用什麼數據庫存儲用戶的數據SQL語句看起來都大同小異
攻擊者對SQL注入攻擊非常有興趣因為他們通過發送一些偽造數據就可以操縱數據庫如傳入一個無效用戶名
SELECT * FROM users WHERE username =
AND password =
攻擊者提供一個單引號字符作為用戶名一個空格作為密碼數據庫也表現得非常好遇到這種查詢就返回一個錯誤消息但攻擊者看到返回的錯誤消息後不會就此罷手而是要深入挖掘可利用的信息可能一不小心數據庫就暴露了表結構這正是攻擊者想要得到的東西經驗豐富的攻擊者可以迅速地入侵數據庫
在接下來的例子中通過向username添加其它字符串來進一步欺騙數據庫例如如果我們輸入or email=作為用戶名查詢解析器將會解析為
SELECT * FROM users
WHERE username =
or email=
AND password =
如果數據庫users表中不存在email列它可能會爆出一個錯誤另一方面它可能無法給出錯誤消息暗示缺少一列email我們需要做的是給用戶輸入一個email地址由於大多數機構都有一個標准的電子郵件地址結構因此很容易得到員工的名字然後使用這個名字作為SQL注入時的用戶名
正如你所看到的從用戶登錄頁面就可以很容易地構造出數據庫結構有時通過猜測也可以得到數據庫結構
好消息是保護數據庫避免SQL注入也完全是可能的常見的措施包括過濾用戶輸入Cookie和URL中的單引號雙引號斜線反斜線和分號等特殊字符此外數字值先轉換成整數再傳遞給數據庫
另一方面數據庫活動監控解決方案通常會保護Web應用程序處於學習模式的數據庫活動監控工具會自動學習應用程序的正常活動學習完後就知道哪些活動是正常的因此攻擊者偽造的查詢就會被診斷為可疑活動遇到這種行為數據庫活動監控工具就會產生一個警告並采取適當的行動阻止非正常活動
良好的系統設計是防止SQL注入的重要方法但和數據庫活動監控工具結合使用你將會更加放心
From:http://tw.wingwit.com/Article/program/Oracle/201311/16671.html