【Web滲透】跨站請求偽造CSRF漏洞簡介
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
什么是CSRF?
實際上,CSRF不只是只有GET請求可以發起,POST請求也可以發起。
<form action="/register" id='register' method='POST'> <input type=text name='username' value=''/> <input type=password name='password',value=''/> <input type=submit name='submit' value='submit'> </form> 我們可以嘗試構造一個GET請求: http: / / host / register?username = test&password = passwd 如果服務器沒有對請求方法進行限制,則這個請求會通過。 如果服務器已經區分了POST和GET,對于只能用POST提交的鏈接,我們也可以構造出一個POST請求。 比如,在一個頁面中構造好一個form表單,然后使用Javascript自動提交這個表單。比如,攻擊者在www.b.com/test/html下編寫如下代碼: <form action="http://www.a.com/register" id='register' method='POST'> <input type=text name='username' value=''/> <input type=password name='password',value=''/> <input type=submit name='submit' value='submit'> </form> <script> var f = documentElementById('register'); f.inouts[0].value='test'; f.inputs[1].value='password'; f.submit; </script> 攻擊者如果將這個頁面隱藏在一個不可見的iframe窗口中,則整個自動提交表單的過程,對于用戶來說也是不可見的。 CSRF 攻擊的影響是什么?
CSRF 是如何工作的? 一個相關的動作。應用程序中存在攻擊者有理由誘導的操作。這可能是特權操作(例如修改其他用戶的權限)或對用戶特定數據的任何動作(例如更改用戶自己的密碼)。 基于 Cookie 的會話處理。執行該操作涉及發出一個或多個HTTP請求,并且應用程序僅依賴會話 cookie 來識別發出請求的用戶。沒有其他機制可用于跟蹤會話或驗證用戶請求。 沒有不可預測的請求參數。執行該操作的請求不包含攻擊者無法確定或猜測其值的任何參數。例如,當導致用戶更改密碼時,如果攻擊者需要知道現有密碼的值,則該功能不會受到攻擊。 例如,假設一個應用程序包含一個允許用戶更改其賬戶上的電子郵件地址的功能。當用戶執行此操作時,他們會發出如下 HTTP 請求: POST /email/change HTTP/1.1 Host: vulnerable-website.com Content-Type: application/x-www-form-urlencoded Content-Length: 30 Cookie: session=yvthwsztyeQkAPzeQ5gHgTvlyxHfsAfE email=wiener@normal-user.com 這符合 CSRF 所需的條件:
有了這些條件,攻擊者就可以構建一個包含以下HTML的網頁: <html> <body> <form action="https://vulnerable-website.com/email/change" method="POST"> <input type="hidden" name="email" value="pwned@evil-user.net" /> </form> <script> document.forms[0].submit(); </script> </body> </html> 如果受害者用戶訪問攻擊者的網頁,將會發送以下情況:
備注
使用Burp Suite 插件 構建 CSRF 攻擊
• 從右鍵單擊上下文菜單中,選擇參與工具/生成 CSRF PoC。 • Burp Suite 將生成一些 HTML 來觸發選定的請求(減去 cookie,它將由受害者的瀏覽器自動添加)。 • 您可以調整 CSRF PoC 生成器中的各種選項,以微調攻擊的各個方面。您可能需要在一些不尋常的情況下執行此操作以處理請求的古怪功能。 • 將生成的 HTML 復制到網頁中,在登錄到易受攻擊網站的瀏覽器中查看,并測試是否成功發出了預期的請求以及是否發生了所需的操作。 CSRF 攻擊條件及與XSS區別CSRF 與XSS 區別: XSS: 存在XSS漏洞 ——> 構造 payload ——> 發送給受害者 ——> 受害者觸發 ——> 攻擊者得到受害者cookie ——> 攻擊者使用受害者權限cookie 登錄系統 CSRF: 存在CSRF漏洞 ——> 構造payload ——> 發送給受害者 ——> 受害人點擊打開 ——> 受害人執行代碼 ——> 受害者完成攻擊(不知情) CSRF攻擊一種需要兩個條件: 1.登錄受信任的網站,本地生成Cookie; 當然還要另一些方法滿足CSRF攻擊條件,你無法保證以下情況不會發生: 常規測試方法如何確認一個web系統存在csrf漏洞 1,對目標網站增刪改的地方進行標記,并觀察其邏輯,判斷請求是否可以被偽造。
如何確認一個web系統存在CSRF漏洞 1.對目標網站增刪改的地方進行標記,并觀察其邏輯,判斷請求是否可以被偽造
確認憑證的有效期(這個問題會提高CSRF被利用的概率)
跨站請求及跨站請求偽造(CSRF)繞過csrf校驗: 《借刀殺人》
CSRF類型
【危害2】漏洞聯合——CSRF漏洞使self-XSS漏洞“變廢為寶”
存在self-XSS直接漏洞和CSRF漏洞,如果利用self-XSS漏洞則受害者只是自己,如何攻擊自己以外的目標? 目標——通過利用CSRF漏洞,使XSSpayload能夠攻擊自己以外的目標
【危害3】利用CSRF漏洞發出GET請求
漏洞影響
網絡場景測試技巧
瀏覽器的Cookie策略若能知道瀏覽器的cookie策略,就會對CSRF的原理與攻擊方式會有更深的理解。 瀏覽器所持有的cookie分成兩種,一種是 他們之間的區別在于 而臨時Cookie則沒用綁定 在瀏覽網站的過程中,如果一個網站設置了
如果有這么一種情況,瀏覽器從一個域的頁面中,想要加載另一個域的資源,由于安全原因,一些網絡站點會停止 但是這里也是有一個前提的,就是 但是這里也是有一個前提的,就是http://www.a.com頁面中的http://www.b.com包含在<iframe>, <img>, <script> , <link> 等標簽中,因為這些標簽在IE中,是禁止瀏覽器向這些標簽中發送第三方cookie的。 當然,并不是所有的瀏覽器都會禁止,比如火狐瀏覽器,就默認支持發送第三方cookie。 所以至少對于IE瀏覽器,攻擊者需要精心構造攻擊環境,比如可以先誘使用戶在當前瀏覽器中先訪問目標站點,使得session cookie有效,然后嘗試CSRF。 P3P頭的副作用
因為P3P頭在網站中的廣泛應用,所以在CSRF的防御,不能僅依賴于瀏覽器對第三方cookie的防御策略,應該從長計議。 CSRF的防御常見CSRF防范措施 簽名與時間戳防護處理流程Token產生
token由三部分組成:
CSRF攻擊常規防護1.只使用JSON API,使用Javascript發起AJAX請求是限制跨域的,并不能通過簡單的表單來發送JSON,所以,通過只接收JSON可以很大可能避免CSRF攻擊。 這種方法要比檢查Referer 要安全一些,token 可以在用戶登錄參生并放于 session 之中,然后再每次請求時把token從session中拿出,與請求中的token進行比對。 驗證碼
Referer Check
使用tokenCSRF的本質 在講token之前,我們需要知道,CSRF之所以能夠攻擊成功,除了利用cookie,更重要 攻擊者只有預測出URL的所有參數與參數值,才能成功構造一個偽造的請求,反之,則攻擊不成功 基于此,有一個解決方案,把參數加密,或者使用一些隨機數,讓攻擊者無法猜測到正確的參數。 比如,一個刪除的url是:
但是可以通過參數加密,使得刪除的url值為:
這樣就無法猜測出username的值,從而無法實施攻擊 但這種方法存在的缺陷是,加密后的URL非常難讀,對用戶不友好,其次,如果每次URL值都發生變化,還會使得URL無法被用戶收藏。所以這種方法有了一個晉升版,就是構造token。 Token的特點1、Token值必須是隨機的,可以通過使用安全的隨機數生成算法實現 2、Token值是私密的,不能被第三方知曉。他可以存放在服務器的cookie中,也可以存放在瀏覽器的cookie中。但唯獨Token值不能直接放在URL中,因為直接放在URL中,可能也會導致瀏覽器通過Refer得方式泄露。 比如下面這個頁面
如果在這個頁面中包含了一個攻擊者能指定地址的圖片,比如
那么如果點擊這個圖片,那么可能就會出現 因此在使用Token時,盡量將其放在表單中,把敏感操作由GET改成POST,以表單的形式提交,避免Token泄露 3、Token需要同時放在表單和session中。在提交請求時,服務器只需要驗證表單中的Token與用戶session(或者cookie)中的Token值是否相同,如果一致,則是合法請求,如果不一致,或者有一個為空,則請求不合法,就可能是CSRF攻擊 CSRF 漏洞防御策略再服務器端防御CSRF攻擊主要有四種策略:
• 在請求地址中添加token并驗證
• 在HTTP頭中自定義屬性并驗證
Token 防御 CSRF Example針對使用token 防御 CSRF 攻擊,我這里做一個簡單的介紹: 1.要使Token對攻擊者來說難以偽造,我們可以使用偽隨機數生成器來構造它 稱為Token 隨機數,好似在沒一個參數中都加入一個隨機的Token來此防御,然后把它放到服務器端的session里,并將Token發給用戶(注意并沒有保存在cookie中); 2.當用戶提交請求時,服務器攔截器將POST請求中的Token提取出來,與session中的Token進行比對,相等即執行下一步操作。(這一部分就非常有必要!否則添加了防御的CSRF也是可以繞過的?。?/p> 具體代碼: # 生成 token session_start(); function set_token(){ $_SESSION['token'] = md5(time()+rand(1,5000)); } # 使用 token 做驗證 function check_token(){ if(isset($_POST['token'])&&$_POST['token'] === $_SESSION['token']) { return ture; } else { return false; } } 可以看到,同時驗證了cookie中的sessionid與POST中的Token。 * web框架 - 啟動框架中成熟的CSRF防御功能 * 自定義HTTP請求頭(Custom Request Headers) * 如使用`X-CSRF-token:xxxx`標明CSRF_TOKEN的值(即使CSRF利用成功發出了攜帶Cookie的HTTP請求 但后端判斷`X-CSRF-token`不存在則拒絕請求) * One-time Token * 如每次提交表單都包含字段`Token=xxxx`且每次值不同 后端可校驗是否正確 * `Set-Cookie`使用`SameSite`屬性 * 后端Response Header`Set-Cookie`中設置`SameSite`屬性(由Google引入瀏覽器 用于緩解CSRF攻擊),`SameSite`屬性有3種值: * `Strict`嚴格 * 例如 域b.com的Response Header有`Set-Cookie: admin_cookie_strict=xxx; SameSite=Strict`,瀏覽器中會保存這一Cookie字段`admin_cookie_strict=xxx`,但由于`SameSite=Strict`為**嚴格**,所以瀏覽器對(非b.com域下發起的)訪問b.com的**任何跨域請求**都不允許攜帶這一Cookie字段`admin_cookie=xxx`,所以可以防御CSRF攻擊。比如從域a.com下構造并發出跨域請求訪問b.com(嘗試CSRF),絕對不會攜帶關鍵的cookie,從而b.com后端鑒權失敗,CSRF攻擊失敗 * `Lax`寬松 - 沒有`SameSite`屬性的cookie被瀏覽器默認為`SameSite=Lax` * 例如 域b.com的Response Header有`Set-Cookie: admin_cookie_lax=xxx; SameSite=Lax`,瀏覽器中會保存這一Cookie字段`admin_cookie_lax=xxx`,但由于`SameSite=Strict`為**寬松**,所以瀏覽器對(非b.com域下發起的)訪問b.com的**多種跨域請求**都不允許攜帶這一Cookie字段,只有以下3種方式(任何一種),才能夠攜帶b.com的cookie`admin_cookie_lax=xxx` * 非同域下的a標簽 `<a href="http://b.com"></a>` * 非同域下的GET表單 `<form method="GET" action="http://b.com/formdemo">` * 非同域下的link標簽 `<link rel="prerender" href="http://b.com"/>` * `None`無 * `SameSite=None`必須同時指定`Secure`,例如`Set-Cookie: session_none=abc123; SameSite=None; Secure` * 二次驗證 - 安全但影響用戶體驗(適用于僅對敏感功能處進行防御) * CAPTCHA 增加驗證碼機制 * 再次輸入密碼 * 手機驗證碼 * (不推薦)通過`Referer/Origin`校驗來源域名 * 缺陷1.只能防御從"不被信任"的域發起的偽造的http請求(如果 **父、子、兄弟域名** 或 **CORS中被信任的域名** 有XSS漏洞 配合構造一個偽造請求 此時referer和Origin的值都是被信任的域 此時“校驗來源域名”無法防御) * 缺陷2.正常業務如果有302跳轉 不攜帶Origin 參考OWASP [Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.md](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.md) 文章來自于互聯網,只做交流分享,如有侵權請聯系刪除!原文鏈接:https://www.kanxue.com/chm.htm?id=18479&pid=node1001515 該文章在 2023/12/7 11:18:32 編輯過 |
關鍵字查詢
相關文章
正在查詢... |