攻擊手段和目的:
攻擊者使被攻擊者在瀏覽器中執行腳本後,若是須要收集來自被攻擊者的數據(如cookie或其餘敏感信息),能夠自行架設一個網站,讓被攻擊者經過JavaScript等方式把收集好的數據做爲參數提交,隨後以數據庫等形式記錄在攻擊者本身的服務器上。
爲了加深本身對XSS攻擊的理解,特地嘗試了一下,並把整個過程記錄下來。javascript
攻擊過程:
①、客戶端收集用戶數據(如留言、發佈文章功能)
②、攻擊者將留言內容寫入了可執行的JavaScript代碼
③、將上面的數據未經處理直接存入數據庫
④、其餘用戶查看該網站,看了上面包含了可執行的JavaScript代碼的文章和評論
⑤、其餘用戶就會在瀏覽器客戶端執行攻擊者注入的JavaScript代碼php
本次試驗用到以下技術:
①、(客戶端)原生Ajax請求
②、(服務端)thinkphp,爲了試驗方便,不使用數據庫,直接返回數據
③、 Cors跨域html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>XSS測試</title> </head> <body> <div id="Text"></div> <input type="button" value="XSS測試" onclick="ajax();"/> <script type="text/javascript"> function ajax() { //先聲明一個異步請求對象 let xmlHttpReg = null; if (window.ActiveXObject) { //若是是IE xmlHttpReg = new ActiveXObject("Microsoft.XMLHTTP"); } else if (window.XMLHttpRequest) { xmlHttpReg = new XMLHttpRequest(); //實例化一個xmlHttpReg } //若是實例化成功,就調用open()方法,就開始準備向服務器發送請求 if (xmlHttpReg !== null) { xmlHttpReg.open("get", "http://vueapp.com", true); xmlHttpReg.send(null); xmlHttpReg.onreadystatechange = doResult; //設置回調函數 } //設定函數doResult() function doResult() { if (xmlHttpReg.readyState == 4) {//4表明執行完成 if (xmlHttpReg.status == 200) {//200表明執行成功 document.getElementById("Text").innerHTML = xmlHttpReg.responseText; } } } } </script> </body> </html>
在這裏我使用的是get請求
其中請求地址http://vueapp.com 是我自定義的地址,使用Apache配置vue
因爲這裏涉及到跨域問題(出於瀏覽器安全的同源策略,協議、域名、端口號任一不一樣都屬於跨域)java
Failed to load http://vueapp.com/: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.ajax
個人解決方法是CORS
在後端的接口中添加這麼一行代碼thinkphp
header('Access-Control-Allow-Origin:*'); // 容許全部訪問源
返回的數據是:數據庫
$this->ajaxReturn(array('status' => 0,'info' => "<img src='11.png' onerror='alert(11)'/>"));
這裏咱們利用img標籤的onerrer屬性來執行JS代碼,因此src屬性填一個訪問不了就能夠觸發onerrer了後端
點擊 XSS測試 按鈕,結果如圖(谷歌瀏覽器):
跨域
這就是一個最最最簡單的XSS攻擊案例
此次咱們去一個網站盜用cookie
能夠看到全部的cookie信息都在這裏了
爲何我不直接用script標籤,而用img的onerror屬性。 由於script標籤有問題,在後臺返回來的script標籤在dom是存在的,可是並無執行 還請各位大佬多多指正