科普 | 什麼是CRLF注入攻擊?
回車換行(CRLF)注入攻擊是一種當用戶將CRLF字元插入到應用中而觸發漏洞的攻擊技巧。CRLF字元(%0d%0a)在許多互聯網協議中表示行的結束,包括HTML,該字元解碼後即為 r n。這些字元可以被用來表示換行符,並且當該字元與HTTP協議請求和響應的頭部一起聯用時就有可能會出現各種各樣的漏洞,包括http請求走私(HTTP RequestSmuggling)和http響應拆分(HTTP Response Splitting)。
就http請求走私而言,這種漏洞通常出現在當伺服器接收http請求並將該請求轉發給其他伺服器時,比如說代理和防火牆,這種漏洞將造成如下問題:
緩存毒化--攻擊者可以修改緩存中的內容然後不顯示正常頁面而顯示惡意頁面。防火牆逃逸--攻擊者通過構造數據包來逃避安全檢查,通常會利用CRLF和構造超大的數據包。請求劫持--攻擊者可以通過該利用獲取HttpOnly的cookie和http認證數據,類似於xss但是不需要攻擊者和黑客進行交互。
再說一下http響應拆分,攻擊者通過插入CRLF字元後就可以實現在響應頭部中插入任意數據,控制響應的數據內容等。
儘管這些漏洞存在,但是實際上並不是很好利用。我研究了非常久,接下來的講解將會讓你理解服務端請求走私會是什麼樣的。
1、Twitter的HTTP響應拆分
- 難度:高
- 廠商:https://twitter.com/
- 報告地址:#52042 HTTP Response Splitting (CRLF injection) in report_story
- 報告日期:2015年4月21日
- 獎金:$3,500
2015年的4月,Twitter收到了一個漏洞報告,報告稱黑客可以通過該漏洞在用戶向Twitter發起的請求數據中插入任意cookie值。
用戶在訪問https://twitter.com/i/safety/report_story(用戶可以在這裡舉報廣告)地址時,伺服器會獲取參數reported_tweet_id的值,並將其設置到cookie中,最後導致了漏洞。
實際上Twitter是有進行校驗的,它會禁止用戶提交換行符0x0a(%0a)。但Twitter在處理過程中,會先驗證是否提交了禁止的字元,之後如果提交的數據是UTF-8編碼過的,則會將其轉為原始的unicode碼後去掉一些無用字元後再取剩下的位元組,正是因為這樣的邏輯導致了繞過。
比如說用戶提交的是:%E5%98%8A,這個不包含換行符所以不會被攔截,伺服器接收到後將其轉成原始的unicode碼:U+560A,最後取了0A,這時候就變成換行符了。
繞過了CRLF攔截後,通過插入javascript語句來執行xss攻擊效果會更好!比如如下鏈接:
https://twitter.com/login?redirect_after_login=https://twitter.com:21/%E5%98%8A%E5%98%8Dcontent-type:text/html%E5%98%8A%E5%98%8Dlocation:%E5%98%8A%E5%98%8D%E5%98%8A%E5%98%8D%E5%98%BCsvg/onload=alert%28innerHTML%28%29%E5%98%BE
注意上面的%E5%E98%8A,會經過伺服器處理後返回的數據就會變成下面的html響應的形式:
https://twitter.com/login?redirect_after_login=https://twitter.com:21/(CRLF)content-type:text/html(CRLF)location:<svg/onload=alert(innerHTML)>
在插入換行符後,添加了可執行的javascript,最後可盜取用戶的會話數據。
小貼士:對滲透測試而言,觀察能力和良好的技能都是缺一不可的。
2、http://v.shopify.com響應拆分
- 難度:中
- 廠商:https://v.shopify.com/
- 報告地址:https://hackerone.com/reports/1064272
- 報告日期:2015年12月22日
- 獎金:$500
shopify會在後台中記錄你上次訪問的是哪一個商店,然後將其放置在cookie中,通過這個方式:/last_shop?http://SITENAME.shopify.com。
然後在2015年的12月份,漏洞提交者發現Shopify沒有對參數進行校驗,以至於白帽通過Burp Suite抓包提交%0d%0a就能造成CRLF漏洞,部分鏈接為:/last_shop?xxx.shopify.com%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2019%0d%0a%0d%0a<html>deface</html>,以下是截圖:
在上面的鏈接中,%20是空格,%0d%0a是換行字元。結果,瀏覽器收到了兩個頭部並選擇渲染了後者,最後可導致各種漏洞,比如xss。
小貼士:要十分細心觀察我們提交了哪些參數,然後是否將數據放到了響應頭部中。在這個例子中,shopify從鏈接中獲取參數last_shop的值並將其放在了cookie里,這才導致了CRLF漏洞。
來總結一下,對滲透測試而言,觀察能力和良好的技能都是缺一不可的。知道字元的編碼方式以及可能造成的漏洞是非常重要的一個滲透測試技巧。%0D%0A可以被用來測試伺服器是否存在CRLF漏洞,如果存在漏洞,那就想辦法深入一下,通過和xss聯用來擴大戰果。另一方面,如果伺服器會對%0D%0A進行處理,那麼你就需要思考一下你可以怎麼對這些數據進行編碼,然後測試伺服器是否會對數據進行雙重解碼。
註:本文參考來源於hackerone
推薦閱讀: