第三届校赛了,这次修复了pwn没人会做的bug……相比于去年还是好了很多的,不知道的可以看看去年的题目hhh。这次出的总体来说稍微简单了点,可以参考去年的

(动态分值总算不用纠结定分了……)

web

一条签到题,一条稍微难一点的(不过为啥没人做……不懂……)

bt (84/500pt)

web签到,来源就是最近的宝塔面板未授权登录,具体的分析可以看看phith0n师傅的文章
不过解决这条题目还是比较简单的,网上一搜一大片,直接访问 :888/pma/ 就能进数据库找到flag了。

难点反而在于出题……由于宝塔面板这个毒瘤软件太过自动化,和国产软件一个尿性杂七杂八的东西太多,扔docker里死活跑不起来,没办法只能用上面那篇文章里打包好了的版本,改各种密码,手动更新phpmyadmin(防止被日)后放服务器上居然php还是起不起来。查各种资料后感觉是主机docker的配置问题,而题目服务器上还有很多其他题目,时间比较紧只好要了台单独的机子整了干净环境才跑起来……

可能这就是官方不提供docker版本的原因吧……可能他们也没法配置23333
哎国产软件什么时候能站起来……

handsome (406/500pt)

也是基于某次真实渗透,想搞一个重置密码token的题。

这题主要需要搞到admin的重置密码token,多次fuzz可以发现token分3个部分,- 之前的是某个和时间相关的字符串(实际上是时间戳md5,可以用 https://www.somd5.com/ 免费解密),- 之后一部分是和ip有关(隐藏的作弊检测hhh),还有一位随机。搞清规则之后就能写个脚本爆破了。

进去后出于某种恶趣味为了和题目衔接比较自然弄了一个没过滤的简单SSTI,大致了解一下pug的模板注入就行了,不得不说javascript仅次于php是第二好的语言(大雾)

非预期

不过让我惊喜的是看writeup竟然有个非预期,非常赞。
首先我为了省事(其实是不会写nodejs)登录是用的github一个模板改的,看它有上千k的star感觉应该没什么问题,谁知道有个逻辑漏洞……
他这个东西后端用的mongodb,重置密码的逻辑是这样的:

  1. 点发邮件后在数据库该用户字段加一条token值
  2. 在get正确的token地址时在session中加一条token字段
  3. 在post新密码时从session中取字段作为token和密码代入数据库查询token键值,设置新密码

看上去好像没什么问题?问题出在js这门第二好的语言这个session字段上,本意是为了保存两次分步的状态,但如果我们进行步骤1之后直接跳过2进入3,这样session中没有设置token(undefined),它却没有检查直接代入数据库,这个时候就相当于sql中where字段为空,mongodb的特性导致会filter出所有没有token字段的用户,将密码重置为指定密码。也就是说你可以重置除了你自己所有其他人的密码(emmmm…)

当然做题的这位是不知道有这么多弯弯绕的,他就觉得发了一个包就能重置密码了……还是很精彩的,可以和之前的某校密码重置比比高下了

奇怪的出题姿势增加了

misc

因为今年要求简单题多一点,出的不难,基本都能做……吧……

MogicTower (154/500pt)

非常经典的游戏,主要就是考各位作弊的能力……CE一改一刀9999,看看攻略就能通关了。不过为了避免直接逆向或者跳关,还是在暗墙处做了点手脚,我感觉应该增加点难度放在隐藏层里hhh

juan (361/500pt)

事实证明卷才是生产力(大雾),原本是没这题的,但是在活动室吹逼的时候大家忽然想搞一个KOH不过平台不支持,只能退而求其次啦~我反正已经预感到要被暴打了hhh
题目很《简单》,用brainfuck写一个计算base64的程序,但是有长度限制。规则就是长度限制从0开始,每过5秒+1直到有人写出来,然后后写的人必须不超过当前最短的字符才行。所以就要求大家开始卷……
因为这鬼语言大家都是现学,也不存在什么优势,还算公平。我这里直接用一个c2bf将c语言转成bf然后搞定,总字符4w左右(时间也是这么定的,保证在最坏情况下比赛结束时一定有解),不过最后大佬们卷到700多字符还是挺牛逼的……

欣赏一下大佬的做法:

先建一个表,然后7次循环,每次循环里面一共读三字节,当然每个字节读完之后会进行不同的操作,比如第一个字节除4、第二个字节除16,第三个字节除64,还需要和前面一个字节没有处理完的部分合并。由于表在内存中的开头部分,因此从后往前查表下标需要用64减一下。 先写了个初版超了50几个字节,后来优化到只多8字节,实在优化不了,灵机一动发现把表的顺序逆一下就好了,这样查表的时候就不需要用64减一下了,即表的第一个字节是/,最后一个字节是A,这样如果表的下标是0,直接取第一个,是63才取最前面的第一个。不过这题后端判题程序估计循环次数比较少或者随机字符串全是可显示字符,实际上把 /+ 这俩从表里拿出去也可以正常运行,可以进一步缩减代码大小

然而卷是趋势,DEFCON打到500分题目就下线了……