PHP 会话漏洞

信息安全 php 脆弱性 会话管理 时间 ctf
2021-08-14 14:07:03

我正在尝试通过 PHP 会话解决 CTF 上的挑战。目标是使check.phpecho $_PASSWORD

我无权访问文件本身,因此无法编辑它们。

我提出的解决方案是:

  1. 我们希望会话被锁定 20 秒,因此我们需要eat.php运行这么多时间。
  2. 同时,我们需要运行check.php,设置好$time,然后等待会话解锁。
  3. 现在我们需要解锁会话,这意味着我们需要停止eat.php.
  4. check.php将继续运行,以下表达式:$time+20!=$_SESSION['time']将为 false,PHP 将 echo $_PASSWORD

我的提议可行吗?如果是,您将如何实施?我也想听听解决这个问题的其他方向。

获取.php:

<?php
setcookie('id',uniqid());
?>

吃.php:

<?php
$cookie=$_POST['cookie'];
session_save_path('/home/mawekl/timetravel/');
session_start();
echo 'You ate: '.htmlspecialchars($cookie);
echo "\n<br>";
$_SESSION['cookie']=$cookie;
$_SESSION['time']=time();
?> 

检查.php:

<?php
$cookie=$_COOKIE['id'];
$time=time();
session_save_path('/home/mawekl/timetravel/');
session_start();
if ($cookie!=$_SESSION['cookie'])
    die('Wrong cookie');
if ($time+20!=$_SESSION['time'])
    die('You must eat cookie after 20 seconds from now, but you ate it '.($time-$_SESSION['time']).' seconds ago');
echo $_PASSWORD;
?> 
1个回答

我当然可能是错的,因为我不知道解决方案,但这是我的分析。

get.php可以完全忽略,因为你可以组成一个随机的idcookie 值。

我们可能没有所有必要的信息。服务器是否运行 Apache 或其他?使用了哪个 PHP 版本?是否有关于挑战的描述(它们通常包含晦涩的提示)?

就目前而言,我只看到两种现实的方法来解决这个问题:将数据注入该$_SESSION['time']变量,或在after和 before中check.php暂停$time=time();$time+20!=$_SESSION['time']

在寻找 PHP 中的注入漏洞时,我只发现了 CVE-2006-3016 (PHP 5.1),但它包含的细节很少,而且他们必须运行一个非常旧的 PHP 版本。去年也有人报告了会话注入漏洞,但似乎不适用。这条路似乎不太可行。

这留下了暂停技巧。我在想这样的事情:

  1. 打开很多连接,让它们请求eat.php$_POST['cookie']值,这样写所有会话需要很多时间。
  2. Request check.php,它将挂起,直到第 1 步完成。改变在步骤 1 中完成的请求数量,直到恰好需要 20 秒。

这将需要服务器进行多线程处理,因为它需要进入check.php睡眠状态并在后台执行一堆eat.php请求。

这样做的问题是每个人都eat.php需要写入同一个会话,否则它根本不会阻塞check.php(因为没有线程锁定check.php试图读取的会话)。但是,如果每个连续eat.php的完成都将$_SESSION['time']值更新为较新的值,则它不会具有旧的时间值。所以这也不起作用。(如果 PHP 在任何仍在写入的会话上阻塞,它可能会起作用,然后可以更新另一个会话eat.php并仍然check.php挂起,但这似乎不太可能,所以我没有探索这种可能性。)

简而言之,我们需要更多信息,甚至可能需要进入挑战环境。从我的角度来看,如果没有另一个漏洞(例如发送错误的 NTP 更新)似乎是不可能的。

回答你的问题

是的,您提出的解决方案可能会奏效。只有一个问题:你将如何真正做到这一点?;)