這一篇博客記錄的是服務端安全應用安全的知識,學習內容來自《白帽子講Web安全》。
承接自上一篇客戶端安全之後,包括注入攻擊、認證與會話管理和訪問控制、訪問控制、加密算法與隨機數、Web框架安全、應用層拒絕服務攻擊DDOS、Web Server安全等方面。
文章目錄
注入攻擊
由於應用違背了“數據與代碼分離的原則”。兩個條件:1.用戶能控制數據的輸入;2.代碼拼湊了用戶輸入的數據。
SQL注入
盲注
在服務器沒有錯誤回顯的時候完成注入攻擊。驗證方法:構造簡單的條件語句根據頁面是否發生變化來判斷SQL語句是否執行。
Timing Attack
利用數據庫中某些特殊的函數,可以有條件地造成延遲。
例如在MySQL中,利用BENCHMARK()函數,可以讓同一個函數執行若干次,使得返回的結果比平均時間要長,通過時間長短的變化,可以判斷出注入語句是否執行成功。這是一種 邊信道攻擊 。
eg:
1170 UNION SELECT IF(SUBSTRING(current,1,1) =
CHAR(119),BENCHMARK(5000000,ENCODE('MSG','by
5 seconds')),null) FROM (Select Database()
as current) as tbl;
這段Payload判斷庫名的第一個字母是否爲CHAR(119),即小寫的w。如果判斷結果爲真,
則會通過BENCHMARK()函數造成較長延時;如果不爲真,則該語句將很快執行完。攻擊者
遍歷所有字母,直到將整個數據庫名全部驗證完成爲止。
此外,例如如此的手段還可以獲得很多有關數據庫的信息。
數據庫攻擊技巧
常見的攻擊機巧
SQL注入可以猜解數據庫的版本。有自動化工具完成猜解username和password。。(猜解。。暴力),可以獲取到當前用戶的身份,從而進行進一步的文件操作,通過LOAD_FILE讀出,然後INTODUMOFILE寫入系統,最後通過LOAD DATA INFILE將文件導入表中。這種技巧可以導出Web-shell,爲進一步攻擊做好準備。
自動化注入工具:sqlmap
命令執行
在MySQL中,除了直接導出Web-shell間接執行命令之外,還可以利用UDF(USER-Defined-Functions)來執行命令。若當前用戶是root,則可以直接獲取到root權限。
攻擊存儲過程
存儲過程爲數據庫提供了強大的功能,但必須用CALL或者EXECUTE執行。在注入過程中,存儲過後才能爲攻擊者提供很大便利。例如MS SQL Server中,“xp_cmd-shell”執行系統命令。
編碼問題
注入攻擊中常常用到的單引號和雙引號等特殊字符。當數據集採用了“寬字符集”的時候,就會產生一些漏洞,比如幾個編碼代表一個字符,例如。
0xbf27 or 1=1 經過轉義之後 成爲 經過轉義後,會變成0xbf5c27(“\”的ASCII碼爲0x5c),但0xbf5c又是一個字符。故原有的轉義字符 \ 就會“吃掉”。
統一設置爲UTF-8是一個很好的辦法,也就是,設置頁面meta標籤的charset屬性。
SQL Column Truncation
MySQL數據庫中,strict模式不開啓會導致重複數據插入或其他非法數據插入,從而有可能獲得越權訪問。
正確地防禦SQL注入
-
找到所有SQL注入漏洞
-
修補這些漏洞
使用預編譯語句:最佳方式是使用預編譯語句,綁定變量,用戶的輸入無法改變語句的結構和語義。
使用存儲過程:將SQL語句定義在數據庫中,避免使用動態的SQL語句。
檢查數據類型, 使用安全函數
從數據庫角度來說,應該使用最小權限原則。
其他注入攻擊
- XML注入:和HTML注入很相似
- 代碼注入: 通過一些執行命令的函數間接執行命令,如eval(), system()
- CRLF注入: 兩個字符 \n \t 表示換行,注入換行符改變語義。eg:log日誌文件的改寫,注入HTTP頭(Http Response Splitting),因爲HTTP頭是\n\t換行的,可能導致安全隱患,可形成XSS攻擊。
文件上傳漏洞
文件上傳漏洞概述
文件上傳漏洞指用戶上傳了一個可執行的腳本文件,並通過這個腳本文件獲得了執行服務器端命令的能力。
常見安全漏洞
-
上傳文件是Web腳本語言
-
上傳文件是Flash的策略穩健crossdo-main.xml,黑客可以控制Flash在這個域下面的行爲
-
上傳文件是病毒,木馬文件,誘導用戶或者管理員下載執行
-
上傳文件是釣魚圖片或爲包含了腳本的圖片,用於釣魚和欺詐
形成條件:1.上傳的文件能被Web容器解釋執行。2.用戶能從Web上訪問這個文件。3.用戶上傳的文件並未被安全檢查和格式化
eg:開源富文本編輯器的文件上傳功能。
繞過文件上傳檢查功能 :
1.攻擊者手動修改上傳過程中的POST包,添加%00字符,可以截斷某些函數對文件名的判斷。
2.僞造一個合法的文件頭,將真實的腳本文件放置在其後。
功能還是漏洞
- Apache文件解析問題: Apache對文件名的解析式從後往前解析的,直到遇到Apache認識的文件類型爲止。定義在Apache的mime.types文件中。
- IIS文件解析問題:1. ;成爲截斷字符,如文件名是 evil.asp;xx.jpg 時,IIS 6 會將此文件解析爲 evil.asp來執行。2. 處理文件夾拓展名出錯,在/*.asp/文件夾的文件都當做asp來處理
- PHP CGI路徑解析問題: PHP在Nginx作爲Web Server時,一般使用fastcgi作爲腳本解釋器,而fastcgi模式下,PHP獲取環境變量的方式有關,若解析不了,則會路徑向前一步尋求環境解析。
- 利用上傳文件漏洞釣魚: 從正常域名跳轉到釣魚網站,通過不同文件類型的解析,在域名上看上去仍然是可信任的域名,但是html文件通過*.html.jpg解析運行。
設計安全的文件上傳功能
- 文件上傳的目錄設置爲不可執行
- 判斷文件類型,使用白名單策略,不要使用黑名單策略
- 使用隨機數改寫文件名和文件路徑
- 單獨設置文件服務器的域名
認證與會話管理
- “認證”和“授權”的概念,單因素認證與多因素認證
- 密碼:最基礎的認證手段。OWASP有推薦的最佳實踐。
OWASP:The Open Web Application Security Project (OWASP), an online community, produces freely-available articles, methodologies, documentation, tools, and technologies in the field of web application security.
使用弱口令攻擊比暴力破解有效得多。密碼的保存不要明文保存,採用不可逆的加密算法或者是單項散列函數算法。
-
多因素認證:提高攻擊門檻
-
Session與認證:將Session ID加密後保存在Cookie中,Cookie收到瀏覽器同源策略保護,Session劫持就是Session ID在生命週期內被竊取,相當於賬戶失竊;如果Session ID 保存在Cookie中,則可以稱作Cookie劫持。
- Session泄漏途徑:XSS攻擊、網絡sniff以及本地木馬竊取。
-
Session Fixation攻擊: 在用戶登錄網站的過程中,如果登錄前後用戶的Session ID沒有發生變化,則會存在Session Fixation問題。
- 具體攻擊的過程是,用戶X(攻擊者)先獲取到一個未經認證的SessionID,然後將這個SessionID
交給用戶Y去認證,Y完成認證後,服務器並未更新此SessionID的值(注意是未改變
SessionID,而不是未改變Session),所以X可以直接憑藉此SessionID登錄進Y的賬戶。
- 具體攻擊的過程是,用戶X(攻擊者)先獲取到一個未經認證的SessionID,然後將這個SessionID
-
Session保持攻擊: 用戶長時間未活動或者用戶點擊退出後,服務器將銷燬session,如果Session一直未失效,則會導致Session劫持攻擊。
有的網站訪問量大,則服務端不維護Session,把Session放到Cookie中加密保存,發送時帶上Cookie,利用Cookie的Expire標籤控制Session的失效時間,這就可以通過XSS攻擊客戶端Cookie失效時間來劫持Session了。
- 定期強制銷燬Cookie,一個用戶可以同時擁有幾個Session的問題
-
SSO 單點登錄: 用戶登錄一次就可以訪問所有系統。將風險集中了。使用最多的是OpenID,使用URL進行用戶認證,同時在驗證成功後重定向回網站。
訪問控制
-
What Can I Do?
授權問題: 權限控制,訪問控制。某個主體對某個客體需要實施某種操作,而系統對這種操作的限制就是權限控制。網絡請求收到防火牆ACL策略的限制。加上基於頁面的訪問控制可以解決頁面未授權訪問的問題。
-
垂直權限管理
RBAC(Role-Based Access Control):基於角色的訪問控制。採用最小權限原則。
-
水平權限管理
同一種用戶相互間的數據不能直接訪問,即問題出在同一個角色上,至今仍然是一個難題。
eg:來伊份購物網站沒有對用戶進行權限控制,通過變化URL中的id參數即可查看對應id的個人
姓名、地址等隱私信息。
-
OAuth簡介
不提供用戶名和密碼的情況下,授權第三方應用訪問Web資源的安全協議。OpenID解決認證問題,OAuth解決授權問題。
有三個角色:
-
User:用戶
-
Resource Owner:資源提供方,用戶訪問其他的網頁應用需要資源提供方的數據支持
-
Client:消費方,用戶正在訪問的網頁應用
過程步驟不贅述,理解。
加密算法與隨機數
概述
加密算法分爲 分組加密算法和流密碼加密算法。
分組加密法: DES、3-DES、Blowfish、IDEA、AES等。
流密碼加密算法: RC4、ORYX、SEAL。
根據攻擊者可以獲得的信息,可以分爲:唯密文攻擊、已知明文攻擊、選擇明文攻擊、選擇密文攻擊。
Stream Cipher Attack
流密碼常用的一種加密算法,基於異或操作,每次都只操作一個字節,但是性能非常好。
-
Reused Key Attack: 使用同一個密鑰加密多次,因爲基於異或操作,所以只要知道四個數據只要知道三個就可以推導出剩下的一個了。
E(A) = A xor C
E(B) = B xor CE(A) xor E(B) = A xor B;
-
Bit-flipping Attack: 在密碼學中,攻擊者在不知道明文的情況下,通過改變密文,使得明文按其需要的方式發生改變的攻擊方式。也就是當知道A、B的明文,A的密文時,就可以推導出B 的密文。
解決Bit-flipping攻擊,驗證密文的完整性。
-
弱隨機IV問題: 在authcode()函數中,它默認使用了4字節的IV(就是函數中的keyc),使得破解難度增
大。但其實4字節的IV是很脆弱的,它不夠隨機,我們完全可以通過“暴力破解”的方式找到重複的IV。
WEP破解
WEP是一種無線加密傳輸協議,破解了WEP的密鑰,就可以連接Access Point。
兩個關鍵因素:
- 初始化向量IV:明文發送,在較短時間內會出現重複,就可以利用Reused Key Attack。同時,找到相同的IV,就可以構造出相同的CRC-32校驗值,可以成功實施Bit-flipping。
- 對消息的CRC-32校驗
Security of the WEP algorithm 提出了破解WEP破解的理論。
ECB模式的缺陷
分組獨立加密,調換任意分組的密文,那麼解密後的明文也是對調位置的。所以應該使用鏈式加密。
Padding Oracle Attack
分組加密過程中,不夠位數的用padding進行填充。Padding Oracle Attack的關鍵在於攻擊者能夠獲知解密的結果是否符合padding。在實現和使用CBC模式的分組加密算法時,注意這一點即可。
密鑰管理
密碼學一個原則:密碼系統的安全性應該依賴於密鑰的複雜性,而不應該依賴於
算法的保密性。
防止密鑰從非正常的途徑泄露。不要把私鑰硬編碼在代碼中,應該採用公私鑰管理或者改善密鑰管理。密鑰集中管理,降低系統對密鑰的耦合性,也利於定期更換密鑰。
僞隨機數問題
僞隨機數不夠隨機。
- 時間戳不夠隨機,不能直接用做隨機數的生成。
- 破解僞隨機數種子即可破解,eg:PHP的rand()函數,mt_rand()函數。
- 採用安全的隨機數算法,JAVA中的用java.security.SecureRandom等。
Web框架安全
-
MVC框架安全
現代開發中的MVC框架。從數據流入的方向看,數據先後經過了View層、Controller層、Model層,設計安全方案的時候要掌握住數據這個關鍵因素。在每一層解決相關的問題,不要把不屬於該層的問題留給那一層。
模板引擎與XSS防禦
在View層解決XSS問題。在現在View層用模板引擎對頁面進行渲染,模板引擎可能會提供一些編碼方法
eg:Django中auto-escape採用了htmlEncode(),從而可以保證安全,有時關閉則可能導致問題。
-
Web框架與CSRF防禦
可以使用security token來解決CSRF攻擊,對讀寫操作分開,對所有的“寫操作”使用POST提交,同時,要保證security token的私密性,自動在POST中增加Token。
1.在Session中綁定Token。 2.在form表單中自動添加token字段。 3.在Ajax請求中自動添加token。 4.在服務端對比POST中提交的Token和Session中綁定的Token是否一致。
-
HTTP Headers管理
在框架中,對HTTP頭進行全局化的處理。eg:針對HTTP頭的CSRF攻擊。針對30X返回的HTTP Response的跳轉——提供統一跳轉函數(白名單)。
-
數據持久層與SQL注入
使用ORM框架對防止SQL注入有好處。
應用層拒絕服務攻擊DDOS
DDOS:分佈式拒絕服務 ,將正常服務放大了若干倍,通過若干個網絡節點同時發起攻擊,以達規模效應。
常見的DDOS攻擊:SYN flood, UDP flood, ICMP flood。
在很多對抗DDOS的產品中,一般會綜合使用各種算法,結合一些DDOS攻擊的特徵,對流
量進行清洗。對抗DDOS的網絡設備可以串聯或者並聯在網絡出口處。
應用層DDOS
發生在應用層,TCP三次握手已經完成,連接已經建立,發起攻擊的IP地址真實。這種攻擊是對服務器性能的一種攻擊,優化服務器性能的方法能夠緩解這種攻擊。
- CC攻擊 :對消耗資源較大的應用頁面不斷髮起正常的請求,以達到消耗服務端資源的目的。
- 限制請求頻率: 針對每個客戶端做一個請求頻率的限制。
驗證碼
CAPTCHA:全自動區別計算機和人類的圖靈測試。
可能漏洞: 1. 直接利用圖像相關算法識別驗證碼 2.驗證碼消耗掉後SessionID未更新,導致使用原有的SessionID可以一直重複提交同一個驗證碼 3. 提前將所有的驗證碼圖片生成好,以哈希過的字符串作爲驗證碼
圖片的文件名——採用枚舉的方式即可破解。
防禦應用層DDOS
驗證碼的核心是識別人與機器。一般情況下,判斷HTTP頭中的User-Agent字段來識別客戶端。
另外一種比較可信的辦法是讓客戶端解析一段JS,並給出正確的運行結果,因爲大部分自動化過程是直接構造HTTP包來完成的,並沒有在瀏覽器環境中。
Web Server也可以用來進行防禦。
資源耗盡攻擊
- Slow Loris攻擊:以極低的速度向服務器發送HTTP請求,由於Web Server併發的連接數都有一定的上限,故最終導致所有連接都被惡意佔用。
- HTTP POST DOS : 原理是在發送HTTP POST包時,指定一個非常大的Content-Length值,然後以很低的速
度發包,比如10~100s發一個字節,保持住這個連接不斷開。 - Server Limit DOS:Cookie造成一種拒絕服務。Web Server對HTTP包頭的大小都有長度限制,如果攻擊者通過XSS攻擊,惡意地往客戶端寫入了一個超長的Cookie,則該客戶端在清空Cookie之前,將無法再訪問該Cookie所在域的任何頁面。
ReDOS正則引起的問題
當正則表達式寫得不好時,就有可能被惡意輸入利用,消耗大量資源,從而造成DOS。這種攻擊被稱爲Re-DOS。這是一種代碼缺陷上的漏洞。
eg: ^(a+)+$, 正常時候輸入 aaaax 時,16條可能路徑,但是輸入 aaaaaaaaaaaaaaaaX 時,有65536條路徑,極大增加正則引擎解析的速度,用戶惡意構造輸入的時候,有缺陷的正則表達式效率大大降低。
PHP安全
暫時跳過這個章節,等到具體去寫POC的時候回過頭來再看。
Web Server安全
- Apache安全:1. Apache的Module模塊最容易出現安全漏洞,所以要檢車Module的安裝情況
- 指定Apache進程以單獨的用戶身份運行,通常需要爲Apache單獨建立一個user/group;使用root身份運行是一個非常不好的習慣。
- Apache有一些配置參數可以優化服務器的性能,提高對抗DDOS的攻擊的能力。
- 保護好Apache log,攻擊者入侵成功後,會修改清除log。
- Nginx安全:注意軟件本身的安全,配置好參數。
- jBoss遠程命令執行:JMX-Console管理後臺,提供給管理員很多強大的功能,也方便了黑客入侵。遠程加載war包。
- Tomcat遠程命令執行:Tomcat manager後臺容易出現漏洞。
互聯網公司安全運營
此處對互聯網公司安全瞭解爲主,此處摘錄一些重要觀點,不做詳細探討了。
- 安全是產品的一個特性。
- 好的安全方案
- 良好的用戶體驗
- 優秀的性能