Web安全XSS&CSRF

XSS

xss(Cross Site Scripting)跨站腳本攻擊,發生在目標用戶的瀏覽器層面上,當用戶瀏覽器渲染整個HTML文檔的過程中出現了不被預期的腳本指令並執行時,XSS就會發生

本質含義:

指攻擊者通過“HTML注入”篡改了網頁,插入了惡意的腳本,從而在用戶瀏覽網頁時,控制用戶瀏覽器的一種攻擊過程。
或者這樣解釋:還是一種“HTML注入”,用戶的數據被當成了HTML代碼的一部分來執行,從而混淆了原有的格式

XSS攻擊類型

1.反射型XSS(非持久型)
發出請求時,XSS代碼出現在URL中,作爲輸入提交到服務端,服務端解析後響應,在響應內容中出現這段XSS代碼,最後瀏覽器解析執行。這個過程就像一次反射,所以稱爲反射型XSS
例如:
http://www.foo.com/xss/reflect1.php的代碼如下

<?php
    echo $_GET['x'];
?>

輸入x的值未經過任何過濾就直接輸出,可以提交:
http://www.foo.com/xss/reflect1.php?x=<script>alert(1)</script>
服務器端解析時,echo就會完整的輸出<script>alert(1)</script>到響應體中,然後瀏覽器解析執行觸發

反射型xss是一次性的

2.存儲型XSS(持久型)
存儲型xss和反射型xss的差別僅在於:提交的xss代碼會存儲在服務端(不管是數據庫,還是文件系統,內存等),下次請求目標頁面時不用再提交xss代碼
特點:
1. 攻擊行爲伴隨攻擊數據一直存在
2. 存儲型xss的攻擊是最隱蔽的
例如:
留言板xss,用戶提交一條包含xss代碼的留言存儲到數據庫,目標用戶查看留言板時,那些留言的內容就會從數據庫查詢出來並顯示,瀏覽器發現有xss代碼就當做正常的HTML與JS執行,於是就觸發了xss攻擊

3.DOM XSS
DOM XSS和反射型xss存儲型xss的差別在於,DOM XSS的xss代碼並不需要服務器解析響應的直接參與,觸發xss靠的就是瀏覽器的DOM解析可以認爲完全是客戶端的事情

常見的輸入點有:

document.URL
document.URLUnencoded
document.location
document.referrer
window.location
window.name
xhrq請求回來的數據
document.cookie
表單項的值

常見的輸出項:

直接輸出的HTML內容,如:
document.write(...)
document.writeln(...)
document.body.innerHTML=...
直接修改DOM樹(包括DHTML事件)如:
document.forms[0].action=...(以及其他集合,如:一些對象的src/href屬性等)
document.attachEvent(...)
document.create(...)
document.execCommand(...)
document.body,...(直接通過body對象訪問DOM)
window.attachEvent(...)

這些都是javascript的基本點,從這些輸入輸出可以看到,DOM XSS的處理邏輯就在客戶端

XSS防禦

  • Httponly,禁止javascript訪問帶有Httponly屬性的cookie
  • 輸入檢查,格式檢查,對特殊字符進行過濾編碼
  • 輸出檢查,編碼,轉譯
    原則
  • 儘可能的減少用戶的可控變量在<style>標籤,HTML標籤、css文件
    中的輸出
  • 一些危險標籤過濾禁止掉,如<iframe>,<script>,<form>

    CSRF

    CSRF(Cross Site Request Forgery)跨站請求僞造

  • 跨站點的請求

  • 請求是僞造的

    本質:

    僞造合法用戶身份

    CSRF類型

    1. HTML CSRF攻擊
    2. JSON HiJacking攻擊
      • 字典格式
      • 列表格式
    3. Flash CSRF攻擊
      • 跨域獲取隱私數據
      • 跨域提交數據操作

    CSRF防禦

    1. 驗證碼
    2. referer check,referer告訴服務器從哪個鏈接請求過來的
    3. 在請求中添加Token,Token在客戶端cookies,服務端session同時存放,再加以比較
    4. 禁止iframe的跨域請求
    5. X-Frame-option
      添加Token的
      1. 在session中綁定token
      2. 在form表單中加入token字段
      3. 在Ajax請求中自動添加token
      4. 對比服務端dession中token與post過來的是否一致
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章