[Asp.Net] 常見的幾種網路攻擊方式簡單介紹

摘要:[Asp.Net] 常見的幾種網路攻擊方式簡單介紹


前言


在撰寫網站的時候,我們也必須要注意自己所撰寫的網站是否足夠安全,

像是這陣子鬧得沸沸揚揚的Padding Oracle Attack,對許多網站的影響甚鉅,

在網路如此發達的時代,如果不重視資訊安全,

很可能就會輕易地造成網站的資料外洩,進而造成更多的損失,

所以我們應該更重視網路安全才是,

今天會在這邊簡單介紹幾種常見的網路攻擊方式,

也歡迎大家多多一起討論和補充,讓我們的網站更佳的安全囉 :)

 

常見的幾種攻擊方式

1. XSS (Cross Site Script)

Wiki: http://en.wikipedia.org/wiki/Cross-site_scripting

 

XSS的主要原理就是透過對網站的漏洞,

對網站注入Html或是Javascript等使用者端腳本語言(Client Side Script),

當其他使用者在瀏覽頁面的時候,就會被竊取cookie的資料或是進行某些操作。

 

在Asp.Net之中,預設是不允許使用者傳送包含特殊符號(例如<script>)的資料到Server端,

若嘗試送出這樣的字串則會產生HttpRequestValidationException

(可參考[ASP.Net] 過濾輸入欄位,可能具有危險的字串)

而通常預設我們也不會去關閉ValidateRequest這個Property,

並且對輸出至頁面上的字串先以HttpUtility.Encode()強制編碼來避免危險。

 

那麼,萬一當我們真的需要讓使用者輸入某些Html語法的時候要怎麼辦呢?

我們可以使用Microsoft Anti-Cross Site Scripting Library來過濾輸出的內容,

(保哥也有一篇詳細的介紹推薦使用 Microsoft Anti-Cross Site Scripting Library v3.1)

當然沒有絕對安全的Library,最好的辦法還是儘量限制使用者所能輸入的Html或Javascript語法囉!

 

2. XSRF (Cross-site request forgery)

Wiki: http://en.wikipedia.org/wiki/Cross-site_request_forgery

 

XSRF的主要精神,就是引誘"已經登入"的使用者,

去點擊某些網址,來達到使用你的帳號,對系統進行需有權限才能進行的操作,

(例如像是引誘點擊某個網址,點下去後的效果就是讓你推薦這篇文章或是投票)

 

當然你的帳號的權限越高,所能造成的影響可能就越大,

甚至可以取得各種私密的資料 (比如信用卡資料),

(可以參考Eric大大的XSRF Attack)

 

一種建議的作法是當需要進行有權限的操作時,

同時產生一組只有自己網站能產生且有使用期限的檢查碼,

在進行操作時必須同時驗證這個檢查碼是否正確。

(比如在填寫表單時同時產生並放在Hidden Field,送出時同時驗證這個檢查碼是否相同)

 

3. SQL Injection

Wiki: http://en.wikipedia.org/wiki/SQL_injection

 

SQL Injection的歷史較為悠久,我想大家或許對這個名詞都比較熟悉一點,

它主要就是利用透過在輸入的字串中,夾帶SQL指令來讓資料庫執行,

進而取得私密的資料或是對資料庫進行破壞。

(例如某句SQL可能是 string sql ="delete * from data where id = 「 +  id,

而使用者輸入了 20 and '1' = '1',資料庫的資料就全部被刪除了)

 

所以當我們在撰寫資料庫存取的程式時,要避免使用"拼裝"的方式組SQL,

就像是上面用 "+" 來組字串的方式,在.Net中我們可以使用SQL Parameter來達成同樣的功能,

(可以參考這篇Stop SQL Injection Attacks Before They Stop You)

(之前黃忠成老師在MSDN上有寫了一篇LINQ - 對付 SQL Injection 的 "免費補洞策略"

內容十分詳細,但連結似乎已經失效了,真是可惜!)

 

4. Open Redirect

有時候我們為了計算廣告的點擊資訊,會透過Redirect的方式,

先進行資料蒐集之後,再導至特定的網址去,

但這可能會受到某些釣魚網站的利用,

而且就算我們每次都會針對網站檢查網址是否在自己的Domain也無法避免,

因為網址可能是像 http://www.myWebsite.com/?redirecturl=http://xxx.com

在網址檢查時是完全合法的,因為前面是自己的Domain,

但一執行之後卻被導致特定的釣魚網站,進而被竊取資訊,

我們可以在執行這種操作的時候,多增加一組只有自己網站能產生且有期限的Signature來進行驗證,

或是針對要轉址的網址進行檢查,來避免這種事情的發生。

(更詳細的可以參考這篇文章Open redirect URLs: Is your site being abused?)

 

5. User Input Code

這種攻擊方式主要也是在透過注入特定的指令碼引誘系統執行指令,

在下面舉三種例子,當然可能還有更多其他可能的方式,

第一種是Php的Eval,攻擊者可以透過輸入特定的Php程式碼至此區段來進行攻擊,

第二種是Shell Command Execute,若在系統中會執行某些Shell Command時也必須小心這點,

攻擊者可能會注入某些Command來引誘執行,而得到系統的Administrator權限,

第三種是File Open,攻擊者可能會引誘系統開啟遠端的檔案來執行各種攻擊,

所以當我們在開啟或執行檔案時,必須確實的檢查檔案存在的位置是否是我們所預期的位置。

 

6. Unarthorized Access

今天要講的最後一種是Unarthorized Access,或許你會問說怎麼會允許沒權限的操作呢?

其實這種情況還是有可能會發生的,若今天某個使用者已經登入了,

那麼可能在Cookie中它有著合法的登入資料,在此時系統管理員停用了這個使用者的帳號,

但是他卻還是可以進行各種需要權限的操作,因為在他的Cookie中,登入是合法的!

要避免這種問題的發生,我們可以在Cookie中額外增加一個field存放一組identify key,

每當針對帳號進行重大操作,就進行更換identify key,

如此一來在我們驗證權限時,只要同時進行驗證這組identify key,

就可以更進一步地確認使用者是否擁有有效的權限了!

 

結語

 

除了在寫Code的時候儘量避免造成這些問題之外,

我們也可以借助一些掃瞄工具或是程式碼分析工具來檢查自己的網站是否安全,

我想打造安全且穩固的系統也是每個IT人員的理想目標。

 

在這個資訊爆炸的時代,我們永遠不可能會知道,

是否在明天甚至是下一秒,會不會有一種難以想像的攻擊方式出現,

身為IT人員,只能夠在事前儘量做好各種防範措施,以避免問題的發生,

並且時時注意各大論壇或是知名部落格的最新訊息,來防範各種新漏洞,

達到第一時間的補救,將可能受到的損失降到最低。

 

我們也不能害怕發現漏洞,而是要更積極並正確的面對並解決它,

在上面的文章中簡單的介紹了幾種網站系統中可能的問題或攻擊方式,

如果有任何問題或是有錯誤的地方也請大家多多指教或補充,

希望可以一起打造更安全且穩定的網站,共勉之 ^_^