不安全的文件下載與上傳 二次渲染繞過

二次渲染繞過
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圖片直接被上傳成功。安全

相關文章
相關標籤/搜索