1. 網站安全的攻與防
網際網路環境魚龍混雜,網站被攻擊是常見現象,所以瞭解一些常見的網站攻擊手段十分必要。下面列舉比較常見的 4 種攻擊手段:
1.1. 跨站指令碼攻擊(XSS)
概念
跨站指令碼攻擊(Cross-Site Scripting, XSS),是一種網站應用程式的安全漏洞攻擊,是程式碼注入的一種。它允許惡意使用者將程式碼注入到網頁上,其他使用者在觀看網頁時就會受到影響。這類攻擊通常包含了 HTML 以及使用者端指令碼語言。
XSS 攻擊示例:
假如有下面一個 textbox
<input type="text" name="address1" value="value1from">複製程式碼
value1from 是來自使用者的輸入,如果使用者不是輸入 value1from,而是輸入 "/><script>alert(document.cookie)</script><!-
那麼就會變成:
<input type="text" name="address1" value=""/><script>alert(document.cookie)</script><!- ">複製程式碼
嵌入的 JavaScript 程式碼將會被執行。攻擊的威力,取決於使用者輸入了什麼樣的指令碼。
攻擊手段和目的
常用的 XSS 攻擊手段和目的有:
- 盜用 cookie,獲取敏感資訊。
- 利用植入 Flash,通過 crossdomain 許可權設定進一步獲取更高許可權;或者利用 Java 等得到類似的操作。
- 利用 iframe、frame、XMLHttpRequest 或上述 Flash 等方式,以(被攻擊)使用者的身份執行一些管理動作,或執行一些一般的如發微博、加好友、發私信等操作。
- 利用可被攻擊的域受到其他域信任的特點,以受信任來源的身份請求一些平時不允許的操作,如進行不當的投票活動。
- 在訪問量極大的一些頁面上的 XSS 可以攻擊一些小型網站,實現 DDoS 攻擊的效果。
應對手段
- 過濾特殊字元 - 將使用者所提供的內容進行過濾,從而避免 HTML 和 Jascript 程式碼的執行。如
>
轉義為>
、<
轉義為<
等,就可以防止大部分攻擊。為了避免對不必要的內容錯誤轉移,如3<5
中的<
需要進行文字匹配後再轉移,如:<img src=
這樣的上下文中的<
才轉義。 - 設定 Cookie 為 HttpOnly - 設定了 HttpOnly 的 Cookie 可以防止 JavaScript 指令碼呼叫,就無法通過 document.cookie 獲取使用者 Cookie 資訊。
1.2. 跨站請求偽造(CSRF)
概念
跨站請求偽造(Cross-site request forgery,CSRF),也被稱為 one-click attack 或者 session riding,通常縮寫為 CSRF 或者 XSRF。它 是一種挾制使用者在當前已登入的 Web 應用程式上執行非本意的操作的攻擊方法。和跨站指令碼(XSS)相比,XSS 利用的是使用者對指定網站的信任,CSRF 利用的是網站對使用者網頁瀏覽器的信任。
攻擊手段和目的
可以如此理解 CSRF:攻擊者盜用了你的身份,以你的名義傳送惡意請求。
CSRF 能做的事太多:
- 以你名義傳送郵件,發訊息
- 用你的賬號購買商品
- 用你的名義完成虛擬貨幣轉賬
- 洩露個人隱私
- ...
應對手段
- 表單 Token - CSRF 是一個偽造使用者請求的操作,所以需要構造使用者請求的所有引數才可以。表單 Token 通過在請求引數中新增隨機數的辦法來阻止攻擊者獲得所有請求引數。
- 驗證碼 - 請求提交是,需要使用者輸入驗證碼,以避免使用者在不知情的情況下被攻擊者偽造請求。
- Referer check - HTTP 請求頭的 Referer 域中記錄著請求資源,可通過檢查請求來源,驗證其是否合法。
1.3. SQL 注入攻擊
概念
SQL 注入攻擊(SQL injection),是發生於應用程式之資料層的安全漏洞。簡而言之,是在輸入的字串之中注入 SQL 指令,在設計不良的程式當中忽略了檢查,那麼這些注入進去的指令就會被資料庫伺服器誤認為是正常的 SQL 指令而執行,因此遭到破壞或是入侵。
攻擊示例:
考慮以下簡單的登入表單:
<form action="/login" method="POST">
<p>Username: <input type="text" name="username" /></p>
<p>Password: <input type="password" name="password" /></p>
<p><input type="submit" value="登陸" /></p>
</form>複製程式碼
我們的處理裡面的 SQL 可能是這樣的:
username:=r.Form.Get("username")
password:=r.Form.Get("password")
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='xxx'複製程式碼
在 SQL 裡面 --
是註釋標記,所以查詢語句會在此中斷。這就讓攻擊者在不知道任何合法使用者名稱和密碼的情況下成功登入了。
對於 MSSQL 還有更加危險的一種 SQL 注入,就是控制系統,下面這個可怕的例子將演示如何在某些版本的 MSSQL 資料庫上執行系統命令。
sql:="SELECT * FROM products WHERE name LIKE '%"+prod+"%'"
Db.Exec(sql)複製程式碼
如果攻擊提交 a%' exec master..xp_cmdshell 'net user test testpass /ADD' --
作為變數 prod 的值,那麼 sql 將會變成
sql:="SELECT * FROM products WHERE name LIKE '%a%' exec master..xp_cmdshell 'net user test testpass /ADD'--%'"複製程式碼
MSSQL 伺服器會執行這條 SQL 語句,包括它後面那個用於向系統新增新使用者的命令。如果這個程式是以 sa 執行而 MSSQLSERVER 服務又有足夠的許可權的話,攻擊者就可以獲得一個系統帳號來訪問主機了。
雖然以上的例子是針對某一特定的資料庫系統的,但是這並不代表不能對其它資料庫系統實施類似的攻擊。針對這種安全漏洞,只要使用不同方法,各種資料庫都有可能遭殃。
攻擊手段和目的
- 資料表中的資料外洩,例如個人機密資料,賬戶資料,密碼等。
- 資料結構被黑客探知,得以做進一步攻擊(例如
SELECT * FROM sys.tables
)。 - 資料庫伺服器被攻擊,系統管理員賬戶被竄改(例如
ALTER LOGIN sa WITH PASSWORD='xxxxxx'
)。 - 獲取系統較高許可權後,有可能得以在網頁加入惡意連結、惡意程式碼以及 XSS 等。
- 經由資料庫伺服器提供的作業系統支援,讓黑客得以修改或控制作業系統(例如 xp_cmdshell "net stop iisadmin"可停止伺服器的 IIS 服務)。
- 破壞硬碟資料,癱瘓全系統(例如 xp_cmdshell "FORMAT C:")。
應對手段
- 使用引數化查詢 - 建議使用資料庫提供的引數化查詢介面,引數化的語句使用引數而不是將使用者輸入變數嵌入到 SQL 語句中,即不要直接拼接 SQL 語句。例如使用 database/sql 裡面的查詢函式
Prepare
和Query
,或者Exec(query string, args ...interface{})
。 - 單引號轉換 - 在組合 SQL 字串時,先針對所傳入的引數作字元取代(將單引號字元取代為連續 2 個單引號字元)。
1.4. 拒絕服務攻擊(DoS)
拒絕服務攻擊(denial-of-service attack, DoS)亦稱洪水攻擊,是一種網路攻擊手法,其目的在於使目標電腦的網路或系統資源耗盡,使服務暫時中斷或停止,導致其正常使用者無法訪問。
當黑客使用網路上兩個或以上被攻陷的電腦作為“殭屍”向特定的目標發動“拒絕服務”式攻擊時,稱為分散式拒絕服務攻擊(distributed denial-of-service attack,縮寫:DDoS attack、DDoS)。
攻擊方式
- 頻寬消耗型攻擊
- 資源消耗型攻擊
應對手段
- 防火牆 - 允許或拒絕特定通訊協議,埠或 IP 地址。當攻擊從少數不正常的 IP 地址發出時,可以簡單的使用拒絕規則阻止一切從攻擊源 IP 發出的通訊。
- 路由器、交換機 - 具有速度限制和訪問控制能力。
- 流量清洗 - 通過採用抗 DDoS 軟體處理,將正常流量和惡意流量區分開。
2. 加密技術及金鑰安全管理
對於網站來說,使用者資訊、賬戶等等敏感資料一旦洩漏,後果嚴重,所以為了保護資料,應對這些資訊進行加密處理。
資訊加密技術一般分為:
- 訊息摘要
- 加密演算法
- 對稱加密
- 非對稱加密
- 證照
2.1. 訊息摘要
常用數字簽名演算法:MD5、SHA 等。
應用場景:將使用者密碼以訊息摘要形式儲存到資料庫中。
2.2. 加密演算法
對稱加密
對稱加密指加密和解密所使用的金鑰是同一個金鑰。
常用對稱加密演算法:DES 等。
應用場景:Cookie 加密、通訊機密等。
非對稱加密
非對稱加密指加密和解密所使用的不是同一個金鑰,而是一個公私鑰對。用公鑰加密的資訊必須用私鑰才能解開;反之,用私鑰加密的資訊只有用公鑰才能解開。
常用非對稱加密演算法:RSA 等。
應用場景:HTTPS 傳輸中瀏覽器使用的數字證照實質上是經過權威機構認證的非對稱加密公鑰。
2.3. 金鑰安全管理
保證金鑰安全的方法:
- 把金鑰和演算法放在一個獨立的伺服器上,對外提供加密和解密服務,應用系統通過呼叫這個服務,實現資料的加解密。
- 把加解密演算法放在應用系統中,金鑰則放在獨立伺服器中,為了提高金鑰的安全性,實際儲存時,金鑰被切分成數片,加密後分別儲存在不同儲存介質中。
2.3. 證照
證照可以稱為資訊保安加密的終極手段。公開金鑰認證(英語:Public key certificate),又稱公開金鑰證照、公鑰證照、數字證照(digital certificate)、數字認證、身份證照(identity certificate)、電子證照或安全證照,是用於公開金鑰基礎建設的電子檔案,用來證明公開金鑰擁有者的身份。此檔案包含了公鑰資訊、擁有者身份資訊(主體)、以及數字證照認證機構(發行者)對這份檔案的數字簽名,以保證這個檔案的整體內容正確無誤。
透過信任權威數字證照認證機構的根證照、及其使用公開金鑰加密作數字簽名核發的公開金鑰認證,形成信任鏈架構,已在 TLS 實現並在全球資訊網的 HTTP 以 HTTPS、在電子郵件的 SMTP 以 STARTTLS 引入並廣泛應用。
眾所周知,常見的應用層協議 HTTP、FTP、Telnet 本身不保證資訊保安。但是加入了 SSL/TLS 加密資料包機制的 HTTPS、FTPS、Telnets 是資訊保安的。
概念
傳輸層安全性協議(Transport Layer Security, TLS),及其前身安全套接層(Secure Sockets Layer, SSL)是一種安全協議,目的是為網際網路通訊,提供安全及資料完整性保障。
證照原理
SSL/TLS 協議的基本思路是採用公鑰加密法,也就是說,客戶端先向伺服器端索要公鑰,然後用公鑰加密資訊,伺服器收到密文後,用自己的私鑰解密。
這裡有兩個問題:
(1)如何保證公鑰不被篡改?
解決方法:將公鑰放在數字證照中。只要證照是可信的,公鑰就是可信的。
(2)公鑰加密計算量太大,如何減少耗用的時間?
解決方法:每一次對話(session),客戶端和伺服器端都生成一個"對話金鑰"(session key),用它來加密資訊。由於"對話金鑰"是對稱加密,所以運算速度非常快,而伺服器公鑰只用於加密"對話金鑰"本身,這樣就減少了加密運算的消耗時間。
SSL/TLS 協議的基本過程是這樣的:
- 客戶端向伺服器端索要並驗證公鑰。
- 雙方協商生成"對話金鑰"。
- 雙方採用"對話金鑰"進行加密通訊。