二次渲染繞過
Pass-16
源代碼:php
1 $is_upload = false; 2 $msg = null; 3 if (isset($_POST[‘submit‘])){ 4 // 得到上傳文件的基本信息,文件名,類型,大小,臨時文件路徑 5 $filename = $_FILES[‘upload_file‘][‘name‘]; 6 $filetype = $_FILES[‘upload_file‘][‘type‘]; 7 $tmpname = $_FILES[‘upload_file‘][‘tmp_name‘]; 8 9 $target_path=$UPLOAD_ADDR.basename($filename); 10 11 // 得到上傳文件的擴展名 12 $fileext= substr(strrchr($filename,"."),1); 13 14 //判斷文件後綴與類型,合法才進行上傳操做 15 if(($fileext == "jpg") && ($filetype=="image/jpeg")){ 16 if(move_uploaded_file($tmpname,$target_path)) 17 { 18 //使用上傳的圖片生成新的圖片 19 $im = imagecreatefromjpeg($target_path); 20 21 if($im == false){ 22 $msg = "該文件不是jpg格式的圖片!"; 23 }else{ 24 //給新圖片指定文件名 25 srand(time()); 26 $newfilename = strval(rand()).".jpg"; 27 $newimagepath = $UPLOAD_ADDR.$newfilename; 28 imagejpeg($im,$newimagepath); 29 //顯示二次渲染後的圖片(使用用戶上傳圖片生成的新圖片) 30 $img_path = $UPLOAD_ADDR.$newfilename; 31 unlink($target_path); 32 $is_upload = true; 33 } 34 } 35 else 36 { 37 $msg = "上傳失敗!"; 38 } 39 40 }else if(($fileext == "png") && ($filetype=="image/png")){ 41 if(move_uploaded_file($tmpname,$target_path)) 42 { 43 //使用上傳的圖片生成新的圖片 44 $im = imagecreatefrompng($target_path); 45 46 if($im == false){ 47 $msg = "該文件不是png格式的圖片!"; 48 }else{ 49 //給新圖片指定文件名 50 srand(time()); 51 $newfilename = strval(rand()).".png"; 52 $newimagepath = $UPLOAD_ADDR.$newfilename; 53 imagepng($im,$newimagepath); 54 //顯示二次渲染後的圖片(使用用戶上傳圖片生成的新圖片) 55 $img_path = $UPLOAD_ADDR.$newfilename; 56 unlink($target_path); 57 $is_upload = true; 58 } 59 } 60 else 61 { 62 $msg = "上傳失敗!"; 63 } 64 65 }else if(($fileext == "gif") && ($filetype=="image/gif")){ 66 if(move_uploaded_file($tmpname,$target_path)) 67 { 68 //使用上傳的圖片生成新的圖片 69 $im = imagecreatefromgif($target_path); 70 if($im == false){ 71 $msg = "該文件不是gif格式的圖片!"; 72 }else{ 73 //給新圖片指定文件名 74 srand(time()); 75 $newfilename = strval(rand()).".gif"; 76 $newimagepath = $UPLOAD_ADDR.$newfilename; 77 imagegif($im,$newimagepath); 78 //顯示二次渲染後的圖片(使用用戶上傳圖片生成的新圖片) 79 $img_path = $UPLOAD_ADDR.$newfilename; 80 unlink($target_path); 81 $is_upload = true; 82 } 83 } 84 else 85 { 86 $msg = "上傳失敗!"; 87 } 88 }else{ 89 $msg = "只容許上傳後綴爲.jpg|.png|.gif的圖片文件!"; 90 } 91 }
原理:將一個正常顯示的圖片,上傳到服務器。尋找圖片被渲染後與原始圖片部分對比仍然相同的數據塊部分,將Webshell代碼插在該部分,而後上傳。具體實現須要本身編寫Python程序,人工嘗試基本是不可能構造出能繞過渲染函數的圖片webshell的。
這裏提供一個包含一句話webshell代碼並能夠繞過PHP的imagecreatefromgif函數的GIF圖片示例。
php圖像二次渲染:
https://blog.csdn.net/hitwangpeng/article/details/48661433
https://blog.csdn.net/hitwangpeng/article/details/46548849
https://xz.aliyun.com/t/2657
這兩個講的還能夠
打開被渲染後的圖片,Webshell代碼仍然存在
提供一個jpg格式圖片繞過imagecreatefromjpeg函數渲染的一個示例文件。 直接上傳示例文件會觸發Warning警告,並提示文件不是jpg格式的圖片。可是實際上已經上傳成功,並且示例文件名沒有改變。
web
從上面上傳jpg圖片能夠看到咱們想複雜了,程序沒有對渲染異常進行處理,直接在正常png圖片內插入webshell代碼,而後上傳示例文件便可,並不須要圖片是正常的圖片。shell
程序依然沒有對文件重命名,攜帶webshell的無效損壞png圖片直接被上傳成功。安全