百度杯CTF十月场

2016年10月场,全是web题目

第一场:

Web Login

打开是一个登录页面,万能密码被过滤,查看源代码发现用户名密码都是test1,成功登陆。登陆后页面没发现特殊的东西,查看数据包发现返回了一个httpheader是show:0,于是手动添加一个show:1进去得到页面源码:

将token参数的值经过三次解码以后与”ichunqiu”对比,如果成功则打印flag,通过login[‘user’]可知,解码后的值应该是一个array。

编写一个php脚本得到token:

尝试把token加入post参数里,没有返回,加入Get参数里也没有返回,加入cookie里返回成功,得到flag。

Web GetFlag

进入一个login界面,需要填入帐号密码和验证码,验证码格式类似:substr(md5(captcha), 0, 6)=44cb8d

写python脚本猜测验证码:

登陆时用万能密码admin’ or ‘1’=’1登陆成功。进入发现有三个文件可以下载,下载文件时向服务器提交GET请求型为:f=hello.txt,查看三个文件后提示”flag is in the web root dir”,当前页面在/Challenges/file/目录下,构造f=../../flag.php,返回flag{wow!!!but not true},直接提交f=../,仍然是这个,因此../无法使用,先猜测一下绝对路径/var/www/html/Challenges/flag.php,发现直接下载。得到源码:

post flag=flag; 即可在注释里看到flag。需要注意的是eval里没有给出”;”,所以需要在提交flag参数的最后加上,不然eval语句报错无法执行。

Web Backdoor

.git

第二场:

Web Not Found

打开页面是404,查看HTTP返回头发现method:haha,这种提示开始想是参数,后来发现不对后因为Method开始尝试更改http请求方法,当方法为OPTIONS时返回302为?f=1.php,之后并没有得到其他有用信息,于是fuzz参数f,最后fuzz出.htaccess中有RewriteRule ^8d829d8568e46455104209db5cd9228d.html$ 404.php [L],直接访问8d829d8568e46455104209db5cd9228d.html显示ip incorrect ???XFF???,猜测是用XFF头伪造IP,但是尝试了127.0.0.1以及三个内网地址后都不行,尝试其他的伪造方法,最后用client-ip: 127.0.0.1成功返回flag。

第三场:

Web Fuzzing,

打开页面没有发现东西,源码也没有,查看http返回头发现hint提示ip, large internal network,用XXF伪造X-Forwarded-For: 试到10.0.0.1成功,提示去找m4nage.php页面,访问后页面提示show me your key,用post请求提交key=1,返回key is not right,md5(key)===”1b4167610ba3f2ac426a68488dbd89be”,and the key is ichunqiu***,the * is in [a-z0-9],python脚本爆破

得到next step: xx00xxoo.php, 访问后页面显示source code is in the x0.txt.Can you guess the key
the authcode(flag) is 39594igiYCxBKKZSRgvKHiwgHVM2DjWaudrBDsBVtFSPnZ56ZOOxJwYRkB0VKc27JPdxcp3yf5w4G3RVZtiTXhqDrWvY2Yk,查看x0.txt,发现源码:

已经提示了flag加密后的字符串,搜索后发现是discuz的加密函数。

第四场:

Web Hash

打开页面源代码:

直接访问后得到:

you are 123;if you are not 123,you can get the flag<br><!–$hash=md5($sign.$key);the length of $sign is 8

md5加密,解密后为kkkkkk01123,前8个字符是$sign,构造key为1,md5加密kkkkkk011,提交后得到下一个页面Gu3ss_m3_h2h2.php,

打开后显示源代码:

核心语句是$var的反序列化操作,以及绕过__wakeup()魔法函数,搜索php反序列化漏洞,可以找到一个绕过__wake()函数的方法: http://paper.seebug.org/39/

根本原因是当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行,并且正则表达式过滤不严谨导致可以反序列化object。

可以构造payload:O:+4:”Demo”:3:{s:10:”/x00Demo/x00file”;s:16:”f15g_1s_here.php”;},base64编码后提交可以得到f15g_1s_here.php页面,要注意的是0x00要先经过url编码再解码。

addslashes()函数,可以用${@eval()},更改请求方式绕过i春秋的waf即可拿到flag。