赛博新生测验 Write Up

前言

听说赛博有新生测验所以慕名前去,菜鸡萌新只会做web题2333。

simple-site那道题好像是nodejs原型链污染,而我还没有接触过nodejs,只好放弃,差一点就ak了嘤。

web的题质量都很好!!!学到了不少东西。

0x01 Moving Rome

首先访问题目地址,出现了这个

然后马上就跳转了

于是想到抓个包,BurpSuite启动!

看看我抓到了什么!

看一下代码,意思是让我访问/waoooo.php,通过GET传入参数a的值。

a的值又是include的文件名,应该就是文件包含啦。

1
flag在hint.php?

看这一句,又告诉我文件在hint.php,于是想到传入/waoooo.php/?a=hint.php去看看文件里有什么。

看了看phpinfo()里应该没有什么有用的内容,有用的可能只有右上角的BASE64,难道是要我BASE64解码?在这里各种尝试,不停的Google后,终于找到了我想要的:

php://可以读取文件的源代码!!!

这个知识点太重要了,我一定要拿小本本记下来!

于是访问

1
/waoooo.php/?a=php://filter/read=convert.base64-encode/resource=hint.php

这样就读到了页面被base64-decode后的代码,得到了一串base64编码

解码之后得到

1
2
3
4
5
<?php
echo "BASE64";
phpinfo();
/*flag{hAcKED_by_PTT0!}*/
?>

至此flag就拿到啦!

flag{hAcKED_by_PTT0!}

0x02 easyregex

看题目应该是一道代码审计。

分析一下,首先是要通过表单提交input1的值,然后通过正则判断是否全为字母或数字,然后进入分支判断是否包含单引号。那这就有矛盾了啊?怎么能又是字母和数字又包含单引号的?在这里我试了很久很久,包括但不限于aaa,aaaa',1234,aa'a。快要崩溃的时候我发现我漏了关键条件——正则语句最后的/m。查了一下定义,

正则表达式的标志m用来表示多行搜索

于是就很轻松了!

我们输入aaa',然后提交之后抓个包,再字母和单引号之间传入换行符urlencode编码,即%0a

于是拿到了flag

flag{you_are_right}

这里补充一波:

preg_match()函数有一个特性,它会匹配第一个符合正则的结果,即当它匹配多行时,会一行一行的匹配,如果第一行匹配不上就匹配第二行,以此类推,直到所有行的内容都不满足匹配,于是它将会返回0。从这个特性我们可以得出preg_match()匹配的返回值是是匹配的次数,并且只能返回0(不匹配),或者1

我做这道题的时候不清楚preg_match()函数的这个特性,其实有一定程度上是蒙的,赛后和学长交流了以后才明白!学到了!

0x03 Whiskey’s house

看到这题有提示,说这题有源码泄露

google一下,源码泄露有一种成因是因为备份文件没有及时删除导致源码的泄露,于是我想到了扫站。

果然扫到了一个.bak结尾的备份文件,还有一个也许包含flag的文件。于是尝试访问/index.php.bak。下载之后就开始愉快的代码审计了!

在这里看了好久也不知道突破点在哪里,在快要放弃的时候想到搜一下preg_replace()这个函数,又搜了搜这个函数有什么安全隐患。这里简单看一下preg_replace()这个函数

1
mixed preg_replace (mixed $pattern, mixed replacement, mixed subject)

其中$pattern是正则匹配表达式。这个函数会在subject中搜索匹配pattern的部分,并将其替换为replacement

特别地!!!$pattern中存在/e修饰符时,允许代码执行。也就是说,我们可以通过构造Payload,去看看网站目录下的flag.php

那么我们先试着命令执行吧!

按照上面的分析,并且参考泄漏的源码,我们试着执行phpinfo()

成功,那么我们就可以想办法看到网站目录下的flag.php了。

那么构造Payload

system(“cat+flag.php”)

拿到flag

flag{PHP_is_sosososo_easy}

关于这个函数,我觉得网上的分析更加细致。

0x04 End

打开一看是登录界面,于是想到弱口令走一波。

这是干了什么?他把我输入的账号密码都返回了?那看来不是SQL注入之类的东西。这我就无从下手了,先扫扫站吧。

flag.php是我们要努力的目标,这个www.zip也许又是泄露出来的源码?

那我们先访问/www.zip看看,下载拿到了一张图片:

啥也看不懂,差点放弃了。这时注意到登录框下面有个测试员joomla,想到这可能是一个提示?

于是google一下,发现是一家公司的名字,接着把源码截取一部分和joomla一起放到google上搜,搜到了PHP反序列化字符逃逸

看到这里我人傻了。反序列化是什么?字符逃逸又是什么?经过一番填鸭式学习,终于明白了什么是反序列化。通俗的说呢,PHP序列化的结果就像json一样,目的是用来更方便地存储和调用数据。

那么我们来看一看源码吧!大家还是看上面的文章吧我太懒了

因为文中的密码passwd比题目中的密码key2多四个字符,所以我们要逃逸的字符少了4个,原文一共逃了23个字符,我们这里一共逃了23-4=19个字符,于是要传进去7\0\0\0,一共能逃掉3*7=21个字符,于是我们需要在后面填充2个字符。

所以Payload就出来了:

1
2
key1: \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
key2: AA";s:4:"key2";O:4:"SYS1":1:{s:5:"order";s:12:"cat flag.php";}

拿到flag

flag{You_are_so_great!}

后记

第一次写WriteUp的小萌新到现在还有点小激动!这次的题目很棒,虽然除了web以外的其它题都看不懂就是了。现在想来自己还是有很多不会的地方,答题基本都靠Google要是没有Google我可能一道题都做不出来。

赛博的各位学长真的都太强了!你们出的题目都很棒虽然除了web我都不会做

接下来就要准备期末考试了,我马上开始预习高数线代C语言!