排查Nginx目录非法可执行脚本需四步:一查非标及隐藏命名文件;二查权限与属主异常;三比对修改时间与访问日志;四用file和curl验证真实类型与执行行为。

排查 Nginx 目录中是否存在隐藏的非法可执行脚本文件,核心在于“定位可疑文件 + 判断执行意图 + 验证行为动机”。这不是单纯找后缀为 .php/.py/.sh 的文件,而是识别那些刻意伪装、权限异常、行为隐蔽的恶意脚本。以下四类检查最直接有效:
一、扫描非标准命名与隐藏文件
Nginx 网站根目录(如 /var/www/html 或宝塔中的 /www/wwwroot/xxx)是重灾区。攻击者常把 Web Shell 命名为 .env.php、__index.php、123456.php、wp-config-backup.php,或直接以点开头(如 .shell、.gitignore.php)来绕过常规查看。
- 用 find 扫描所有 PHP/Python/Perl/Shell 类脚本(含隐藏文件):
sudo find /var/www/html -type f \( -name "*.php" -o -name "*.py" -o -name "*.pl" -o -name "*.sh" \) -ls - 加 -name ".*" 单独查点开头的隐藏项:
sudo find /var/www/html -type f -name ".*" -ls - 重点检查 /uploads/、/images/、/cache/ 这类用户可写目录,它们是上传型 Web Shell 的高发地。
二、检查文件权限与属主异常
合法网站文件通常由 www-data 或 nginx 用户拥有,且权限不开放写入(如 -rw-r--r--)。若发现某个 PHP 文件属主是 root 或 nobody,或权限为 -rwxr-xr-x(带执行位),就要立即核查。
- 列出所有可执行的脚本文件:
sudo find /var/www/html -type f \( -name "*.php" -o -name "*.py" \) -perm /u+x,g+x,o+x -ls - 检查属主不是 web 服务用户的文件:
sudo find /var/www/html -type f \( -name "*.php" -o -name "*.py" \) ! -user www-data ! -user nginx -ls
三、比对文件时间戳与访问日志
非法脚本往往在你不知情时被上传。如果某 PHP 文件的修改时间(mtime)远晚于你最近一次部署时间,又没出现在 Git 提交或备份记录里,就高度可疑。
- 按修改时间倒序列出近 7 天的 PHP 文件:
sudo find /var/www/html -name "*.php" -mtime -7 -ls | sort -k8,9 - 结合 Nginx 访问日志,看这些文件是否被频繁请求(尤其是 POST 请求):
sudo grep -E '\.php.*POST' /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head -10
四、静态内容+动态行为交叉验证
很多 Web Shell 会伪装成图片或 JS 文件(比如 avatar.jpg.php 或 jquery.min.js?cmd=ls)。单看后缀没用,要结合 MIME 类型和实际响应内容判断。
- 用 file 命令检测真实类型:
sudo file -i /var/www/html/uploads/shell.jpg.php(若返回 text/x-php 就露馅了) - 用 curl 模拟请求,观察是否返回 PHP 代码或执行结果:
curl -I http://yoursite.com/uploads/shell.jpg.php(看 Content-Type)
curl http://yoursite.com/uploads/shell.jpg.php?cmd=id(测试是否可执行命令) - 检查 Nginx 配置中是否错误地允许了非标准扩展名执行(如 location ~ \.jpg\.php$),这类配置本身就会引入风险。


















