关于 security-audit
security-audit 是面向 Laravel/PHP 项目的安全审计技能,供维护者检查依赖、文件、代码和服务器配置中的风险。它还提供加固建议,并要求对可能造成兼容性影响的修复先征求确认。
主要功能
- 01检查 composer.lock 中的已知漏洞
- 02搜索恶意文件、危险代码与挖矿迹象
- 03审查上传、存储和敏感文件防护
- 04检查凭据暴露及服务器级风险
- 05按严重程度整理审计报告
- 06经确认后应用安全加固
适用场景
- 01审计 Laravel/PHP 项目的依赖漏洞
- 02排查上传目录中的 Webshell 或恶意文件
- 03检查 .htaccess 与安全响应头配置
- 04评估服务器进程、sudoers 和定时任务风险
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ hexters/ laravel-security-audit --skill security-audit安装后在 Claude Code 中输入/security-audit确认已加载。
详细介绍
Laravel/PHP 项目安全审计技能
你是一名安全审计 Agent。激活后,对当前项目执行全面的安全审计。按顺序执行各个阶段,并清晰地报告发现的问题。
阶段 1:易受攻击的软件包检测
扫描 composer.lock,查找已知的易受攻击软件包:
# Check for intervention/image vulnerability (path traversal CVE)
python3 -c "
import json, sys
try:
with open('composer.lock') as f:
data = json.load(f)
vulns = []
checks = {
'intervention/image': lambda v: int(v.lstrip('v').split('.')[0]) < 3,
'symfony/http-kernel': lambda v: True, # always check advisory
'laravel/framework': lambda v: True,
}
for p in data.get('packages', []):
if p['name'] in checks:
ver = p['version'].lstrip('v')
vulns.append(f\"{p['name']}: {ver}\")
for v in vulns:
print(v)
except FileNotFoundError:
print('No composer.lock found')
"
如果可用,也运行 composer audit。
操作项:
- 将
intervention/image< v3 标记为严重问题(路径遍历,可读取 .env) - 检查易受攻击的软件包是直接使用还是作为传递依赖
- 判断升级是否安全,或是否需要采用本地路径仓库方案
阶段 2:恶意软件和 Webshell 扫描器
在以下位置搜索恶意文件:
2a. 上传/存储目录中的 PHP 文件(不应存在)
find storage/app/public public/uploads public/images public/storage -name "*.php" -type f 2>/dev/null
2b. 可疑文件模式
搜索以下文件:
- 随机的 5 个字符名称:
[a-z0-9]{5}.php - 已知恶意软件名称:
stmept、guard.sh、wp-admin.php、wp-cron.php、cache.php、test.php、unzip.php、bootstrap.cache.php、themes.php、menu.php、php8.php - Web 目录中的二进制可执行文件
- 带有双重扩展名的文件:
.php.jpg、.jpg.php - 临时 PHP 文件:
tmp_*.php
2c. PHP 文件中的危险代码模式
在 app/ 和 public/ 目录中搜索:
eval(
base64_decode(
exec(
system(
passthru(
shell_exec(
gzinflate(
str_rot13(
assert(
preg_replace with /e modifier
$_GET/$_POST/$_REQUEST used with eval/exec
create_function(
2d. 加密货币挖矿程序检测
# Check for known miner processes
pgrep -f "xmrig\|stmept\|minerd\|cpuminer" 2>/dev/null
# Check for miner binaries
find . -name "stmept" -o -name "xmrig" -o -name "minerd" 2>/dev/null
# Check for mining pool connections in code
grep -r "supportxmr\|nanopool\|minergate\|coinhive" . --include="*.php" --include="*.sh" --include="*.conf" 2>/dev/null
2e. 注入的 .htaccess 文件
# Check all .htaccess files for injected content (nginx configs, shell commands, redirects)
find . -name ".htaccess" -exec grep -l "sudo\|nginx\|server_name\|proxy_pass\|RewriteRule.*http" {} \;
阶段 3:配置安全检查
3a. 存储目录保护
检查 storage/app/public/.htaccess 是否存在,并包含阻止 PHP 执行的规则:
<FilesMatch "\.(?:php|phtml|phar|php[0-9]|inc)$">
Order Deny,Allow
Deny from all
</FilesMatch>
如果不存在,请创建该文件——这是抵御上传的 Webshell 的首要防线。
3b. 加固 public/.htaccess
检查 public/.htaccess 是否包含:
- 阻止 storage/uploads 目录中的 PHP 执行:
RewriteRule ^storage/.*\.php$ - [F,L] - 安全标头:
X-Content-Type-Options、X-Frame-Options、X-XSS-Protection - 阻止访问敏感文件:
.env、.log、.sql、.bak
3c. 文件上传安全
在 Filament/Controller 代码中搜索以下风险模式:
editableSvgs(true)——SVG 可能包含 JavaScript(XSS)和 XXE 攻击preserveFilenames()——原始文件名可能被操纵,导致路径遍历- 上传字段缺少 MIME 类型验证
- 缺少文件扩展名验证
3d. 凭据暴露
检查存在的 .env 文件类型(不要输出实际值):
grep -E "^[A-Z_]+=." .env | sed 's/=.*/=***/' | grep -iE "key|secret|password|token|mail|sendgrid|aws|stripe|paypal"
阶段 4:服务器级检查(如果可访问)
4a. Web 服务器用户
ps aux | grep -E "nginx|php-fpm|apache" | head -5
如果以 root 身份运行,则标记为严重问题——Web 服务器必须以非特权用户(www-data/nginx)运行。
4b. Sudoers 审计
grep -i "NOPASSWD" /etc/sudoers /etc/sudoers.d/* 2>/dev/null
标记任何 NOPASSWD: ALL 条目,尤其是针对 www-data、nginx 或 gitlab-runner 等 CI 用户的条目。
4c. Crontab 持久化检查
crontab -l 2>/dev/null
crontab -u www-data -l 2>/dev/null
ls -la /etc/cron.d/ /etc/cron.daily/ 2>/dev/null
4d. 活跃的挖矿程序/后门进程
pgrep -a -f "xmrig\|stmept\|minerd\|cryptonight"
netstat -tlnp 2>/dev/null | grep -E ":3333|:4444|:5555|:8888"
阶段 5:自动修复(应用加固措施)
获得用户确认后,应用以下修复:
修复 1:创建 storage/.htaccess(安全——不会造成任何破坏性变更)
<IfModule mod_php.c>
php_flag engine off
</IfModule>
<IfModule mod_php7.c>
php_flag engine off
</IfModule>
<IfModule mod_php8.c>
php_flag engine off
</IfModule>
<FilesMatch "\.(?:php|phtml|phar|php[0-9]|inc)$">
Order Deny,Allow
Deny from all
</FilesMatch>
修复 2:加固 public/.htaccess(安全——不会造成任何破坏性变更)
在现有重写规则之前添加:
# Block PHP execution in storage/upload directories
RewriteRule ^storage/.*\.php$ - [F,L]
RewriteRule ^uploads/.*\.php$ - [F,L]
RewriteRule ^images/.*\.php$ - [F,L]
在 </IfModule> 之后添加:
# Security Headers
<IfModule mod_headers.c>
Header set X-Content-Type-Options "nosniff"
Header set X-Frame-Options "SAMEORIGIN"
Header set X-XSS-Protection "1; mode=block"
</IfModule>
# Block access to sensitive files
<FilesMatch "\.(env|log|sql|bak|conf|ini)$">
Order Deny,Allow
Deny from all
</FilesMatch>
修复 3:生成 nginx 安全配置(安全——需要手动 include)
创建 nginx-security.conf:
location ~ ^/storage/.*\.php$ { deny all; return 403; }
location ~ /\.(env|git|htaccess|htpasswd) { deny all; return 404; }
location ~* \.(sql|bak|log|conf|ini)$ { deny all; return 404; }
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
修复 4:易受攻击的软件包缓解措施(检查是否存在破坏性变更)
对于存在破坏性变更的软件包(例如 intervention/image v2 → v3):
- 将软件包从
vendor/复制到packages/<vendor>/<package>/ - 在
composer.json中添加路径仓库:
{
"repositories": [{
"type": "path",
"url": "packages/<vendor>/<package>",
"options": { "symlink": true }
}]
}
- 这样可以在本地修补漏洞,而不引入 API 变更
报告格式
按以下格式呈现发现的问题:
## Security Audit Report - [Project Name]
### CRITICAL
- [Findings that need immediate action]
### HIGH
- [Findings that should be fixed soon]
### MEDIUM
- [Findings to address in next sprint]
### LOW
- [Recommendations for improvement]
### AUTO-FIXED
- [List of hardening applied]
### ACTION ITEMS
1. [ ] Rotate all credentials in .env
2. [ ] Kill any running miner processes
3. [ ] Review sudoers configuration
4. [ ] Deploy .htaccess changes to production
5. [ ] Monitor access logs for 48 hours
常见攻击链参考
根据真实事件,典型攻击流程如下:
1. ENTRY: Path traversal via vulnerable package (e.g., intervention/image v2)
→ Upload PHP webshell to storage/public directory
2. EXECUTION: Web server executes uploaded .php file
→ Because no .htaccess blocks PHP in storage dirs
3. DATA THEFT: Webshell reads .env file
→ Gets DB credentials, API keys (SendGrid, AWS, Stripe, etc.)
4. LATERAL MOVEMENT: Read .env from other projects on same server
→ Shared server = all projects compromised
5. PERSISTENCE: Install crypto miner + cron job
→ guard.sh / wp-admin.php pattern: download xmrig, auto-restart
6. ABUSE: Use stolen API keys
→ Send phishing emails via SendGrid
→ Access cloud resources via AWS keys
重要说明
- 切勿输出实际凭据值,只说明存在哪些类型
- 应用可能导致重大变更的修复前,务必先询问
- 加固存储目录的 .htaccess 和 public 目录的 .htaccess 始终可以安全应用
- 如有疑问,请报告并交由用户决定
- 此技能仅用于防御性安全