首页 > 编程语言 >DolphinPHP1.5.1版本的RCE

DolphinPHP1.5.1版本的RCE

时间:2024-07-25 10:28:51浏览次数:17  
标签:log 可控 DolphinPHP1.5 param 参数 value 版本 action RCE

侵权声明

本文章中的所有内容(包括但不限于文字、图像和其他媒体)仅供教育和参考目的。如果在本文章中使用了任何受版权保护的材料,我们满怀敬意地承认该内容的版权归原作者所有。

如果您是版权持有人,并且认为您的作品被侵犯,请通过以下方式与我们联系: [[email protected]]。我们将在确认后的合理时间内采取适当措施,包括删除相关内容。

感谢您的理解与支持。

漏洞原理:

call_user_func(代码执行,系统命令)实现rce

漏洞成因:

用seay工具自动审计得出一个命令执行点。

image

判断参数param[1]和参数log[$param[0]]是否可控。

首先走读param[1]参数

由代码可知流程:
param数组从value通过分割'|'得来,而value是从match二维数组中得来的。

foreach ($match[1] as $value)
$param = explode('|', $value);

match数组通过action_info['log']获取,其中正则/\[(\S+?)\]/匹配包含在方括号中的任何非空白字符序列,整合给match。

preg_match_all('/\[(\S+?)\]/', $action_info['log'], $match)

action_info是通过sql表查询得来的,其中module和action是可控的。

$action_info = model('admin/action')->where('module', $module)->getByName($action);

image

通过查询可以得出'admin/action'所指向的数据库名为admin_action

image

通过sql_front或其他数据库工具,可以找到该数据表,发现其字段名有一个是module还有一个是name。此时就对应上来两个可控参数。
image

通过和后台的对比发现,系统中的行为管理和该数据表内容相同。

image

点开数据表中的log再点击后台的编辑,此时就可以发现param[1]参数是可控的。

image

因为从前面可知param数组是从value通过分割'|'得来,而value又是通过log过滤空格得来的。
所以可以得出如上图所示:
如果log=[user|get_nickname] 编辑了用户:[details]
得出value=user|get_nickname
param[0] = user
param[1] = get_nickname

走读参数log[$param[0]]

参数二是有两部分组成。

image

在log数组中有两个参数是可控的

image

因为第一个可控参数需要用于查询数据库,所以我们可以利用第二个可控参数。
由此可得如果需要得到第二个可控参数通过代码$log[$param[0]]可以看出param[0]需要等于details
通过查看有61处调用了该函数,随机选择一个跟进。

image

跟进方法可以发现可控参数details是data数组中name参数的值,而data数组内容又是通过post方法获取的。

image

结合前面分析可以得出:
call_user_func()中的参数一是从log以"|"分割的右边参数获取,而参数二是从post请求中的name参数获取的,但是有个前提是log以"|"分割的左边参数需要等于details。

最后有个绕过

因为1.5.0以及修复该漏洞了,现在有绕过手法。

image

更进is_disable_func()方法,发现还是没有被过滤的执行函数。

image

于是想到了debug调试,发现了那些被过滤的执行函数。

image

发现熟知的可执行命令的函数都被过滤在外了,但是发现验证返回的函数是in_array()于是想着绕过该函数,又想到ctf题中有一种绕过手法即在命令前加一个"\"可以成功绕过判断并且可以正常执行

复现

1、在系统 —> 行为管理然后搜索role_add再点击编辑

image

2、修改日志规则为[details|\system] 添加了角色:[details]之后提交保存。

image

3、选择用户 -> 角色管理 -> 新增

image

4、角色名称填写dir或其他系统命令,点击确定前需要用bp抓包,以便下一条命令执行。

image

这只是一个功能点的漏洞复现其他调用该函数的功能都能实现rce的,我还试过role_edit也是差不多的。

总结

第一次复现java漏洞我感觉难度还是比较高的。
又学习到了一个危险函数call_user_func()

感谢两位大佬的帖子,学到了很多。
https://xz.aliyun.com/t/14379?time__1311=GqAxuD9DgD00i%3DD%2F7riQGkDR0itbKxn0bD
https://xz.aliyun.com/t/14810?time__1311=GqA2kGkGCD%2FD78G7bDOzDkzR3AKor2mD
免责声明

本博客所提供的技术知识和信息仅旨在教育和分享网络安全最佳实践,促进网络安全意识的提升。作者严禁将这些技术和信息用于任何非法或不道德的目的。

