CRLF、CSRF、SSRF攻擊與利用

前言

本文敘述了crlf、csrf和ssrf的原理、攻擊利用和一些繞過方法,作為個人筆記,內容可能不全面,日後有接觸新的方法會更新。

CRLF

原理

這個漏洞名詞來源於印表機,在計算機中表示一行的結束:

回車=CR=\r=%0d=Ascii(13)=Ascii_16(0D)

換行=LF=\n=%0aAscii(10)=Ascii_16(0A)

在不同作業系統中表示行結束的方法也不相同:

Windows:CRLF

Linux/Unix:LF

Mac:老版本用CR,新版用LF

在http頭的規範中是以CRLF表示一行的結束,因此無論是請求頭還是響應頭,每行的末尾都有一個

\r\n

GET http://example。com/skipto?u=http://other。com HTTP/1。1\r\n

Host:example。com\r\n

User-Agent:Mozilla/5。0 (X11; Ubuntu; Linux x86_64; rv:89。0) Gecko/20100101 Firefox/89。0\r\n

Accept:text/html,application/xhtml+xml,application/xml;q=0。9,image/webp,*/*;q=0。8\r\n

Accept-Encoding:gzip, deflate, br\r\n

Accept-Language:zh-CN,zh;q=0。8,zh-TW;q=0。7,zh-HK;q=0。5,en-US;q=0。3,en;q=0。2\r\n

Connection:keep-alive\r\n

上面程式碼是一個普通的頁面跳轉請求頭,我們很容易發現

u

的值是使用者可控的,正常執行的話返回的會是第2頁的內容,那麼現在重新發送請求,將請求截下來,把

u=http://other。com

改成

u=http://other。com\r\nSetCookie:crlf

再提交,假如伺服器沒有對

u

引數進行檢查並過濾,在響應頭中直接將使用者輸入拼接到Location的值裡面,響應頭就會變成像下面那樣的程式碼:

HTTP/1。1 302 Found\r\n

Date: Sun, 08 Aug 2021 07:01:25 GMT\r\n

Location:http://other。com\r\n

SetCookie:crlf\r\n

Content-Length:0\r\n

Content-Type: text/html; charset=utf-8\r\n

Connection: keep-alive\r\n

在拼接http響應頭的過程中,伺服器檢測到

\r\n

的時候會按照http規範認為已經到達一行的末尾,後面的資料輸出到下一行。在對檔案進行io讀寫的時候也經常會以

\r\n

或者

\n

作為判斷行末尾的依據,後面的資料換行後再輸出,這兩個的原理是一樣的。

CRLF這種攻擊本質和sql注入、xss一樣,都是由於沒有對使用者輸入進行完全檢查與過濾導致的漏洞,區別在於sql注入作用在資料庫,xss的效果體現在網頁主體,clrf則會將惡意程式碼輸出在響應頭中。

攻擊&利用

這種漏洞屬於客戶端漏洞,經常會出現在有重定向或者頁面跳轉的地方。攻擊的方法很簡單,觀察輸入是否在響應頭中,然後提交

\r\n

,記得編碼,檢視伺服器是否響應,最後一步根據需要將漏洞轉換成會話固定、xss等。

至於利用的方式,大致有以下幾種:

會話固定

上面的例子就是一個典型的會話固定,透過插入請求頭的方式實現給訪問者設定一個session,當然除了cookie也能插入其他請求頭。

#部分請求頭:

GET http://example。com/skipto?u=http://other。com\r\nSet-Cookie:mycookie HTTP/1。1\r\n

。。。

#對應的響應頭:

HTTP/1。1 302 Found\r\n

Location:http://other。com\r\n

SetCookie:mycookie\r\n

。。。

xss

在http規範中,響應頭和正文之間是用兩個CRLF進行區分的,也就是

\r\n\r\n

,我們可以利用這個特性往正文裡寫入xss:

#部分請求頭

GET http://example。com/skipto?u=\r\nCRLF、CSRF、SSRF攻擊與利用 HTTP/1。1\r\n

。。。

#對應的響應頭,利用xss直接將cookie傳送到攻擊者的伺服器

HTTP/1。1 302 Found\r\n

Location:\r\n

CRLF、CSRF、SSRF攻擊與利用

快取中毒

這種攻擊方式需要服務端有CDN、負載均衡或者反向代理等快取裝置。利用方式如下:

#直接在請求頭中插入X-Forwarded-Host,觀察響應包中是否有回顯

GET http://example。com/skipto?u=\r\nX-Forwarded-Host:http://fishing。com HTTP/1。1\r\n

。。。

另一個名字相近但完全不同的攻擊方式叫

快取欺騙

,利用前要滿足下列條件:

Web快取功能設定為透過URL的副檔名來判斷是否進行快取檔案,且忽略任何快取頭;

當訪問一個不存在資源時返回一個頁面而不是顯示頁面不存在;

誘使訪問URL時,受害者必須已經透過身份驗證;

其攻擊的過程如下:

透過釣魚/xss等方法誘使已經登入的使用者訪問攻擊者伺服器上的一個資源(http://hack。com/attack/1。png);

請求到達代理/CDN,代理不熟悉這個檔案,於是向web伺服器發起請求;

web伺服器返回受害者的使用者頁面內容和200狀態碼,這裡對應了上面第二點和第三點條件,沒有返回頁面不存在並且是使用者已登入狀態;

快取機制收到響應同時發現url以資原始檔副檔名(。png)結尾,並且由於快取機制忽略響應頭,這個資源會被儲存在新建的attack目錄下,被快取的檔名為1。png,這裡對應了第一個條件;

然後受害者接收到他的賬戶頁面;

攻擊者訪問http://hack。com/attack/1。png,請求到達代理伺服器,代理直接將受害的快取賬戶頁面返回給攻擊者。

繞過

對於CRLF來講核心就是

\r\n

,伺服器防止CRLF大部分也是透過過濾器限制這兩個字元,繞過的方法大致有以下幾種:

url單/雙層編碼;

更改http版本到1。0,不傳送Host頭,並將請求分片構建特殊請求;

將\r\n轉換成ascii碼;

另外在傳送給客戶端xss語句的時候可能會被瀏覽器過濾掉,這個時候只需要在前面再插入一個請求頭

X-XSS-Protection:0

即可繞過。

CSRF

原理

CRLF、CSRF、SSRF攻擊與利用

CSRF的中文翻譯叫跨站請求偽造,和XSS利用方式有點像,但是XSS利用的是站點內信任的使用者,而CSRF是透過偽裝成被信任的使用者請求受信任網站。攻擊原理如圖:

由此可以看出來,要利用這個漏洞必須滿足下面兩個條件:

登入存在漏洞的網站,並在本地生成cookie;

在不登出的情況下訪問攻擊者的伺服器;

攻擊&利用

這種漏洞會出現在使用者操作中的增、刪、改功能的位置,比如使用者修改密碼的地方,如果網站在上述三種功能中沒有用到Referer/Token技術,那麼肯定存在csrf,如果存在,可以繞過,那也一樣有漏洞。型別分為GET、POST兩種,他們攻擊方式的區別就是GET型只需要構造url,然後誘導受害者訪問即可,POST型則要構造自動提交的表單,再誘導受害者訪問。

整個攻擊流程如下:

製作偽裝頁面->誘導使用者訪問->觸發非法操作

不管是哪種型別,漏洞利用的核心就是根據需要構造頁面,然後誘導受害者點選,可以透過釣魚,也可以利用xss等。

GET

404 not found

404 not found

POST

post模式通常是構造一個自動提交的隱藏表單:

404 not found

404 not found

繞過

對於CSRF的保護通常是使用Referer和Token,因此為了達到攻擊的目的,這兩種防護措施就是需要繞過的物件。

Referer

1。利用偽協議:http://、https://、ftp://、file://、data:、javascript:,這時候referer置空就能繞過了。