FUGIO:针对 PHP 对象注入漏洞的自动利用生成

FUGIO

FUGIO 是第一个针对 PHP 对象注入 (POI) 漏洞的自动利用生成 (AEG) 工具。在利用 POI 漏洞时,攻击者通过仔细选择其属性值来构造注入对象,以调用现有的类方法或函数(小工具)链,最终触发带有攻击载荷的敏感函数。构成此漏洞利用对象的技术称为面向属性的编程 (POP)。FUGIO 通过静态和动态分析,考虑到小工具的可用性及其调用者-被调用者关系,确定可行的 POP 小工具链。FUGIO 然后对每个已识别的 POP 链进行反馈驱动的模糊测试活动,从而产生漏洞利用对象。有关详细信息,请参阅我们的论文,“FUGIO:PHP 对象注入漏洞的自动利用生成”,将出现在 USENIX Security 2022 中。

项目地址

https://github.com/WSP-LAB/FUGIO

安装

FUGIO 在运行 Ubuntu 18.04 的机器上进行了测试。运行 FUGIO 需要 Python 3 和 PHP(5.4、5.6 或 7.2)。我们根据FUGIO-artifact中的 PHP 版本提供了三个 Docker 镜像。如果您使用给定的 Docker 映像,请按照准备 Docker 容器中的说明进行操作 ,然后转到第2 阶段

阶段1

  • 克隆 git 仓库

    git clone --recurse-submodules https://github.com/WSP-LAB/FUGIO.git
    cd FUGIO
    
  • 安装 Docker

    • 要安装 Docker CE,请按照此 链接中的说明进行操作。
    • 为了让我们的脚本不要求您输入 sudo 密码,我们假设您以非 root 用户身份运行 Docker 命令。请按照此链接中的说明进行操作。
  • 运行 RabbitMQ Docker

    • 您可以通过运行来设置 RabbitMQ ./run_rabbitmq.sh
      • 用户名:fugio
      • 密码:fugio_password
      • RabbitMQ 管理端口:15672
  • 安装 Python 3 pip

    sudo apt-get install -y python3-pip
    
  • 安装 PHP Composer

    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \
    php composer-setup.php && \
    php -r "unlink('composer-setup.php');" && \
    mv composer.phar /usr/local/bin/composer
    
  • 安装 PHP 库

    • PHP 5.4:我们通过编译源代码安装了 PHP 5.4
      sudo apt-get install -y autoconf apache2-dev libxml2-dev libbz2-dev \
      libcurl4-gnutls-dev libjpeg-dev libpng-dev libmcrypt-dev
      sudo ln -s /usr/include/x86_64-linux-gnu/curl /usr/local/include/
      
      wget -O /tmp/bison-2.6.tar.gz http://ftp.gnu.org/gnu/bison/bison-2.6.tar.gz
      tar -xvf /tmp/bison-2.6.tar.gz -C /tmp
      cd /tmp/bison-2.6
      ./configure --prefix=/usr/local/bison --with-libiconv-prefix=/usr/local/libiconv/
      make
      sudo make install
      sudo ln -s /usr/local/bison/bin/bison /usr/bin/bison
      
      git clone https://github.com/openssl/openssl.git /tmp/openssl
      cd /tmp/openssl
      git checkout OpenSSL_1_0_2-stable
      ./config shared
      make
      sudo make install
      
      git clone https://github.com/php/php-src.git /tmp/php-src
      cd /tmp/php-src
      git checkout PHP-5.4
      ./buildconf
      ./configure --with-mysql --with-zlib --with-gd --with-mhash --with-mcrypt \
          --with-curl --with-openssl --with-zlib --with-jpeg-dir --with-png-dir --with-gettext \
          --with-pcre-regex --with-pdo-mysql --enable-calendar --enable-exif --with-bz2 \
          --enable-ftp --enable-mbstring --enable-shmop --enable-soap --enable-bcmath \
          --enable-sockets --enable-wddx --enable-zip --with-mysqli --with-apxs2=/usr/bin/apxs2
      make
      sudo make install
      sudo cp php.ini-production /usr/local/lib/php.ini
      
    • PHP 5.6
      sudo apt-get install -y php5.6-dev php5.6-bcmath php5.6-mbstring php5.6-xml
      
    • PHP 7.2
      sudo apt-get install -y php7.2-dev php7.2-bcmath php7.2-mbstring php7.2-xml
      

阶段2

  • 安装依赖项

    • 我们提供用于安装所有依赖项和更改 PHP 设置的脚本。运行./install_XX.sh取决于 PHP 的版本。
      • PHP 5.4:./install_54.sh
      • PHP 5.6:./install_56.sh
      • PHP 7.2:./install_72.sh
  • 准备目标应用程序源代码及其运行服务

    • FUGIO-artifact中,我们提供了 30 个 PHP 应用程序,这些应用程序在我们的论文中进行了评估。如果您想使用它,请参阅 构建基准
  • 监控 POI 漏洞的设置

    • 通过运行添加.htaccess用于监控 POI 漏洞的文件./htaccess.py on。如果要停止监视,请运行htaccess.py off.

用法

  • 使用 执行 FUGIO ./run.py

    # ./run.py
    usage: run.py [-h] [--all] [--rabbitmq_ip RABBITMQ_IP]
                  [--php_ver {5,7}] [--hook_extension {uopz,runkit}] [--cpus CPUS]
                  target
    
    • rabbitmq_ip: RabbitMQ 的 IP 地址
    • php_ver:PHP的版本,选择5或7(默认5)
    • hook_extension: PHP 内置函数使用 hooks 的库,选择 uopz 或 runkit(默认 uopz)
      由于 CubeCart 等一些应用程序与 uopz 库冲突,我们也支持 runkit。
    • cpus: 分配给运行 FUGIO 的 CPU 核心数(默认所有 CPU 核心)
    • target:目标应用程序源代码的路径
    • all:如果您想考虑所有小工具而不考虑它们的可用性,则启用(默认为 false)
      Dahse 等人中。,作者假设当应用程序中至少存在一个自动加载器回调时,所有现有类都是可加载的。虽然这个假设不再有效,因为这个错误在 PHP 5.4.24 和 5.5.8 中被修补,我们添加了这个选项以便在论文中与 FUGIO 进行公平比较。

    有关更具体的示例,请参阅脚本run_FUGIO_XX.sh

    如果运行该命令,FUGIO 将开始分析目标应用程序的源代码。在第一次运行时,FUGIO 会在Files/dump_files. 这是为了在您为同一应用程序再次运行 FUGIO 时减少分析目标源代码的时间。如果目标应用程序的源代码发生更改,则需要删除其转储文件并再次运行脚本。

  • 监控 POI 漏洞 FUGIO 完成对源代码的分析后,FUGIO 开始监控 POI 漏洞。我们可以使用爬虫、蜘蛛或手动浏览来触发 POI 漏洞。在Trigger文件夹中,我们提供了用于触发我们的基准测试的 POI 漏洞的脚本;您可以在FUGIO-artifact中找到详细信息。

结果

所有输出都在Files/fuzzing/[app_path.time]/PUT/目录中生成。

  • put-head.phpput-body.php:一个 PUT 文件
  • inst_PUT.php: 用于对目标应用程序进行模糊测试的 PUT 文件
  • procX_X_X_X_X_X.chain: 已识别的 POP 链
  • PROBABLY_EXPLOITABLE:可能被利用的漏洞利用对象(有效负载)的目录
  • EXPLOITABLE: 可利用的漏洞利用对象(有效负载)的目录
请登录后发表评论

    没有回复内容