使用本博客内容而导致的任何违法行为或后果,作者不承担任何法律责任。所有读者在使用本博客的信息时,应自行承担风险,并确保遵守当地法律法规。

我们鼓励所有读者合法地使用所提供的信息和技术,致力于维护安全和负责任的网络环境。

感谢您的理解与支持。

标签:log,可控,DolphinPHP1.5,param,参数,value,版本,action,RCE
From: https://www.cnblogs.com/0kooo-yz/p/18322462

相关文章

  • Jupyter Notebook 环境中的 Python 版本不匹配
    我遇到Jupyter笔记本启动横幅中报告的Python版本与我在笔记本中查询python--version时显示的版本之间的差异。启动横幅指示Python3.11.9,但是当我运行!python--version时,它返回Python3.11.7。我所做的步骤:basecondahas3.11.7versio......
  • Enhancing Diffusion Models with Reinforcement Learning
    EnhancingDiffusionModelswithReinforcementLearningSep27,2023 | UncategorizedTL;DRTodaywe'regoingtotellyouallabout DRLX -ourlibraryforDiffusionReinforcementLearning!Releasedafewweeksago,DRLXisalibraryforscalabledist......
  • Codeforces Round 961 (Div. 2)
    A.Diagonals----------------------------题解----------------------------------注意读题,题目中只有i+j相同的格子才是一个对角线,也就是说,(1,1)(2,2)(3,3)的那条大斜线不是个对角线,如图所示这是一个3*3的图中所有的对角线,那么我们只需要如图所示,从中间往两边依次放就可以,......
  • 软件版本号为什么那么奇怪?
    语义版本管理提供了一种清晰、结构化的软件版本管理方法,让开发人员更容易了解变更的影响并管理依赖关系。通过遵循SemVer规则,开发人员可以确保其软件以可预测的方式稳定发展。软件版本号意味着什么?语义版本管理(SemVer)是一种软件版本管理方案,旨在传达版本中基本变更的含义。......
  • centos 更新curl版本
    HowtoBuildandInstallLatestcURLVersiononCentOS#WrittenbyTheSuhu(2021).#TestedonCentOS7andCentOS8PreviouslyI'vewrittenabout HowtoBuildandInstallLatestcURLVersiononUbuntu.Inthisarticleinthisarticleexplainho......
  • Centos7下安装配置最新版本Jenkins(2.452.3)
    1、基础环境配置1.1服务器下载Jenkins安装包下载地址:https://www.jenkins.io/download/下载命令:wgethttps://get.jenkins.io/war-stable/2.452.3/jenkins.war1.2服务器安装配置JDKJenkins是基于Java语言开发的,因此需要Java运行环境支持。安装JDK前一定要看下当前要......
  • codeforces div_2 961 题解报告
    codeforcesdiv_2961题解报告比赛链接:https://codeforces.com/contest/1995A.Diagonals题目翻译给定一个边长为\(n\)的正方形,给定\(k\),要往正方形选\(k\)个点,\(x+y\)相同的点构成对角线,问至少要几条对角线才能装下\(k\)个点。时限1s,空间限制256MB\(1\len\le100,0\l......
  • Codeforces Round 961 (Div. 2)
    A.JoeyTakesMoney--------------------------题解------------------------------------选取x和y替换掉a[i],a[j],前提是两者乘积相同,最后要求和数组最大,其实很简单,我们只需要不对另x=1y=a[j]*a[x]就行,从左到右遍历整个数组队a[i]和a[i+1]进行此操作,就可以得到我们想要的值......
  • 如何使用 Python 脚本从客户账单电子邮件中获取订单 ID - WooCommerce API
    我想创建一个python脚本,返回只知道客户的账单电子邮件的订单。我尝试这样做,但返回所有最近的订单:fromwoocommerceimportAPIwcapi=API(url="https://siteexample.com",consumer_key="ck_xxx",consumer_secret="cs_xxx",version="wc/v3")......
  • Codeforces Round 961 (Div. 2)
    题目链接:CodeforcesRound961(Div.2)总结:B1wa两发可惜,C出得有点小慢。A.Diagonalsfag:贪心Description:给定一个\(n*n\)的棋盘,给定\(k\)个棋子,每个格子只能放一个棋子,求将棋子全部放入棋盘,至少需要占几条对角线。Solution:求最少占用,显然贪心处理,从最长的对角线开始占用,对......