上一節講到了滲透測試中xss跨站攻擊檢測方法和防護,這一節也是關於跨站攻擊的另一個手法CSRF,很多客戶找到我們Sinesafe想要了解更多的跨站攻擊檢測方法以及防禦此類攻擊的辦法,想要讓網站的安全性更加堅固,對此提醒大家滲透測試網站必須要拿到授權才能測試哦!
3.3.1. 簡介
CSRF(Cross-site request forgery)跨站請求偽造,也被稱為「One Click Attack」或者Session Riding,通常縮寫為CSRF,是一種對網站的惡意利用。儘管聽起來像跨站腳本(XSS),但它與XSS非常不同,XSS利用站點內的信任用戶,而CSRF則通過偽裝來自受信任用戶的請求來利用受信任的網站。
3.3.2. 分類
3.3.2.1. 資源包含
資源包含是在大多數介紹CSRF概念的演示或基礎課程中可能看到的類型。這種類型歸結為控制HTML標籤(例如<image>、<audio>、<video>、<object>、<>等)所包含的資源的攻擊者。如果攻擊者能夠影響URL被加載的話,包含遠程資源的任何標籤都可以完成攻擊。
由於缺少對Cookie的源點檢查,如上所述,此攻擊不需要XSS,可以由任何攻擊者控制的站點或站點本身執行。此類型僅限於GET請求,因為這些是瀏覽器對資源URL唯一的請求類型。這種類型的主要限制是它需要錯誤地使用安全的HTTP請求方式。
3.3.2.2. 基於表單
通常在正確使用安全的請求方式時看到。攻擊者創建一個想要受害者提交的表單; 其包含一個Java片段,強制受害者的瀏覽器提交。
該表單可以完全由隱藏的元素組成,以致受害者很難發現它。
如果處理cookies不當,攻擊者可以在任何站點上發動攻擊,只要受害者使用有效的cookie登錄,攻擊就會成功。如果請求是有目的性的,成功的攻擊將使受害者回到他們平時正常的頁面。該方法對於攻擊者可以將受害者指向特定頁面的網絡釣魚攻擊特別有效。
3.3.2.3.
這可能是最少看到的方式。
由於許多現代Web應用程式依賴XHR,許多應用花費大量的時間來構建和實現這一特定的對策。
基於XHR的CSRF通常由於SOP而以XSS有效載荷的形式出現。沒有跨域資源共享策略(CORS),XHR僅限於攻擊者託管自己的有效載荷的原始請求。
這種類型的CSRF的攻擊有效載荷基本上是一個標準的XHR,攻擊者已經找到了一些注入受害者瀏覽器DOM的方式。
3.3.3. 防禦
通過CSRF-token或者驗證碼來檢測用戶提交驗證Referer/Content-Type對於用戶修改刪除等操作最好都使用POST操作避免全站通用的cookie,嚴格設置cookie的域3.4. SSRF漏洞
3.4.1. 簡介
服務端請求偽造(Server Side Request Forgery, SSRF)指的是攻擊者在未能取得伺服器所有權限時,利用伺服器漏洞以伺服器的身份發送一條構造好的請求給伺服器所在內網。SSRF攻擊通常針對外部網絡無法直接訪問的內部系統。
3.4.2. 漏洞危害
SSRF可以對外網、伺服器所在內網、本地進行埠掃描,攻擊運行在內網或本地的應用,或者利用File協議讀取本地文件。
內網服務防禦相對外網服務來說一般會較弱,甚至部分內網服務為了運維方便並沒有對內網的訪問設置權限驗證,所以存在SSRF時,通常會造成較大的危害。
3.4.3. 利用方式
SSRF利用存在多種形式以及不同的場景,針對不同場景可以使用不同的繞過方式。
以curl為例, 可以使用dict protocol操作Redis、file協議讀文件、gopher協議反彈Shell等功能,常見的Payload如下:
curl -vvv 'dict://127.0.0.1:6379/info'
curl -vvv 'file:///etc/passwd'
# * 注意: 連結使用單引號,避免$變量問題
3.4.4. 相關危險函數
SSRF涉及到的危險函數主要是網絡訪問,支持偽協議的網絡讀取。以PHP為例,涉及到的函數有 file_get_contents() / fsockopen() / curl_exec() 等。
3.4.5. 過濾繞過
3.4.5.1. 更改IP位址寫法
一些開發者會通過對傳過來的URL參數進行正則匹配的方式來過濾掉內網IP,如採用如下正則表達式:
^10(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){3}$^172\.([1][6-9]|[2]\d|3[01])(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$^192\.168(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$對於這種過濾我們採用改編IP的寫法的方式進行繞過,例如192.168.0.1這個IP位址可以被改寫成:
8進位格式:0300.0250.0.116進位格式:0xC0.0xA8.0.110進位整數格式:323223552116進位整數格式:0xC0A80001還有一種特殊的省略模式,例如10.0.0.1這個IP可以寫成10.1。 訪問改寫後的IP位址時,Apache會報400 Bad Request,但Nginx、MySQL等其他服務仍能正常工作。 另外,0.0.0.0這個IP可以直接訪問到本地,也通常被正則過濾遺漏。
3.4.5.2. 使用解析到內網的域名
XSS全稱為Cross Site ing,為了和CSS分開簡寫為XSS,中文名為跨站腳本。該漏洞發生在用戶端,是指在渲染過程中發生了不在預期過程中的Java代碼執行。XSS通常被用於獲取Cookie、以受攻擊者的身份進行操作等行為。
3.4.5.3. 利用解析URL所出現的問題
在某些情況下,後端程序可能會對訪問的URL進行解析,對解析出來的host地址進行過濾。這時候可能會出現對URL參數解析不當,導致可以繞過過濾。
比如 //@192.168.0.1/ 當後端程序通過不正確的正則表達式(比如將http之後到com為止的字符內容,也就是,認為是訪問請求的host地址時)對上述URL的內容進行解析的時候,很有可能會認為訪問URL的host,而實際上這個URL所請求的內容都是192.168.0.1上的內容。
3.4.5.4. 利用跳轉
如果後端伺服器在接收到參數後,正確的解析了URL的host,並且進行了過濾,我們這個時候可以使用跳轉的方式來進行繞過。
可以使用如 http://域名.org/redirect-to?url=http://192.168.0.1 等服務跳轉,但是由於URL中包含了192.168.0.1這種內網IP位址,可能會被正則表達式過濾掉,可以通過短地址的方式來繞過。
常用的跳轉有302跳轉和307跳轉,區別在於307跳轉會轉發POST請求中的數據等,但是302跳轉不會。
3.4.5.5. 通過各種非HTTP協議
如果伺服器端程序對訪問URL所採用的協議進行驗證的話,可以通過非HTTP協議來進行利用。
比如通過gopher,可以在一個url參數中構造POST或者GET請求,從而達到攻擊內網應用的目的。例如可以使用gopher協議對與內網的Redis服務進行攻擊。
除了gopher協議,File協議也是SSRF中常用的協議,該協議主要用於訪問本地計算機中的文件,我們可以通過類似 file:///path/to/file 這種格式來訪問計算機本地文件。使用file協議可以避免服務端程序對於所訪問的IP進行的過濾。例如我們可以通過 file:///d:/1.txt 來訪問D盤中1.txt的內容。
3.4.5.6. DNS Rebinding
一個常用的防護思路是:對於用戶請求的URL參數,首先伺服器端會對其進行DNS解析,然後對於DNS伺服器返回的IP位址進行判斷,如果在黑名單中,就禁止該次請求。
但是在整個過程中,第一次去請求DNS服務進行域名解析到第二次服務端去請求URL之間存在一個時間差,利用這個時間差,可以進行DNS重綁定攻擊。
要完成DNS重綁定攻擊,我們需要一個域名,並且將這個域名的解析指定到我們自己的DNS Server,在我們的可控的DNS Server上編寫解析服務,設置TTL時間為0。這樣就可以進行攻擊了,完整的攻擊流程為:
伺服器端獲得URL參數,進行第一次DNS解析,獲得了一個非內網的IP對於獲得的IP進行判斷,發現為非黑名單IP,則通過驗證伺服器端對於URL進行訪問,由於DNS伺服器設置的TTL為0,所以再次進行DNS解析,這一次DNS伺服器返回的是內網地址。由於已經繞過驗證,所以伺服器端返回訪問內網資源的結果。3.4.5.7. 利用IPv6
有些服務沒有考慮IPv6的情況,但是內網又支持IPv6,則可以使用IPv6的本地IP如 [::] 0000::1或IPv6的內網域名來繞過過濾。
3.4.5.8. 利用IDN
一些網絡訪問工具如Curl等是支持國際化域名(Internationalized Domain Name,IDN)的,國際化域名又稱特殊字符域名,是指部分或完全使用特殊的文字或字母組成的網際網路域名。
在這些字符中,部分字符會在訪問時做一個等價轉換,例如 . 和 example.com 等同。利用這種方式,可以用 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ 等字符繞過內網限制。
3.4.6. 可能的利用點
sftp
tftp(UDP協議擴展)dictgopherldapimap/imaps/pop3/pop3s/smtp/smtps(爆破郵件用戶名密碼)rtsp – smb/smbs(連接SMB)telnethttp、httpsmongodbShellShock命令執行JBOSS遠程Invoker war命令執行Java調試接口命令執行axis2-admin部署Server命令執行Jenkins s接口命令執行Confluence SSRFStruts2 命令執行counchdb WEB API遠程命令執行docker API遠程命令執行php_fpm/fastcgi 命令執行tomcat命令執行Elasticsearch引擎Groovy腳本命令執行WebDav PUT上傳任意文件WebSphere Admin可部署war間接命令執行Apache Hadoop遠程命令執行zentoPMS遠程命令執行HFS遠程命令執行glassfish任意文件讀取和war文件部署間接命令執行3.4.7. 防禦方式
過濾返回的信息統一錯誤信息限制請求的埠禁止不常用的協議對DNS Rebinding,考慮使用DNS緩存或者Host白名單,如果想要更完善的網站安全防護,以及提前滲透測試可以找專業的網站安全公司,國內做的比較好的如Sinesafe,綠盟,啟明星辰等等。