帮助中心

如何查找网站里的木马文件


最近更新: 2025-12-13

新手站长必看!

现在有很多个人建网站或公司建网站都采用了从网络上下载源码的方式进行快速开发,短期交付。但这些源码有很多是带有隐患的,在某个不起眼的位置,代码里放入了一段可任意上传、执行代码的代码。加以有很多专业搞网站的使用”专业“工具进行扫描,给站长带来了巨大的压力,一旦处理不及时,所有的SEO工作鸡飞蛋打!要想再恢复排名,最起码两个月开外。

网站安全漏洞

怎么去查找呢?

 

一、先辨异常信号,锁定排查方向​


网站感染木马后往往会露出蛛丝马迹:页面莫名跳转、弹出广告、后台登录失效,或搜索引擎收录异常,这些现象可作为排查起点。若出现此类情况,优先聚焦可能被篡改的核心区域,如首页文件、JS 脚本库、数据库配置文件等,避免盲目排查。​


二、手动排查:精准定位隐藏木马​


手动检查适合有基础的使用者,能发现工具遗漏的深层威胁。首先通过 FTP 或服务器文件管理界面,按修改时间排序文件,重点核查非维护时段新增或变更的脚本文件(如.php、.asp、.js 格式),陌生文件名(如 hacker.php、spy.jsp)或隐藏属性文件需格外警惕。其次,查看首页及核心文件源码,右键 “查看源文件” 寻找可疑代码,比如不明 iframe 嵌套、加密乱码段、eval () 等危险函数调用,或指向陌生域名的 301 重定向语句。对数据库则需检查是否存在陌生数据表,以及存储配置信息的字段中是否有恶意注入内容。​


三、工具辅助:提升排查效率​


借助专业工具可大幅降低操作难度。轻量级工具如 wscan5.3.2 能遍历网站目录,通过特征库标记可疑文件并红色高亮,适合快速初步筛查;Linux 系统可使用 Malware Detect 工具执行全盘扫描,结合 find 与 grep 命令搜索含 system、exec 等危险函数的文件;Windows 系统则可通过 iGuardV5 的命令行工具定向扫描特定格式文件。此外,在线文件对比工具能快速发现被篡改的核心文件,与原始备份比对即可锁定异常代码位置。​


四、关键注意事项​


排查时需备份所有文件,避免误删正常代码影响网站运行;删除可疑文件前记录其修改时间与路径,便于追溯攻击源头;对权限设置异常(如 777 权限的脚本文件)需重点核查,此类文件易被黑客利用植入木马。若手动与工具排查后仍有异常,建议联系专业安全机构进行深度检测,避免遗漏后门程序。​
 

五、关注网站访问日志

 
网站访问日志
如果网站开启了日志功能,可以从日志中查找黑客从哪里植入了提权或写脚本的代码,直接删除这个文件!
上图展示了有客户端在批量猜测网站可能存在的文件,请不用关注。
 

六、升级富文本编辑

 
多数网站都有富文本编辑器,一些较低版本的编辑器自带的止传功能,而这些上传接口很可能带有考虑不周的情况,很有可能会被黑客利用。针对这个情况,要么替换上传文件,要么升级这个编辑器到最新版本。

七、自力更生,定制程序排查

 
如果以上都没有效果,建议手动写一个小程序,逐个文件扫描,看看文件中有没有明显的php/asp/asp.net后门代码。下面以 c#为例,展示如何通过正则匹配,查找文件中是不是可能含有可执行后门代码:
 
