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 库基本上都可以成功解密。