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類型
- HTML CSRF攻擊
- JSON HiJacking攻擊
- 字典格式
- 列表格式
- Flash CSRF攻擊
- 跨域獲取隱私數據
- 跨域提交數據操作
CSRF防禦
- 驗證碼
- referer check,referer告訴服務器從哪個鏈接請求過來的
- 在請求中添加Token,Token在客戶端cookies,服務端session同時存放,再加以比較
- 禁止iframe的跨域請求
- X-Frame-option
添加Token的
- 在session中綁定token
- 在form表單中加入token字段
- 在Ajax請求中自動添加token
- 對比服務端dession中token與post過來的是否一致