从一道CTF网站取证题出发,聊聊PHP源码审计和数据库安全那些事儿
2026/5/14 21:02:43 网站建设 项目流程

从虚拟币商城漏洞挖掘看PHP安全审计实战

某次渗透测试中,我遇到一个采用ThinkPHP框架开发的虚拟货币交易平台。在常规扫描无果后,手动审计发现了藏在/runtime/temp目录下的后门文件。这个经历让我意识到,真正的安全威胁往往藏在开发者从未预料到的地方。本文将还原从文件取证到数据库入侵的完整攻击链,分享PHP代码审计的核心方法论。

1. 恶意文件定位的三大黄金法则

1.1 异常时间戳追踪术

通过find命令快速筛选近期修改文件:

find . -type f -mtime -3 -name "*.php" | xargs ls -lt

关键指标包括:

  • 非开发时段的修改时间(如凌晨2点)
  • 与框架版本不符的创建时间
  • 文件权限异常设置为777

我曾发现攻击者将木马伪装成logo_update.php,其修改时间比同目录文件晚6个月,这个时间差直接暴露了入侵痕迹。

1.2 高危函数特征扫描

使用grep批量检测危险函数:

grep -rn "eval(\|system(\|shell_exec(" ./app

需重点关注的函数黑名单:

风险等级函数类型典型示例
致命代码执行eval, assert
高危命令执行system, passthru
中危文件操作file_put_contents

1.3 非常规位置排查

攻击者偏爱的藏身之处:

  • 日志目录(/runtime/log
  • 缓存文件(/cache/*.php
  • 上传临时目录
  • 图片资源文件夹

提示:攻击者常利用.user.ini进行持久化控制,检查是否存在auto_prepend_file配置

2. 数据库安全审计实战

2.1 连接字符串加密逆向

在某次审计中遇到如下加密配置:

'db_password' => 'U2FsdGVkX18zM7JjX1+qbNQyz3xKwL0Jj7Vj/vJYy3M='

通过追踪框架的配置加载流程,在thinkphp/library/think/Db.php中发现使用AES-256-CBC解密。使用开源工具php-encryption-decryption成功还原出原始密码。

2.2 SQL注入深度检测

不要依赖简单的$_GET过滤,而应该检查:

  • 预处理语句是否真正使用
  • 模型操作是否暴露给前端
  • 复杂查询中的拼接风险

测试用例:

// 危险写法 Db::query("SELECT * FROM user WHERE id=".$_GET['id']); // 安全写法 Db::table('user')->where('id', input('id'))->select();

2.3 敏感数据泄露防护

发现某商城在订单查询接口直接返回完整用户对象:

{ "order_id": 1001, "user": { "password": "e10adc3949ba59abbe56e057f20f883e", "salt": "x7d9", "api_key": "sk_live_xxxx" } }

正确的做法应该是:

  • 实现DTO层过滤敏感字段
  • 使用hidden属性定义保护字段
  • 对金融类接口强制二次验证

3. 业务逻辑漏洞挖掘

3.1 虚拟货币交易漏洞

审计某平台发现充值逻辑缺陷:

// 错误:直接接受前端传入的充值金额 $amount = $_POST['amount']; $user->balance += $amount; // 正确:使用预定义面额 $denominations = [100,500,1000]; if(in_array($amount, $denominations)){ $user->balance += $amount; }

3.2 并发竞争条件检测

使用ab测试发现余额校验缺陷:

ab -n 100 -c 10 http://example.com/withdraw?amount=100

防御方案:

// 使用悲观锁 Db::startTrans(); $user = Db::lock(true)->find($id); if($user->balance >= $amount){ // 扣款操作 } Db::commit();

4. 安全加固方案设计

4.1 文件监控体系

实现实时监控脚本:

$hashes = []; foreach (glob('app/*.php') as $file) { $hashes[$file] = md5_file($file); } // 定时比对哈希值变化

4.2 数据库防护策略

推荐配置:

  1. 使用专用数据库账号,限制CRUD权限
  2. 敏感表单独加密存储
  3. 开启SQL审计日志
  4. 限制最大连接数

4.3 安全开发规范

强制代码审查要点:

  • 所有输入参数必须过滤
  • 禁用extractparse_str等危险函数
  • 错误信息不得暴露路径
  • 会话ID必须定期刷新

在一次内部红蓝对抗中,我们通过模拟攻击者思维,在用户头像上传功能处发现未过滤的SVG文件上传漏洞,最终实现了XSS到管理员Cookie的窃取。这提醒我们,安全是持续的过程,需要将审计意识融入开发全生命周期。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询