筑基挑战 | 第14期
第1题
题目:flag值存放在系统根目录下,请根据所学知识及题目提示,获取flag值
配套工具:Cyberchef
进来就说是文件包含漏洞,而且配套工具也给了Cyberchef,因此第一思路是直接尝试利用 php 伪协议返回base64编码,然后解码得到flag。
于是构造一个 payload,但结果并未返回:
此时考虑是否存在过滤,比如过滤了 “php”、“filter”等关键字,但经过初步验证,似乎只是过滤了 php 关键字,而且发现 data 关键字并没有被过滤:
那么这道题就可以换个思路,利用 data 伪协议进行。由于已经知道题目中可能存在过滤,因此最保险的方法就是将payload进行编码后再输入。因此首先使用Cyberchef将payload进行base64编码:
接着通过 data://text/plain;base64,[base64编码]
读取根目录文件,发现flag文件名为flag.wasj
那么就可以直接读取了:
最终Payload为:
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgLi4vLi4vLi4vZmxhZy53YXNqJyk7Pz4=
第2题
题目:启动环境,通读代码,获得flag值吧,注意flag格式为:flag_nisp_xxxxxx
代码如下:
<?php
$v1 = 0;
$v2 = 0;
$a = (array)json_decode(@$_GET['w']);
if (is_array($a)) {is_numeric(@$a["bar1"]) ? die("nope") : NULL;if (@$a["bar1"]) {($a["bar1"] > 2020) ? $v1 = 1 : NULL;}if (is_array(@$a["bar2"])) {if (count($a["bar2"]) != 5 or !is_array($a["bar2"][0])) {die("nope");}$pos = array_search("cisp-pte", $a["bar3"]);$pos === false ? die("nope") : NULL;foreach ($a["bar2"] as $key => $val) {$val == "cisp-pte" ? die("nope") : NULL;}$v2 = 1;}
}
if ($v1 && $v2) {include "key.php";echo $key;
}
highlight_file(__file__);
?>
通读下来,代码首先通过参数‘w’获取数据,并且传递进来的参数必须是JSON格式,接着被转为数组类型。最后发现要想获得 flag,必须使变量$v1
和$v2
均为1才可。
回归到代码中,要使$v1 = 1
,需要“bar1”对应的值不是数字,却要大于2020。这里考虑到PHP的弱类型比较,将“bar1”取值为“2021a”即可解决。
要使$v2 = 1
,需要“bar2”是数组,并且长度得等于5,第一个元素是数组,且不能存在“cisp-pte”字符串;“bar3”也得是数组,且必须要存在“cisp-pte”元素。因此此处将“bar2”构建为[[],"a","a","a","a"]
,将“bar3”构建为["cisp-pte"]
最终构建出的payload为:
?w={"bar1":"2021a","bar2":[[],"a","a","a","a"],"bar3":["cisp-pte"]}
第3题
题目:下载日志包,分析日志,找到flag值吧
进入界面后,告知我们有人入侵了服务器,但不知道哪里出现问题,要我们通过日志分析来找出攻击利用点。
先下载日志文件,长长一大条。
首先思路就是,日志往往是随着时间记录的,这样想的话,一般攻击成功的信息都会留在日志后面,因此先从日志最后开始分析,果然发现了几串 200 响应码的日志,盲猜攻击者在进行目录扫描这种工作。
其中最吸引我注意力的就是/upload
和/admin
目录了,因为/upload
目录里可能存在攻击者上传的一些恶意文件,/admin
则与管理员相关,一般攻击者都会考虑获取管理员权限嘛。
结果/upload
无法访问,/admin
目录里则出现了一个 backdoor.php 文件:
点进该php文件,获取到flag。