簡單的範例:
<input type=text name=mail value=<?php echo $_GET['p']; ?>>
如果只是輸入 http://localhost/test.php?p=lobsiinvok@example.com ,就會印出 lobsiinvok@example.com ;但如果輸入 http://localhost/test.php?p=1+onmouseover=alert(document.cookie) ,那麼當滑鼠移到網頁上的1時就會彈出 cookie 值!
原因出在於從使用者得到的 $_GET['p'] 並沒有做過濾,進而影響到輸出的內容。
其實大部分的 XSS 都是出在處理不當的問題,就算是限制輸入長度,也可藉由引入外部 javascript 繞過。
再來一個範例,這裡介紹的 DOM based XSS:
<header>
</header>
<script src="jquery-1.4.4.min.js"></script>
您好,先生。
<script type="text/javascript">
if (document.URL.match(/name\=([^&]*)/)) {
var name = unescape(RegExp.$1);
$('#name').text(name);
}
</script>
如果輸入 http://127.0.0.2:8888/43/43-011.html?name=Lobsiinvok ,畫面顯示"您好,Lobsiinvok先生";但如果輸入 http://127.0.0.2:8888/43/43-011.html?name=<script>alert(document.cookie)</script> ,則畫面就會彈出 coolie值。
原因是由於在檢查時沒有正確驗證,以至於 assign 給 name 時,直接觸發內部的 script。
一般而言,簡單的過濾字元有:< > / " ' 等,但將字元轉成ASCII也碼是可被駭客利用的方法,如 javascript:alert('xss') ,而ASCII碼可以有不同長的前綴,故剛剛的例子也可以是 javascript:alert('xss') ,因此 & # 也是需要被濾過的字元。
在 IE 上, CSS 的 expression 也是可被利用的載體;另外由於 JavaScript 支持 unicode、escapes、十六禁制、八禁制等編碼形式,故 XSS 的可變性更是多元,例如在 IE 下也可用 JScript 和 VBScript Encode。
過濾的javascript是不是打錯了?
javascrip -> javascript
沒有錯喔!javascript -> javascript
「t」是 t 的 HTML entity 表現式。
喔,謝謝,請問您是用什麼東西做編碼轉換的?