Snuffleupagus(PHP安全防护扩展)完整部署教程

前言

Snuffleupagus是一款针对针对PHP 7和PHP 8+的安全模块,可以帮助广大研究人员通过封杀存在安全漏洞的整个类来大幅提高对网站的攻击成本。除此之外,它还提供了一个强大的虚拟补丁系统,允许管理员修复特定的漏洞以及审计可疑行为,而不必接触PHP代码。

功能介绍

无显著性能影响;

轻松编写虚拟补丁规则;

封杀存在漏洞的类:基于未序列化的代码执行、基于邮件的代码执行、Cookie窃取型XSS、基于文件上传的代码执行、弱伪随机数、XXE;

多种安全强化功能:自动设置secure和samesite等cookie标记、绑定多种规则来检测后渗透行为、全局限制模式和类型判断预防、流封装器白名单、预防可写文件执行、eval白名单/黑名单、使用curl时强制执行TLS证书验证等;

相对健全的代码库:复杂的测试用例接近100%覆盖率、clang-format代码风格、完整的参考文档;

图片[1]-Snuffleupagus 完整配置教程,PHP 底层安全加固方案Snuffleupagus 配置规则,防御一句话木马与提权攻击

一、前置依赖安装(编译必备,执行一次即可)

CentOS / Rocky / AlmaLinux 系统

yum install -y gcc gcc-c++ make autoconf libtool zlib-devel openssl-devel pcre-devel git wget

Ubuntu / Debian 系统

apt update && apt install -y gcc g++ make autoconf libtool zlib1g-dev libssl-dev libpcre3-dev git wget

二、PHP8.2 一键编译安装 Snuffleupagus

第一行修改为你的php版本 PHP_VER=82 && \

PHP_VER=82 && \
cd /usr/local/src && \
rm -rf snuffleupagus && \
git clone https://github.com/jvoisin/snuffleupagus.git && \
cd snuffleupagus/src && \
PHP_BIN=/www/server/php/${PHP_VER}/bin && \
${PHP_BIN}/phpize && \
./configure --enable-snuffleupagus --with-php-config=${PHP_BIN}/php-config && \
make -j$(nproc) && make install && \
SP_CONF=/www/server/php/${PHP_VER}/etc/snuffleupagus.rules && \
INI_FILE=/www/server/php/${PHP_VER}/etc/php.ini && \
cat > ${SP_CONF} <<'EOF'
# 日志输出配置
sp.log_media("file:/www/log/snuffleupagus.log");
# 禁用高危执行函数
disable_function: eval,assert,passthru,exec,system,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,proc_terminate,proc_get_status
# 禁止篡改关键ini变量
disable_ini_override: allow_url_include,auto_prepend_file,auto_append_file,open_basedir
# 防御文件包含漏洞
prevent_file_inclusion = true
# 防御反序列化注入
prevent_php_object_injection = true
# 禁止远程文件读取
prevent_url_open = true
# 限制请求变量数量防DOS
max_get_vars = 200
max_post_vars = 200
max_cookie_vars = 100
# 限制上传数量
max_upload_count = 10
EOF
# 避免重复写入扩展配置
grep -q "snuffleupagus.so" ${INI_FILE} || cat >> ${INI_FILE} <<EOF
extension=snuffleupagus.so
sp.configuration_file=${SP_CONF}
EOF
# 解决JIT底层冲突,关闭OPcache JIT
sed -i 's/opcache.jit=1205/opcache.jit=0/g' ${INI_FILE}
sed -i 's/^opcache.jit_buffer_size=/#opcache.jit_buffer_size=/g' ${INI_FILE}
# 重启PHP-FPM生效
/etc/init.d/php-fpm-${PHP_VER} restart && \
echo -e "\033[32m========== Snuffleupagus 安装配置完成 ==========\033[0m"

三、验证扩展是否安装成功

1. 快速检测扩展加载状态

/www/server/php/82/bin/php -m | grep snuffleupagus

正常输出结果:单独一行 snuffleupagus即代表加载正常

2. 查看扩展完整详情(版本、规则路径、运行参数)

/www/server/php/82/bin/php --ri snuffleupagus

四、拦截日志配置与实时查看

1. 提前创建日志目录 + 空日志文件

mkdir -p /www/log
touch /www/log/snuffleupagus.log
chmod 644 /www/log/snuffleupagus.log

2. 实时监控拦截日志

tail -f /www/log/snuffleupagus.log

3. 测试拦截效果(主动触发 eval 拦截,生成日志)

# 创建测试恶意脚本
echo '<?php eval("phpinfo();"); ?>' > /www/wwwroot/test-hack.php

4.浏览器访问 你的域名/test-hack.php,扩展自动拦截危险代码,日志产生拦截记录;测试完成删除测试文件:

rm -f /www/wwwroot/test-hack.php

五、卸载脚本(不需要防护时完整清理)

PHP_VER=82
sed -i '/snuffleupagus/d' /www/server/php/${PHP_VER}/etc/php.ini
rm -f /www/server/php/${PHP_VER}/etc/snuffleupagus.rules
/etc/init.d/php-fpm-${PHP_VER} restart
rm -rf /usr/local/src/snuffleupagus
rm -rf /www/log/snuffleupagus.log
echo "Snuffleupagus 卸载完成"

六、补充:简易 Web 查看拦截日志

在网站根目录新建 sp-log-view.php,浏览器访问即可网页查看拦截日志(建议设置访问密码,防止泄露)

<?php
// 简单访问密码,自行修改
$pass = "123456";
if (!isset($_GET['pwd']) || $_GET['pwd'] !== $pass) {
    exit("访问错误,请携带正确密码访问:?pwd=你的密码");
}
$logFile = '/www/log/snuffleupagus.log';
if (!file_exists($logFile)) exit("暂无拦截日志");
$lines = file($logFile);
$lines = array_reverse($lines);
echo '<!DOCTYPE html>
<style>pre{font-size:13px;line-height:1.6;background:#1a1a1a;color:#0f0;padding:20px;white-space:pre-wrap;word-break:break-all;}</style>
<pre>';
foreach ($lines as $line){
    echo htmlspecialchars($line).PHP_EOL.'------------------------------------------'.PHP_EOL;
}
echo '</pre>';
?>

访问示例:域名/sp-log-view.php?pwd=123456

查看你的完整规则命令:

cat /www/server/php/82/etc/snuffleupagus.rules
© 版权声明
THE END
点赞219赞赏 分享