讀取檔案 → 搜尋惡意特徵字串 → 替換/移除 → 寫回檔案。
<?php
class WebShellCleaner {
private $targetFiles = [];
private $signatures = [
// 常見單行木馬
'eval(base64_decode',
'eval(gzinflate',
'assert(',
'preg_replace.*\/e',
'create_function',
'system(',
'shell_exec(',
'passthru(',
'exec(',
'$_GET[', '$_POST[', '$_REQUEST[', '$_COOKIE[',
'@eval', '@assert',
'GLOBALS[',
'file_put_contents',
'fwrite',
'base64_decode',
'gzinflate',
'str_rot13',
];
public function addTarget($path) {
if (is_file($path)) $this->targetFiles[] = $path;
elseif (is_dir($path)) $this->scanDir($path);
}
private function scanDir($dir) {
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
foreach ($it as $file) {
if ($file->isFile() && in_array($file->getExtension(), ['php', 'inc', 'phtml', 'php5'])) {
$this->targetFiles[] = $file->getPathname();
}
}
}
public function scan() {
$results = [];
foreach ($this->targetFiles as $file) {
$content = file_get_contents($file);
$matches = [];
foreach ($this->signatures as $sig) {
if (stripos($content, $sig) !== false) {
$matches[] = $sig;
}
}
if ($matches) {
$results[$file] = $matches;
}
}
return $results;
}
public function clean($dryRun = true) {
$cleaned = 0;
foreach ($this->targetFiles as $file) {
$content = file_get_contents($file);
$original = $content;
foreach ($this->signatures as $sig) {
$content = str_ireplace($sig, '', $content);
}
if ($content !== $original) {
if (!$dryRun) {
file_put_contents($file, $content);
}
$cleaned++;
}
}
return $cleaned;
}
}
// 使用
$cleaner = new WebShellCleaner();
$cleaner->addTarget('/var/www/html');
$results = $cleaner->scan();
print_r($results);
// 確認無誤後
$cleaner->clean(false);
?>
php-malware-finder, Lokimedia 等專案555、上傳目錄 755 + 禁用腳本執行php.ini disable_functions = eval,assert,exec,shell_exec,system,passthru,popen,proc_open,...find /var/www -type f -name '*.php' -exec md5sum {} \; 建立基線合法代碼可能包含特徵字串(如 base64_decode 用於圖片處理)。建議: