0%

[CISCN2020决赛]web wp

[CISCN2020决赛]web wp

由于nb的易霖博,第一天awd崩了之后第二天变成了断网ctf,断网misc和断网密码学
嗯,失去了网络,战斗力变成0,三个半小时极限做题就做出来一个最傻逼的签到,剩下两个题看了一眼没试出来,菜逼的眼神
听师傅们讨论,瞬间会写,我太弱了

web1

SQL注入,语句为
SELECT * FROM fake_flag WHERE id = '$id' limit 0,$limit
超级过滤列表为

    $common_blacklist = ["!", "\"", "#", "%", "&", "'", ";", "<", "=", ">", "\\", "^", "`", "|" ,'between','not'," ","like",','];
    $hack_list = ['union','join','in',"/**/","substr","ascii","left","right"];
    $id_blacklist = ['left','right','like','(',')'];
    $limit_blacklist = ['-'];

注入点是id和limit,id上有超级过滤,括号逗号union什么的,limit上没有,ban了/**/,但是没有单独ban/*和*/,一开始没发现,然后没有括号,id那里用不了select,就没法拿到另一张表的的flag,想盲注,<>=like全部过滤,被暴打,放弃
最后看师傅们的payload,直接在id和limit处闭合注释为所欲为,用减法的结果进行盲注,mid截取字符串,from for绕过逗号
limit有一个需要数字范围在0-10,字符串弱类型比较,开头是个数字就行
本地实验payload,可行,还是得用括号单开一个新select才能拿到其他表的值
select * from users where id=0 or 69-/*aaaaa*/ord((select mid(group_concat(email_id) from 1 for 1) from emails));

web2

是y1ng神仙出的签到,难度不大不过感觉做的很精致,比我的垃圾前端强一万倍
JavaScript原型链污染,选英雄打boss,刀斯林狂喜
看到开了json的解析,可以提交奇怪的数据了,boss攻击力正无穷血也厚,玩家攻击力低,加道具也没输出,三回合必死,但是可以自己提交数据创建英雄。看到在选巫医的时候技能是加血而不是加攻,buff这个属性不会被赋值,通过原型链污染加buff把攻击力加到1000,一刀一个小朋友获得flag

content-type改为application/json
提交一个{“__proto__“:{“buff”: 1000},”xxx”: “xxx”……}选大药和巫医两个不加攻击力的属性,就能原型链污染一拳打死小强

web3

反序列化逃逸,完全看得出来是这么回事,就是没想出来是逃逸一个对象出来呜呜呜
有一个反序列化点,反序列化会check一下data,把flag,file之类的替换成index,看到这就应该想到是逃逸出来一个数据,而类在destruct的时候会把avatar的内容base64编码输出,但是反序列化出来的赋值变量并没有avatar,所以逃逸出了对象也不能控制avatar属性,太难了。
并且flag会被替换为index,也不能读取flag.php
难点upup
源码不贴了太多,打过的师傅自然懂怎么回事

然后师傅们直接逃逸出来一个User对象,根本不逃逸单独一个avatar,我直接构造出一个对象然后把它析构掉输出flag,太牛逼了
至于flag的绕过,则反序列化时使用大写S方法进行字符串逃逸,使用十六进制代替字符,读取flag