论文笔记:NDSS19 Don’t Trust The Locals

470 阅读5分钟

摘要和背景

论文全名是:Don’t Trust The Locals: Investigating the Prevalence of Persistent Client-Side Cross-Site Scripting in the Wild

这篇论文的下载地址.发表在2019年的NDSS会议上,主要内容是针对于持久性客户端存储的XSS威胁做了系统研究。这篇论文的主要内容和我自己的一点思考如下。

目前公认的三大类XSS分别是:反射类、存储类和基于DOM的XSS,其他类型的XSS都被认为是生态位问题(niche problem)。然而学术圈必须认识到持久性客户端存储的XSS已经在OWASP这样的非学术组织内得到广泛承认。此类XSS威胁不能只限于对某个特定的web应用进行研究,而是系统性的认知这类威胁的特点。

作者使用污点追踪技术分析从web storage、cookies到HTML、js和script.src(指dom里用js操作script标签的src属性)的可疑流量。由这些数据,作者提出了两种威胁模型:1.利用http劫持注入持久性XSS代码的攻击方法 2.利用现有的反射型XSS进行持久化存储的攻击方法。最后,针对四种易受攻击的客户端存储方式,作者提出了对应的安全措施。

作者自己总结的主要贡献

  • 给出了两种攻击的具体方式,和易受威胁的站点的特点
  • 在alexa收录的访问最多的5000个网站上的实证研究(看着工作量挺大的,要不然这么normal的文章也发不了ndss)
  • 展示了攻击能造成的潜在后果,以及缓解此类攻击的方法

技术背景

客户端持久存储的技术背景

  • 子域名可以给父域名设置cookies;https站点可以给同域名的http站点设置cookies
  • 由于cookies的长度限制,可以使用session和local storage。session用于标志每个浏览器的会话窗口,然而他是有生命周期的。local storage可以无限期的存储session。具体请见这篇文章(www.cnblogs.com/zr123/p/808…

客户端跨站脚本的技术背景

Persistent Client-Side Cross-Site Scripting

  • 此类攻击的目的:劫持会话,取得cookies之类的字段。
  • 攻击方式:即黑客先在客户端的local storage中,把某个item改成恶意代码。然后网页前端代码读取这个item,并写入document,此时攻击就执行了。示例代码:
  • 容易受威胁的不止是local storage,如果前端代码读取易被修改的json或者别的非结构化数据,都有可能在用户的浏览器中执行恶意代码。
  • 此类攻击和服务器端持久性xss的不同:客户端持久性xss难以被web服务器管理员发现;一份local存储中的恶意代码就可以对用户访问的一整个域造成威胁(比如exp.com和abc.exp.com都进行了localStorage.getItem()操作),服务器端xss想达到这种效果需要在不同页面上注入代码

两种攻击模型

网络劫持的攻击者

  • 特点:1.假定攻击者无法获取TLS证书,所以需要http(我猜是为了减少工作量hhh)。 2.如果子域名没有开启HSTS(严格https传输)而父域名开启了HSTS,我们依然可以用http连接子域名,并给父域名设置cookies,这样依然能劫持父域名的会话。(注:一次性开启全站HSTS的方法是设置includeSubDomains选项。)然而这种方法不适用于localStorage,因为受同源政策影响,我们控制的http连接无法修改https的localStorage,因为不同源。
  • 攻击流程如下图

利用现有反射型xss的攻击者

  • 特点:和上面差不多,只不过是注入代码的行为如下:黑客先构造url,然后诱骗受害者点击。而我们上面说的网络攻击者是通过篡改服务器返回的数据包来实现攻击的。两种攻击的区别仅为发生攻击的流程不同 攻击流程如下图

数据收集和测试结果

这部分可以参考原文,他写的有点乱

缓解方法

  • 本地存储非结构化数据:作者发现alexa top 5000中的网页在本地存储的非结构化数据都不包含html/js,所以清理这些内容可以防止非结构化数据被注入。
  • 本地存储结构化数据:别直接eval json就行了,虽然它能解析json;使用安全的json parse方法
  • 本地存储代码:这种情况下不能完全清除代码,因为这样会破坏那些进行本地存储代码的应用程序的正常功能。对症下药:①本地存储js:需要让进行本地存储js、来加速网站读取的网页强制使用https,或者使用Service Workers这种东西来安全的存储本地js代码(作者说他没去看Service Workers的具体实现)②本地存储纯html:纯html指的是连script标签、事件都没有的html,对于这类站点,直接过滤他们存储的html中的js即可。③网页要本地存储js混合html:没办法,改特性让这种网点不这么存才行
  • 本地存储配置数据:这种情况下,web服务端引用其他资源(没看懂)。设置白名单即可
  • 通用防御:更改本地数据的存储方式、使用https等