sql注入攻擊(sql injection),簡稱注入攻擊,是web開發中最常見的一種安全漏洞。可以用它來從資料庫獲取敏感資訊,或者利用資料庫的特性執行新增使用者,匯出檔案等一系列惡意操作,甚至有可能獲取資料庫乃至系統使用者最高許可權。
而造成sql注入的原因是因為程式沒有有效過濾使用者的輸入,使攻擊者成功的向伺服器提交惡意的sql查詢**,程式在接收後錯誤的將攻擊者的輸入作為查詢語句的一部分執行,導致原始的查詢邏輯被改變,額外的執行了攻擊者精心構造的惡意**。
很多web開發者沒有意識到sql查詢是可以被篡改的,從而把sql查詢當作可信任的命令。殊不知,sql查詢是可以繞開訪問控制,從而繞過身份驗證和許可權檢查的。更有甚者,有可能通過sql查詢去執行主機系統級的命令。
下面將通過一些真實的例子來詳細講解sql注入的方式。
考慮以下簡單的登入表單:
我們的處理裡面的sql可能是這樣的:
string username = "jack";
string password = "123456";
string sql = "select * from user where username = '" + username + "' and password = '" + password + "'";
如果使用者的輸入的使用者名稱如下,密碼任意
myuser' or 'foo' = 'foo' --
那麼我們的sql變成了如下所示:
select * from user where username ='myuser'
or'foo'=='foo' --''
and password='***'
在sql裡面--
是注釋標記,所以查詢語句會在此中斷。這就讓攻擊者在不知道任何合法使用者名稱和密碼的情況下成功登入了。
對於mssql還有更加危險的一種sql注入,就是控制系統,下面這個可怕的例子將演示如何在某些版本的mssql資料庫上執行系統命令。
string sql = "select * from products where name like
'%"+prod+"%'
"//execute sql
如果攻擊提交
a%'
exec master..xp_cmdshell 'net user test testpass /add' --
作為變數 prod的值,那麼sql將會變成
string sql ="select * from products where name like
'%a%'
exec
master..xp_cmdshell 'net user test testpass /add'
--%'"
mssql伺服器會執行這條sql語句,包括它後面那個用於向系統新增新使用者的命令。如果這個程式是以sa執行而 mssqlserver服務又有足夠的許可權的話,攻擊者就可以獲得乙個系統帳號來訪問主機了。
雖然以上的例子是針對某一特定的資料庫系統的,但是這並不代表不能對其它資料庫系統實施類似的攻擊。針對這種安全漏洞,只要使用不同方法,各種資料庫都有可能遭殃。
也許你會說攻擊者要知道資料庫結構的資訊才能實施sql注入攻擊。確實如此,但沒人能保證攻擊者一定拿不到這些資訊,一旦他們拿到了,資料庫就存在洩露的危險。如果你在用開放源**的軟體包來訪問資料庫,比如論壇程式,攻擊者就很容易得到相關的**。如果這些**設計不良的話,風險就更大了。目前discuz、phpwind、phpcms等這些流行的開源程式都有被sql注入攻擊的先例。
這些攻擊總是發生在安全性不高的**上。所以,永遠不要信任外界輸入的資料,特別是來自於使用者的資料,包括選擇框、表單隱藏域和 cookie。就如上面的第乙個例子那樣,就算是正常的查詢也有可能造成災難。
sql注入攻擊的危害這麼大,那麼該如何來防治呢?下面這些建議或許對防治sql注入有一定的幫助。
嚴格限制web應用的資料庫的操作許可權,給此使用者提供僅僅能夠滿足其工作的最低許可權,從而最大限度的減少注入攻擊對資料庫的危害。
檢查輸入的資料是否具有所期望的資料格式,嚴格限制變數的型別,例如使用regexp包進行一些匹配處理,或者使用strconv包對字串轉化成其他基本型別的資料進行判斷。
對進入資料庫的特殊字元('"\尖括號&*;等)進行轉義處理,或編碼轉換
所有的查詢語句建議使用資料庫提供的引數化查詢介面,引數化的語句使用引數而不是將使用者輸入變數嵌入到sql語句中,即不要直接拼接sql語句。例如使用database/sql
裡面的查詢函式prepare
和query
,或者exec(query string, args ...inte***ce{})
。
在應用發布之前建議使用專業的sql注入檢測工具進行檢測,以及時修補被發現的sql注入漏洞。網上有很多這方面的開源工具,例如sqlmap、sqlninja等。
避免**列印出sql錯誤資訊,比如型別錯誤、欄位不匹配等,把**裡的sql語句暴露出來,以防止攻擊者利用這些錯誤資訊進行sql注入。
通過上面的示例我們可以知道,sql注入是危害相當大的安全漏洞。所以對於我們平常編寫的web應用,應該對於每乙個小細節都要非常重視,細節決定命運,生活如此,編寫web應用也是這樣。
避免SQL注入
sql注入攻擊 sql injection 簡稱注入攻擊,是web開發中最常見的一種安全漏洞。可以用它來從資料庫獲取敏感資訊,或者利用資料庫的特性執行新增使用者,匯出檔案等一系列惡意操作,甚至有可能獲取資料庫乃至系統使用者最高許可權。而造成sql注入的原因是因為程式沒有有效過濾使用者的輸入,使攻擊者...
SqlParameter避免sql注入
簡單的給個示例 傳統的查詢語句的sql可能為 string sql select from users where user id request.querystring uid 很顯然,我們在這裡拼接了字串,這就給sql注入留下了可乘之機。現在,我們要改寫這樣的語句,使用sqlparameter來...
24 SQL注入是什麼,如何避免SQL注入?
sql 注入 sql injection 是發生在 web 程式中資料庫層的安全漏洞,是 存在最多也是最簡單的漏洞。主要原因是程式對使用者輸入資料的合法性沒有判斷和處理,導致攻擊者可以在 web 應用程式中事先定義好的 sql 語句中新增額外的 sql 語句,在管理員不知情的情況下實現非法操作,以此...