第四届世安杯比赛

第四届世安杯划水日记

两位队友的文章 @a-lie-Z链接地址 和 @primykq链接地址

ctf入门级题目

ereg传入数组时不会返回FALSE,strpos传入数组也不会反回FALSE…

此外ereg还可以使用%00截断

类型

php代码审计的题,很喜欢

对于x1,注意到case 0后边没有break,直接传入x1=0即可

对于x2,构造json字符串。其中x21不能为数字且x21>”2017”,传入x21=2018a。x22出题点应该是array_search是弱比较,只需要有一个键为0,就可以绕过。

对于x3,直接md5碰撞,脚本大概长这样…

1
2
3
4
5
6
7
8
9
<?php
$a = '1';
$s = 'XIPU';
while(1)
{
$x3 = $s + $a;
substr(md5($x3),8,16) == substr(md5('15562'),8,16)?die($x3):$a++;
}
?>

登录

右键查看源码发现提示,密码为五位数字,想到爆破。看一下验证码,猜想应该是第一次请求会生成vcode并保存在session,后面每一次请求与保存的vcode比对并生成新的vcode。所以写脚本每次请求需要带入phpsessid(一开始没注意导致一直抓不到验证vcode的页面,还以为出bug了…)

基于此,写python脚本爆破,这里又踩了一个坑,没错,我是从10000开始爆破的,五位数字…只想说人生经验还不够丰富

好像burp可以用intruder模块直接爆破,有一个选项是可以使用返回的页面作为下一次请求的参数,很适合这个题。

admin

php://input伪协议+未处理的post数据绕过第一层,然后利用include+php://filter/read=convert.base64-encode/class.php读源码,这里很好奇无法读取flag.php。

先读取index.php发现对$file参数做了过滤.构造序列化字符串(其中需要给一个变量赋值),然后程序执行echo调用_toString,就可以getflag。

结语

然后就…没有了。

不说了,虽然菜,但还是玩的很开心的。

ps: 希望下午校赛可以取得好成绩