CTF比赛经历(二)

时间:2019.5.25-26
比赛:强网杯
记录时间:2019.5.28

这里不分享技术,仅当作个人成长轨迹进行记录。

上一次大赛是tctf,说真的要是强网杯能遇上那种难度的题目,我估计得考虑一下时间取舍了。毕竟有些东西确实做不出来,要有点自知之明,不能浪费时间(虽然这态度确实有点问题~)。

第一天早上,看了两道web和misc。先说misc,鲲or鳗orGame,这道题一打开便被那流行曲给洗脑了(#滑稽)。反应过来是要打游戏通关得flag,这让我回想起之前的捡金币,抓包重包递增金币的解法。但burpsuite抓不了包,而且这插件是js的似乎是网页存储的。然后就想过机器学习这方面,去GitHub上找了几个flappy bird的机器学习脚本。然而,虽然找到了,但不会用,然后就放弃了,当音乐播放器…毕竟这“鸡你太美”确实洗脑。最后看writeup也不是这样的解法,但我们的思路确实够活跃,如果成功的话,应该也是能解。

web题的upload,已经摸索到门道了,另外发现cookie是序列化后的值,更加清楚了题目要点。但没有源码进行反序列化是非常困难的,所以一开始只能不断瞎猜,毫无进展。web2的话解题思路倒是非常清晰,他源码内有非常多的执行函数,但执行函数内的值非常绕,基本都是不能被用户控制,所以我们要做的是找出一个遗漏的可以被用户控制的参进行操作。但思路有了但无法实现,毕竟人工代码审计,工程大还不一定成功,所以也是被搁置了。

到了下午,心气神都颓了。下午放出了一道web,智能门锁。然而这时什么鬼,好端端的web题,你好意思出这种题!!我服了,这题基本无视了,然后当天弄到下午5点多,我就对队友说,“散了吧,今晚也不用看了,养好精神。”

当时的心情确实烦躁,不止是我这个web方向,密码学和pwn的队友都很心烦,都吐槽这主办方是来恶心人的,很多东西都是靠绕来难住人。当时吃完饭回到宿舍,原本想玩游戏算了,但连游戏都玩不下去了。就上去楼顶天台那里吹风,我舍友兼队友也在,我在那里吹了差不多两个小时。心情确实差,但风景却非常好。心情差一部分是打比赛,确实压抑,也有点恨自己不能出一份力吧,这两年来打ctf就没能解出flag。然后有点带思考人生的站在天台,那天确实风景特别好,近黄昏,天色紫,风略大,远处的高楼有灯光,下面的行人来来往往,却无故带出一份伤感。打比赛前一天是学院的毕业晚会,我是看了完整的晚会直播,毕竟自己曾经也是学生会干事,也策划过参与过晚会。想想自己两年后也是一个要毕业的人,而且下一年也有要好的师兄师姐要毕业了,想着这些也是逐渐出神。而且,看着下面的行人,总有成双的映入眼帘。。。在楼顶呆到了晚上,回到宿舍,刚好舍友说他朋友要来找他玩之类的,还说打麻将什么的三缺一,那我也就去玩了一下。

第二天,算是凌晨三点睡早上八点起,因为前一天知道又出新题了。web4,队友特别神奇的找到了一个登陆帐号密码,我看了一个小时,猜测大概是xss或csrf吧,但这方面了解不多,做不动。

然后非常神奇的出了一道sql题!!!而且公告里说会放福利题!!!我以为就是这道sql题,然后我光速打开,在几分钟的fuzz后,大概了解了过滤机制,当时是用盲注的方法,大概花了20分钟,写脚本跑出了用户名和库名。然后觉得写脚本太麻烦且太慢了,就手动盲注了,这方法确实好使,我都注入到表名了,但某条语句突然出错了,就是不论取什么范围都不会出现结果,当时很郁闷,就好像发了疯一样在队伍群里刷。后来看了下公告,说是修复环境什么的,顿时觉得之前应该出现非预期情况,但这个我也没见其他人提过,我就一直很困惑。原本像是select这种被过滤掉的函数,我用Unicode编码转一下后就能用了,到后来我都整条语句转码注入的,当时好像是可以的(手注过程,未留下查询痕迹)。我就当没改动过,毕竟题目原本考点不是这个的话,那封杀捷径也没什么。

但我觉得我是能做出来的,确实应该有这种底气。。。中午吃完饭(其中队友解了一道web福利题,算是提升了一点士气),一回到宿舍就开始刚,此时我的重心还在盲注爆表中,只是考虑了很多种函数替换,关键字分割绕过,编码绕过等,但一直搞到4点多,都没什么实质性进展,此时身体已经有点吃不消了(前一天熬夜)。但后来灵光一闪,尝试了一下堆叠注入,发现可行!!!那种感觉,真的瞬间充满干劲了。短短几分钟,利用一个show就把整个数据库结构查的差不多了,脑海里已经非常了解这数据库了,而且对于程序执行也了解的八九不离十了。

思路非常清晰的锁定在1919810931114514这个表中,然后就去吃饭了,当时感觉已经十拿九稳了,心情也是挺轻松的,毕竟这一题在当时分值还是挺高的。但有点不安的事,吃饭前也是进一步挖掘这个表的,但摸索不了什么,就好像不允许访问一样。

小插曲,吃饭时偶遇队长,聊了一个大概的,说各方向目前情况都很好,都有些题差不多解出来了,当时内心也是有种绝地反击的热血。而且,队长请喝柠檬茶了,那就要来“真的”了。

回到宿舍,也就6点了,还有3小时。

起起伏伏,不断构造查询,试图查看1919表中的结构和内容。但相对于words这个表,1919这个真的什么都看不了,结构看不了。不管怎么尝试,返回的都是空。我期间尝试过各种方法:
– 用户提权(怀疑是该表有设置权限)
– 远程导出文件
– 本地导出文件,本地包含文件
– 利用数据库执行shell
– 一个数据库导入另一个数据库

以上种种都不成功,大多数原因是select不可用。是的,其中一种思路差不多就是writeup的解法了,我是有想过:既然不能用select,查看数据又必须要有select,那唯一的地方就是前端的查询了。不出意外的话,就是用前端已经构造好的语句(猜测):
SELECT * FROM words WHERE id = $_GET['inject']

可控点在最后的$_GET['inject'],思路已经有了,但做不出来。我真的完全不知道1919那个表长什么样,我也是服了,我发现我用不了create table这个功能,搞的我长时间在思考提权上,毕竟提权后可用方法多很多(误入死胡同)。

不断苦苦挣扎,结果也是时间流逝,比赛结束。当时连续奋斗12小时,一道题看了10小时左右,还是一无所获。期间找过队友,队友说不懂sql。找过队内师兄,师兄说分高,不想尝试。找过外援(大四师兄),他是告诉我load local file,但做不了。因为条件不允许使用.,这就可以提前判死刑了。而且当时只知道数据库路径,连目录下有什么都不知道,所以这里也是没办法。当时好绝望,真的服了。

补充反思

**时间:20190529 **
其实我一直有种感觉是自己没有处理好数据,直到今天早上我才尝试了,用 ` 反引号包含表名1919,发现是可以查的。。。

总结

打完比赛当天还去喝酒了,哈哈。其实是室友生日,但当时走在路上几乎都不稳,被人轻轻一碰似乎要倒地了,一点都不夸张。

然后看了writeup,嗯,什么鬼,可以查1919的结构的,呵呵,一模一样的payload我用过了,我也是服了,告辞!!! 我被打脸~

想尝试题目的,我已经复现出来了,题目放在GitHub上了:

源文件

发表评论

电子邮件地址不会被公开。 必填项已用*标注