信呼oa2.6.7后台注入!!!

漏洞描述:

信呼oa最新版本在uploadAction处存在sql注入

环境搭建:

源码下载:https://xinhu-1251238447.file.myqcloud.com/file/xinhu_utf8_v2.6.7.zip
然后解码后放到phpstudy里面新建网站即可

路由分析看我之前的文章:https://www.cnblogs.com/Zephyr07/articles/18792069

漏洞原理:

首先打开看一下uploadAction文件看一下,问题出在getmfilvAction函数处

分析一下函数,在这个函数中我们可以看到有两个参数是可以控制的fileid,$fname两个参数,而fileid进行了int转换,很难存在sql注入,所以注入点就放在了fname参数上,这里我们观察到fname是base64解码后的内容,这样就有可能绕过sql过滤
获取文件 ID 并检查文件记录是否存在

● 从请求参数中获取 fileid,并将其转换为整数类型
● 调用 m('file')->getone($fileid) 方法根据文件 ID 从数据库中获取文件的详细记录
● 如果文件记录不存在,则调用 returnerror 函数返回错误信息
确定文件路径

● 首先尝试获取 filepathout 作为文件路径
● 如果 filepathout 为空,则使用 filepath 作为文件路径
● 检查文件路径是否为 HTTP 链接,如果不是,则检查文件是否存在。如果文件不存在,则调用 returnerror 函数返回错误信息
获取文件扩展名并处理文件名

生成新的文件路径并复制文件内容,使用 file_get_contents 函数读取原文件的内容,并调用 $this->rock->createtxt 方法将内容写入新文件

准备插入数据库的数据

插入数据到数据库并返回结果,问题函数出在insert上

跟进去看一下insert函数,对传入的参数进行record方法的校验,若不为false,那么就获取到其id值

跟进去record方法

这里发现跟不进去这个record方法,所以全局搜索一下

此函数依据 $where 参数是否为空来判断执行插入操作还是更新操作。若 $where 为空,就执行插入操作;若 $where 不为空,则执行更新操作,而前面where是空的,所以遍历array数组并放到cont变量中,然后直接放到sql语句

然后跟到tranbegin中发现没有在对sql进行任何过滤,直接query

tips:

其实在传参的时候是对参数内容进行过过滤,我们跟到get函数中去

然后再全局搜索get

但是我们看这个函数似乎并没有过滤,那是因为在rockClass.php文件中有个构造函数,当实例化该类的时候就会调用该方法,而在这个构造函数中就有了过滤

漏洞复现:

登录之后直接上payload

payload:
api.php?a=getmfilv&m=upload|api&d=task&fileid=1&fname=MScgYW5kIHNsZWVwKDMpIw==

成功延时

posted @ 2025-03-25 22:33  Zephyr07  阅读(79)  评论(0)    收藏  举报