03月12, 2019

CTF-web 笔记 14

PHP zip 伪协议配合文件包含

某些情况下,环境中存在文件包含漏洞并且可以上传文件,但是只限 jpg 文件。

这时候可以用 zip 协议,用法如下:

zip://path/archive.zip#dir/file.txt

这个 zip 文件不一定要以.zip为后缀,只要该文件有 zip 正常的文件结构即可。

比如我要上传一个shell.php,可以先添加进压缩包pack.zip中,然后重命名为pack.jpg

这时候上传这个 jpg 文件,然后使用如 zip 伪协议进行包含:

zip://pack.jpg#shell.php

PHP mt_rand() 伪随机数绕过

同一题,成功上传文件后,文件被重命名了,命名规则见如下代码:

function random_str($length = "32")
{
    $set = array("a", "A", "b", "B", "c", "C", "d", "D", "e", "E", "f", "F",
        "g", "G", "h", "H", "i", "I", "j", "J", "k", "K", "l", "L",
        "m", "M", "n", "N", "o", "O", "p", "P", "q", "Q", "r", "R",
        "s", "S", "t", "T", "u", "U", "v", "V", "w", "W", "x", "X",
        "y", "Y", "z", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9");
    $str = '';
    for ($i = 1; $i <= $length; ++$i) {
        $ch = mt_rand(0, count($set) - 1);
        $str .= $set[$ch];
    }
    return $str;
}

用到了函数mt_rand(),这个函数在种子相同的时候,给出的随机数序列是一样的,所以只要知道了种子,该函数的随机数便可以预测。

若已知第一次mt_rand()获得的数,便可使用 php_mt_seed 爆破种子,该工具只支持 PHP5,由于mt_rand()的算法在 PHP7 下有些微变动,该工具在 PHP7 下不适用。


PHP 控制 session_id() 返回值

还是同一题,使用 php_mt_seed 必须要知道第一个随机数,但是上面用于生成文件名的随机数是不可见的。

找到如下代码:

$seed = rand(0,999999999);
mt_srand($seed);
$ss = mt_rand();
$hash = md5(session_id() . $ss);
setcookie('SESSI0N', $hash, time() + 3600);

可以看见,在mt_srand()播种之后执行了第一次mt_rand(),而且变量$hash的值是可见的。

$hash的值是session_id()的返回值与种子拼接后再 MD5 的结果。

若想破解这个 MD5,要让加密前的字符串越简单越好,纯数字就可以。

故传入如下 Cookie:

Cookie: PHPSESSID=0

现在变量$hash的值是纯数字的了,送去各大 MD5 库基本上都可以成功解密。

本文链接:https://blog.cindemor.com/post/ctf-web-14.html

-- EOF --