using System.Text;
namespace 代码检测
{
    /// <summary>
    /// 恶意代码检测工具类(支持 PHP/ASP/.NET 可疑代码检测,实例化时指定特征码文件路径)
    /// </summary>
    public class MaliciousCodeDetector
    {
        #region php特征码
        /// <summary>
        /// 预编译正则:匹配PHP代码块内的高危恶意特征
        /// 核心规则:仅检测<?/<?php开头的代码块,兼容无?>结尾的场景
        /// </summary>
        private static string[] phpRegKeys = new[] {
            // 1. 系统命令执行类(黑客操控服务器核心)
            @"exec\s*\(",
            @"system\s*\(",
            @"shell_exec\s*\(",
            @"passthru\s*\(",
            @"`(?:cmd|powershell|whoami|ls|dir|rm|rmdir|cp|mv|echo|cat|bash|sh|python|php)\s*[a-zA-Z0-9_\-\/\\=|&:;,.]{0,50}`", // 反引号执行命令(仅匹配单行,减少误判)
            @"proc_open\s*\(",
            @"popen\s*\(",
            @"pcntl_exec\s*\(",
            // 2. 代码执行类(动态执行恶意代码)
            @"eval\s*\(",
            @"assert\s*\(",
            @"create_function\s*\(",
            @"call_user_func\s*\(",
            @"call_user_func_array\s*\(",
            @"array_map\s*\(",
            @"preg_replace\s*\/.*e.*\/",
            @"mb_ereg_replace\s*\/.*e.*\/",
            @"uasort\s*\(",
            @"uksort\s*\(",
            @"array_filter\s*\(.*\$",
            @"phpinfo\s*\(",
            // 3. 文件操作类(篡改/上传木马)
            @"file_put_contents\s*\(",
            @"fwrite\s*\(",
            @"move_uploaded_file\s*\(.*\.php",
            @"chmod\s*\(",
            @"unlink\s*\(",
            @"copy\s*\(",
            @"glob\s*\(",
            // 4. 绕过/隐蔽类(躲避检测)
            @"base64_decode\s*\(",
            @"urldecode\s*\(",
            @"rawurldecode\s*\(",
            @"\$_POST\[[^\]]+\]",
            @"\$_GET\[[^\]]+\]",
            @"\$_COOKIE\[[^\]]+\]",
            @"\$_FILES\[[^\]]+\]",
            @"php:\/\/input",
            @"data:\/\/",
            //@"@\w+\s*\(",
            @"die\s*\(",
            @"exit\s*\(",
            // 5. 进阶执行/绕过(高阶后门)
            @"extract\s*\(\$_(POST|GET|REQUEST)",
            @"parse_str\s*\(\$_(SERVER|POST|GET)",
            @"register_shutdown_function\s*\(",
            //@"\(\$[a-z]+\)\(\)",
            @"function\(\)\{\}\(\)",
            @"include\s*\(\$_(GET|POST|REQUEST)",
            @"require\s*\(\$_(GET|POST|REQUEST)",
            @"auto_prepend_file",
            @"auto_append_file",
            // 6. 提权/隐蔽通信(远控/窃取数据)
            @"posix_getuid\s*\(",
            @"posix_setuid\s*\(",
            @"chroot\s*\(",
            @"putenv\s*\(",
            @"socket_create\s*\(",
            @"socket_connect\s*\(",
            @"fsockopen\s*\(",
            @"curl_exec\s*\(.*http",
            @"error_log\s*\(.*base64",
            @"\$_SESSION\[[^\]]+\]\s*=",
            // 7. 变形/混淆(躲避静态检测)
            @"chr\(\d+\)\.chr\(\d+",
            @"base64_decode\(base64_decode",
            @"gzuncompress\(base64_decode",
            @"e\/\*.*\*\/v\/\*.*\*\/a\/\*.*\*\/l",
            //@"\\x[0-9a-f]{2}",
            //@"\\u00[3-7][0-9a-f]",
            // 8. 文件/路径绕过(遍历/上传漏洞)
            @"php:\/\/filter",
            @"zip:\/\/",
            @"phar:\/\/",
            //@"\.\.\/",//jpg文件中也可能有这样的代码
            //@"%00",
            @"(?:file_put_contents|fopen)\s*\(\s*[""'].*?\.php\\0[^""']*?[""']", // 文件写入+NULL截断            @"`(?:echo|cat|cp)\s*[^`]*?\.php\\0[^`]*?>`", // 反引号命令+NULL截断
            // 9. 日志清理(掩盖攻击痕迹)
            @"unlink\s*\(.*log",
            @"ftruncate\s*\(.*, 0\)",
            @"system\s*\('rm -rf.*log" };
        #endregion
        #region asp特征码
        /// <summary>
        /// 预编译正则:覆盖完整/拆分/变形的ASP恶意特征
        /// </summary>
        private static readonly string[] aspRegKeys = new[] {
            // 1. 核心代码执行类(完整+拆分变形)
            @"eval\s*\(", // 覆盖Eval所有逐字符拆分变形
            @"Execute\s*\(",
            @"ExecuteGlobal\s*\(",
            // 2. 系统命令执行核心对象/方法(完整+拆分)
            @"CreateObject\s*\(",
            // 3. 文件操作类(完整+拆分)
            // 4. 绕过/隐蔽类
            @"URLEncode\s*\(",
            @"Replace\s*\(",
            @"Request\.Form\s*",
            @"Request\.QueryString\s*",
            @"On\s+Error\s+Resume\s+Next",
            // 5. 变形拼接核心(重点覆盖Chr拼接高危关键字)
            // 6. 远程通信/提权/日志清理类
             };
        #endregion
        #region .net特征码
        /// <summary>
        /// 预编译正则:匹配.NET代码块内的高危恶意特征
        /// </summary>
        private static readonly string[] dotnetRegexKeys = new[] {
            // 1. 代码执行/反射类(.NET核心后门手段)
            @"System\.Reflection\s*",
            @"Activator\.CreateInstance\s*\(",
            @"Assembly\.Load\s*\(",
            @"MethodInfo\.Invoke\s*\(",
            @"Type\.GetType\s*\(",
            @"Eval\s*\(",
            @"Execute\s*\(",
            @"Request\s*\.",
            @"Response",
            @"DynamicInvoke\s*\(",
            // 2. 系统命令执行类
            @"System\.Diagnostics\.Process\s*",
            @"Process\.Start\s*\(",
            @"cmd\.exe\s*",
            @"powershell\.exe\s*",
            @"bash\.exe\s*",
            // 3. 文件操作类(篡改/上传木马)
            @"System\.IO\.File\s*",
            @"File\.WriteAllText\s*\(",
            @"File\.Create\s*\(",
            @"File\.Copy\s*\(",
            @"File\.Delete\s*\(",
            @"FileStream\s*",
            @"StreamWriter\s*",
            // 4. 绕过/隐蔽类
            @"Base64Decode\s*\(",
            @"Convert\.FromBase64String\s*\(",
            @"HttpContext\.Current\.Request\s*",
            @"Request\.Form\s*",
            @"Request\.QueryString\s*",
            @"Request\.Cookies\s*",
            @"Server\.Execute\s*\(",
            @"Server\.Transfer\s*\(",
            // 5. 变形/混淆类
            //@"Chr\(\d+\)\s*\+\s*Chr\(\d+",
            //@"Convert\.ToChar\(\d+\)\s*\+\s*Convert\.ToChar\(\d+",
            @"string\.Concat\s*\(",
            @"Eval\s*\(",
            @"Execute\s*\(",
            // 6. 远程通信类(远控/数据窃取)
            @"System\.Net\.WebClient\s*",
            @"HttpClient\.SendAsync\s*\(",
            @"WebRequest\.Create\s*\(",
            @"TcpClient\s*",
            @"Socket\.Connect\s*\(",
            // 7. 提权/日志清理类
            @"WindowsIdentity\.Impersonate\s*\(",
            @"File\.Delete\s*\(.*\.log\s*",
            @"EventLog\.Clear\s*\(",
            @"Trace\.Close\s*\("
            };
            // 匹配.NET代码块结尾(允许无%>/}结尾)
        #endregion
        /// <summary>
        /// 检测指定文件中是否包含可疑代码
        /// </summary>
        /// <param name="file">文件完整路径</param>
        /// <returns>true=检测到可疑代码,false=未检测到</returns>
        public bool CodeDetected(string file)
        {
            // 验证输入参数
            if (string.IsNullOrEmpty(file))
            {
                throw new ArgumentNullException(nameof(file), "文件路径不能为空。");
            }
            // 检查目标文件是否存在
            if (!File.Exists(file))
            {
                throw new FileNotFoundException("目标检测文件不存在:", file);
            }
            try
            {
                // 智能检测文件编码并读取内容
                var fileEncoding = DetectFileEncoding(file);
                string fileContent = File.ReadAllText(file, fileEncoding);
                #region 检测php文件
                foreach (var key in phpRegKeys)
                {
                    var regex = RegexCache.GetCachedRegex(@"<\?(php)?.*" + key + @".*\?>");
                    if (regex.IsMatch(fileContent))
                    {
                        System.Diagnostics.Debug.WriteLine(key);
                        return true;
                    }
                }
                #endregion
                #region 检测asp文件
                foreach(var key in aspRegKeys)
                {
                    var regex = RegexCache.GetCachedRegex(@"<%.*" + key + @".*\%>");
                    if (regex.IsMatch(fileContent))
                    {
                        System.Diagnostics.Debug.WriteLine(key);
                        return true;
                    }
                }
                #endregion
                #region 检测.net文件
                foreach(var key in dotnetRegexKeys)
                {
                    var regex =RegexCache.GetCachedRegex(@"<%@?.*" + key + @".*\%>");
                    if (regex.IsMatch(fileContent))
                    {
                        System.Diagnostics.Debug.WriteLine(key);
                        return true;
                    }
                }
                #endregion
                //// 遍历特征码检测(忽略大小写)
                //if (MaliciousPhpRegex.IsMatch(fileContent))
                //{
                //    return true;
                //}
                //else if (MaliciousAspRegex.IsMatch(fileContent))
                //{
                //    return true;
                //}
                //else if (MaliciousDotNetRegex.IsMatch(fileContent))
                //{
                //    return true;
                //}
                return false;
            }
            catch (UnauthorizedAccessException ex)
            {
                throw new UnauthorizedAccessException($"无权限读取文件:{file},请检查文件权限。", ex);
            }
            catch (IOException ex)
            {
                throw new IOException($"读取目标文件时发生 I/O 错误:{file}", ex);
            }
            catch (Exception ex)
            {
                throw new Exception($"检测文件 {file} 时发生异常:", ex);
            }
        }
        /// <summary>
        /// 智能检测文件编码(优先识别 BOM,无 BOM 则按 Windows 中文系统默认 ANSI(GBK)处理)
        /// </summary>
        /// <param name="filePath">文件完整路径</param>
        /// <returns>识别到的编码</returns>
        private static Encoding DetectFileEncoding(string filePath)
        {
            using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                // 读取文件前 4 字节,用于检测 BOM
                var bomBytes = new byte[4];
                var readLength = fileStream.Read(bomBytes, 0, 4);
                // 检测 UTF-8 BOM (EF BB BF)
                if (readLength >= 3 && bomBytes[0] == 0xEF && bomBytes[1] == 0xBB && bomBytes[2] == 0xBF)
                {
                    return Encoding.UTF8;
                }
                // 检测 UTF-16 LE BOM (FF FE)
                if (readLength >= 2 && bomBytes[0] == 0xFF && bomBytes[1] == 0xFE)
                {
                    return Encoding.Unicode;
                }
                // 检测 UTF-16 BE BOM (FE FF)
                if (readLength >= 2 && bomBytes[0] == 0xFE && bomBytes[1] == 0xFF)
                {
                    return Encoding.BigEndianUnicode;
                }
                // 无 BOM 时:Windows 中文系统默认 ANSI 为 GBK,英文系统为 Windows-1252
                // 此处优先适配中文系统,返回 GBK(兼容 GB2312)
                return Encoding.GetEncoding("GBK");
            }
        }
    }
}
 
调用方式:var detector = new MaliciousCodeDetector();
foreach(var file in Directory.EnumerateFiles("你的网站目录","*.*", SearchOption.AllDirectories){
    if(detector.CodeDetected(file)){
           //你的处理逻辑。
    }
}
用c#做个windows桌面程序,最大可能查找潜在的安全隐患。
 
对于济南网站建设新手站长来说,下载源码建站的便捷性不能以牺牲安全为代价。重视恶意代码排查,用手动筛查、工具辅助、定制程序检测等方式筑牢防护屏障,才能避免 SEO 成果付诸东流,让济南建网站的每一份投入都能转化为稳定运营的底气,护航网站长期发展。