upload_labs_pass17_二次渲染
pass17-源碼分析
打開pass17,貌似和前面的幾關(guān)差不多(pass14,15,16都是圖片馬)。
看源碼和提示:
提示:
即利用上傳的圖片生成了一張新的圖片。
源碼:
$is_upload = false; $msg = null; if (isset($_POST['submit'])){// 獲得上傳文件的基本信息,文件名,類型,大小,臨時文件路徑$filename = $_FILES['upload_file']['name'];$filetype = $_FILES['upload_file']['type'];$tmpname = $_FILES['upload_file']['tmp_name'];$target_path=UPLOAD_PATH.'/'.basename($filename);// 獲得上傳文件的擴展名$fileext= substr(strrchr($filename,"."),1);//判斷文件后綴與類型,合法才進行上傳操作if(($fileext == "jpg") && ($filetype=="image/jpeg")){if(move_uploaded_file($tmpname,$target_path)){//使用上傳的圖片生成新的圖片$im = imagecreatefromjpeg($target_path);if($im == false){$msg = "該文件不是jpg格式的圖片!";@unlink($target_path);}else{//給新圖片指定文件名srand(time());$newfilename = strval(rand()).".jpg";//顯示二次渲染后的圖片(使用用戶上傳圖片生成的新圖片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagejpeg($im,$img_path);@unlink($target_path);$is_upload = true;}} else {$msg = "上傳出錯!";}}else if(($fileext == "png") && ($filetype=="image/png")){if(move_uploaded_file($tmpname,$target_path)){//使用上傳的圖片生成新的圖片$im = imagecreatefrompng($target_path);if($im == false){$msg = "該文件不是png格式的圖片!";@unlink($target_path);}else{//給新圖片指定文件名srand(time());$newfilename = strval(rand()).".png";//顯示二次渲染后的圖片(使用用戶上傳圖片生成的新圖片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagepng($im,$img_path);@unlink($target_path);$is_upload = true; }} else {$msg = "上傳出錯!";}}else if(($fileext == "gif") && ($filetype=="image/gif")){if(move_uploaded_file($tmpname,$target_path)){//使用上傳的圖片生成新的圖片$im = imagecreatefromgif($target_path);if($im == false){$msg = "該文件不是gif格式的圖片!";@unlink($target_path);}else{//給新圖片指定文件名srand(time());$newfilename = strval(rand()).".gif";//顯示二次渲染后的圖片(使用用戶上傳圖片生成的新圖片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagegif($im,$img_path);@unlink($target_path);$is_upload = true;}} else {$msg = "上傳出錯!";}}else{$msg = "只允許上傳后綴為.jpg|.png|.gif的圖片文件!";} }注意函數(shù)
basename()
給出一個包含有指向一個文件的全路徑的字符串,本函數(shù)返回基本的文件名。
看一些例子:
<?php echo "1) ".basename("/etc/sudoers.d", ".d").PHP_EOL; echo "2) ".basename("/etc/sudoers.d").PHP_EOL; echo "3) ".basename("/etc/passwd").PHP_EOL; echo "4) ".basename("/etc/").PHP_EOL; echo "5) ".basename(".").PHP_EOL; echo "6) ".basename("/"); ?>輸出:
看源碼可以知道,如果圖片 的類型是png,gif,png并且Content-type是允許上傳的。(比如源碼15行)
所以在看上面的源碼的時候,只需要看一個if語句塊就行了:
if(($fileext == "jpg") && ($filetype=="image/jpeg")){if(move_uploaded_file($tmpname,$target_path)){//使用上傳的圖片生成新的圖片$im = imagecreatefromjpeg($target_path);if($im == false){$msg = "該文件不是jpg格式的圖片!";@unlink($target_path);}else{//給新圖片指定文件名srand(time());$newfilename = strval(rand()).".jpg";//顯示二次渲染后的圖片(使用用戶上傳圖片生成的新圖片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagejpeg($im,$img_path);@unlink($target_path);$is_upload = true;}}在上面 的代碼中,就是只針對于jpg類型的圖片進行新的處理。PNG和GIF都是同理。
關(guān)注有一行:(使用上傳的圖片生成新的圖片)
函數(shù)imagecreatefromjpeg()
php官網(wǎng)的介紹:
由文件或 URL 創(chuàng)建一個新圖象。
imagecreatefromjpeg() 返回一圖像標(biāo)識符,代表了從給定的文件名取得的圖像。
貌似也沒有特別的東西。
pass17-圖片上傳
上傳之前第14關(guān)-16關(guān)我一直用的圖片馬:shell.gif
上傳之前,先把之前幾關(guān)遺留的馬刪除。
不知道為什么我上傳完是這個鬼樣子。。。
可能是環(huán)境問題。
我將PHP版本改為7.3.4nts,清空上傳文件之后再次上傳文件。
又告訴我不是GIF格式的文件。。。
后來我又嘗試了幾次,有一次確實上傳成功了,但是文件包含怎么都不行。奇了怪了。。。
其實是因為“二次渲染”導(dǎo)致上傳 的圖片中的一句話木馬已經(jīng)不見了。
那這一關(guān)該怎么做呢?
文件對比工具進行對比:
將二次渲染的圖片和我原先上傳的圖片shell.gif進行對比(可以用010editor進行對比)
發(fā)現(xiàn):
1.文件頭的部分有一些區(qū)別。
2.一句話木馬 的內(nèi)容被刪去了。
解決思路:把木馬加載哪一個地方,木馬才不會被刪掉。
當(dāng)然我自己有一個圖片(不會因為“二次渲染”而導(dǎo)致木馬被刪掉),
上傳文件:
再次連接webshell就成功。
總結(jié)
以上是生活随笔為你收集整理的upload_labs_pass17_二次渲染的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: upload-labs_pass14_p
- 下一篇: .NET混淆器 Dotfuscator如