XSS:跨站腳本(Cross-site scripting)
攻擊手段和目的:
攻擊者使被攻擊者在瀏覽器中執行腳本後,如果需要收集來自被攻擊者的數據(如cookie或其他敏感信息),可以自行架設一個網站,讓被攻擊者通過JavaScript等方式把收集好的數據作爲參數提交,隨後以數據庫等形式記錄在攻擊者自己的服務器上。
爲了加深自己對XSS攻擊的理解,特意嘗試了一下,並把整個過程記錄下來。
攻擊過程:
①、客戶端收集用戶數據(如留言、發佈文章功能)
②、攻擊者將留言內容寫入了可執行的JavaScript代碼
③、將上面的數據未經處理直接存入數據庫
④、其他用戶查看該網站,看了上面包含了可執行的JavaScript代碼的文章和評論
⑤、其他用戶就會在瀏覽器客戶端執行攻擊者注入的JavaScript代碼
本次試驗用到如下技術:
①、(客戶端)原生Ajax請求
②、(服務端)thinkphp,爲了試驗方便,不使用數據庫,直接返回數據
③、 Cors跨域
原生Ajax請求
<!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配置
由於這裏涉及到跨域問題(出於瀏覽器安全的同源策略,協議、域名、端口號任一不同都屬於跨域)
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.
我的解決方法是CORS
在後端的接口中添加這麼一行代碼
header('Access-Control-Allow-Origin:*'); // 允許所有訪問源
返回的數據是:
echo "<img src='11.png' onerror='alert(11)'/>";
這裏我們利用img標籤的onerrer屬性來執行JS代碼,所以src屬性填一個訪問不了就可以觸發onerrer了
開始測試
點擊 XSS測試 按鈕,結果如圖(谷歌瀏覽器):
這就是一個最最最簡單的XSS攻擊案例
這次我們去一個網站盜用cookie
可以看到所有的cookie信息都在這裏了
*發現的問題
爲什麼我不直接用script標籤,而用img的onerror屬性。
因爲script標籤有問題,在後臺返回來的script標籤在dom是存在的,但是並沒有執行
還請各位大佬多多指正