Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >实战|记一次前台getshell组合拳审计的完整过程

实战|记一次前台getshell组合拳审计的完整过程

作者头像
亿人安全
发布于 2023-12-28 07:30:47
发布于 2023-12-28 07:30:47
29800
代码可运行
举报
文章被收录于专栏:红蓝对抗红蓝对抗
运行总次数:0
代码可运行

免责声明

由于传播、利用本公众号亿人安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号亿人安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!

朋友们现在只对常读和星标的公众号才展示大图推送,建议大家把“亿人安全设为星标”,否则可能就看不到了啦

本文内容仅限学习所用,请不要利用文中消息进行危害性测试。为保护此源码使用者的安全,本文中的源码系统名将做打码处理。 初学者学习中的小小收获,各位大佬轻喷。 1 整体审计 拿到源码,先做...

本文内容仅限学习所用,请不要利用文中消息进行危害性测试。为保护此源码使用者的安全,本文中的源码系统名将做打码处理。

初学者学习中的小小收获,各位大佬轻喷。

1 整体审计

拿到源码,先做一次整体审计,看一看整个代码的处理逻辑、是否有过滤控制器、是否有权限校验控制器等。

先看目录:

很明显有控制器,是模仿MVC形式的CMS。

1.1 权限控制

一共有两个入口index.php admin/index.php (感觉这样写的CMS很常见)。

查看两个文件,发现它们没有什么不同之处,定义了ROOT,然后进入APP:run()。除了admin文件夹下的index文件中定义了一个常量ADMINDIR。

跟进APP:run(),这里是整个CMS的核心。

很常见的路径转方法(伪静态?),如/index.php/[controller]/[action]/[arag1]/[arg2]。但由于其控制器分别在controllers和admin/controllers下,而访问控制脚本的函数使用的是不可控变量,所以不能通过普通控制器入口访问管理员的控制器。

这里还存在一个问题:它引入的时候貌似没有校验权限,是否普通用户可以越权调用admin的controller?

后面看了一下,其中一个类的构造函数处会进行鉴权。那就是看哪些控制器的构造函数没有鉴权 就能造成绕过。总而言之鉴权的地方不是统一的。

又看了一眼 发现是控制器的父类。那就是哪个父类不是这个(这样写的话可能性就会小很多)。后面看了一眼这个类包括了大部分后台HTML元素,那理论上所有控制器(除了API控制器)都会走这个类。

后面又发现,SAdmin虽然会检测session,但在session无效的时候并不会拦截,而只是会在session有效的情况下给SAdmin->data赋值。也就是说,具体的权限校验还是要在函数中实现。这给越权提供了空间。

然后发现后面校验权限是按照类似“校验权限字符是否在权限字符串中”的途径。

通过CheckAccess、CheckAction实现(这两个校验过程相同):

同时,admin的data只赋值一次:

除了改数据库之外没办法混淆鉴权了。(也就是说,如果存在注入,有造成后台管理员登陆的可能)

1.2 过滤控制

进一步查看控制器文件夹,查看是否有负责整体过滤参数的控制器(SQL、XSS、文件上传等的过滤文件)。

这里的过滤文件为functions.globals.php。不过这里的过滤函数都不是主动调用的(有些CMS会包括此文件 然后此文件中会先一步处理所有参数,这里完全就是写了函数等待调用)

过滤函数这边先实体编码然后加斜杠,应该是绕不了。

引用过滤函数的则是这三个,如果其他地方都是由此处获取请求参数,那就无法造成SQL注入。

当然,在HTTP交互中会被后端接受的参数远不止GET、POST和Cookie(这里是大多数CMS的误区,又不喜欢过滤其他头又喜欢用其他头)。如果其他的头也会在交互中被获取并且没有经过这三个函数,或者某处的GET、POST参数没有经过这些过滤,即可造成注入。

2 审计漏洞列表

2.1 后台文件上传(可shell)

目录穿越的后台模版文件上传造成的getshell 完全没有过滤相对路径+需要造成的模版文件后缀白名单造成的getshell(本来这个目录穿越还有点意义,结果我发现它根本没有限制入口为根目录文件夹- -,白穿越了)

2.2 后台注入(很鸡肋)

后台数据库管理中的功能。由于被输入的参数使用反引号包裹,而此CMS的过滤函数本身不过滤反引号,所以造成注入。 POC为http://localhost/admin/index.php/database/operate?dbaction=emptytable&tablename=hong\_acat`+where+cat_id=2+and+sleep(2);--%20)# 注入形式如下,用#号作为注释符即可。实际上,全database.php都存在这个漏洞(只要带有`$database`)

2.3 后台目录穿越

大家都爱的没用垃圾洞,甚至不需要后台代码。

3 柳暗花明的前台注入

找了这么多后台的洞,总而言之还是没什么用的。毕竟对于小CMS而言我们都希望使用前台漏洞,高效快速还不用苦苦猜一个管理员口令。于是我开始找前台漏洞。越权我们之前已经看过了是越不了的,RCE没有条件,信息泄露也没有条件,上传在前台已经测试过了没有绕过可能。那么能找的高危漏洞只剩下注入一个了。

在第一节中我们已经找到了CMS的过滤函数并且确定了此过滤无法绕过。现在需要找到的就是那些没有被过滤函数保护且会涉及数据库查询的参数。

接下来则是无聊的看参数时间,由于此CMS没有统一过滤,可以直接在控制器的action函数中查看输入参数是否经过过滤函数。

3.1 代码分析

终于,在注册的地方找到了一个不经过过滤函数的参数:

这个GetIP()是没有经过过滤函数的。虽然大多数CMS中这个IP是不可控的,但笔者属于不是很信邪的那一款。于是跟进GetIP函数:

这里写成了:先去X-FORWARDED-FOR、CLIENT-IP或者getenv('REMOTE_ADDR')(这个不可控是环境变量)取IP,如果这个IP不符合格式就返回gethostbyname($_SERVER['HTTP_HOST']),否则是正则表达式过滤之后的IP。问题就在于gethostbyname()并不能取到过滤的作用,于是我们就能将任意字符插入查询参数中,造成注入。

造成注入的条件则是: 1.存在X-FORWARDED-FOR或CLIENT-IP,且其值不为IP形式 2.HOST置为payload

以此格式传入包,果然触发了数据库报错:

3.2 使用注入进入后台

此查询语句的原貌是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"INSERT INTO " . TABLE_PREFIX . "user (groupid, activated, username, password, verifycode, joindate, joinip, lang, nickname, email) VALUES ($groupid, $activated, '$username', '".md5($password)."', '$verifycode', '".time()."', '".GetIP()."', $lang, '$nickname', '$email')"

这里的groupid就是鉴权的ID(用户组ID)。由于这里就是注册点,这个注入可以被改造成这个形式,从而在注册时另外创建一个管理员账号,以此进入后台:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO ***_user (groupid, activated, username, password, verifycode, joindate, joinip, lang, nickname, email) VALUES (2, -1, '111111111', '593c9b4a9390551d53e5cacf28ebd638', '96fbTjrp', '1697167889', '', 1, '111111111', '222@222.22');INSERT INTO ***_session (sessionid, userid, ipaddress, useragent, created, admin) VALUES ('aaa','1','','','','1')#', 1, '111111111', '222@222.22')

后面插入的帐号即为管理员账号。则POC为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
', 1, '123', '222@222.22'),(1, 1, '111111111', '593c9b4a9390551d53e5cacf28ebd638', '96fbTjrp', '1697167889', '', 1, '111111111', '222@222.22')#

这将额外添加一个用户名为111111111密码为111111111111的帐号。

使用此账密登陆,成功:

然后利用之前提到的后台文件上传漏洞,就能够getshell愉快玩耍啦~

原文链接:https://forum.butian.net/share/2399

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 亿人安全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
记一次审计 xiaocms 的过程
周末在家刚吃完晚饭,基友 DM 叫我一起来审计 xiaocms 系统,也不知道他是受到啥刺激了。正好,除了 Code Review 公司项目代码及框架代码,未审计过其他系统,就当拿来练手了。
信安之路
2018/08/08
3K0
记一次审计 xiaocms 的过程
小众CMS vaeThink v1.0.1 代码执行漏洞挖掘分析
本文是对一个小众CMS(vaeThink v1.0.1)进行分析、代码执行漏洞挖掘和审计过程的记录,该CMS基于ThinkPHP5开发。作为一名代码审计的入门菜鸟,也希望能够将实践和学习的过程记录和分享,以期能够与大家共同交流进步。
FB客服
2019/05/29
1.3K0
实战 | 记一次CTF题引发的0day挖掘
最近主要在学JAVA,不过PHP审计相关的技能也不能生疏了,于是打算去找点代码来审审,在CTFSHOW上找到了一款源码,而且目前也没有WP
HACK学习
2023/01/03
9180
实战 | 记一次CTF题引发的0day挖掘
记一次代码审计的APP渗透
上面这个图是我本地的,远程的访问比较慢就不截图了。没有做UA头检测等,它本身就是移动端和PC端都可以访问的一种cms。
HACK学习
2021/04/26
2.4K0
记一次代码审计的APP渗透
实战技巧 | 知其代码方可审计
终于来到了代码审计篇章。希望看了朋友有所收获,我们通常把代码审计分为黑盒和白盒,我们一般结合起来用。
辞令
2020/09/17
1.7K0
实战技巧 | 知其代码方可审计
XDCTF2015代码审计全解
WEB2是一个大题,一共4个flag,分别代表:获取源码、拿下前台管理、拿下后台、getshell。
phith0n
2020/10/15
1.7K0
代码审计之Fiyo CMS案例分享
*本文原创作者:Mochazz,本文属FreeBuf原创奖励计划,未经许可禁止转载
FB客服
2018/07/30
8320
代码审计之Fiyo CMS案例分享
通过 BlueCMS 学习 php 代码审计
最近一直在学习php代码审计,入门过程比自己想象的慢很多,现在各个行业都在内卷,代码审计随着 web 开发技术的发展也会变得更加复杂。但不管现在技术多成熟,多复杂,基础知识一定要扎实。先记录下我目前学习php代码审计的过程:
FB客服
2021/09/16
1.9K0
代码审计:BlueCMS v1.6
发现公众号上好像没什么代码审计的文章,于是便把之前自己的笔记拿过来给大家分享一下,这个cms基本已经被玩烂了,但是还是有一些学习意义的。
鸿鹄实验室
2021/04/01
2K0
代码审计:BlueCMS v1.6
PHP代码审计
代码审计顾名思义就是检查源代码中的缺点和错误信息,分析并找到这些问题引发的安全漏洞,并提供代码修订措施和建议。PHP代码审计审计套路通读全文法 (麻烦,但是最全面)敏感函数参数回溯法 (最高效,最常用)定向功能分析法 (根据程序的业务逻辑来审计)初始安装信息泄露文件上传文件管理登录认证数据库备份恢复找回密码验证码越权注入第三方组件CSRF,SSRF,XSS......审计方法1.获取源码2.本地搭建调试可先使用扫描器识别常见传统漏洞,验证扫描器结果,手动正则3.把握大局对网站结
企鹅号小编
2018/02/24
4.2K0
PHP代码审计
CVE-2018-14421 Seacms 后台getshell分析
最近看到关注的博客里面,有一篇师傅拿cve的文章,是有关于海洋cms的后台getshell,只给出了exp,但是并没有详细的分析流程,好奇心的驱使下,开始了对这个cve的跟踪分析。
安恒网络空间安全讲武堂
2018/08/17
1.3K0
CVE-2018-14421 Seacms 后台getshell分析
一名代码审计新手的实战经历与感悟
blueCMS介绍 个人认为,作为一个要入门代码审计的人,审计流程应该从简单到困难,逐步提升。因此我建议大家的审计流程为——DVWA——blueCMS——其他小众CMS——框架。同时做总结,搞清楚漏洞原理。好,进入正文! blueCMS是一款小众的CMS,在2012年左右的时候,就有人发布其相关漏洞。但是,我个人感觉用blueCMS进行新手实战代码审计入门,是一个非常不错的选择。而我在进行blueCMS审计之前,网上也搜索了blueCMS的审计文章。那些文章可能都是你转过来,我转过去的,一般都是文章中只提到
FB客服
2018/04/17
1.2K0
一名代码审计新手的实战经历与感悟
PHP代码审计-zzcms
通过全局搜索,发现 xml_unserialize() 对 parse() 函数进行了调用
亿人安全
2023/10/24
5600
PHP代码审计-zzcms
记一次对wuzhicms的审计
文章首发于奇安信社区:https://forum.butian.net/share/1126
亿人安全
2022/06/30
6010
记一次对wuzhicms的审计
记一次开源OA组合拳RCE漏洞审计过程
某开源OA存在前台SQL注入和后台RCE漏洞,可以用SQL注入跑出来后台账号密码,登录后打后台RCE,组合拳达到前台RCE的效果。
亿人安全
2025/03/20
2330
记一次开源OA组合拳RCE漏洞审计过程
PHP代码审计 | 记一次CMS代码审计
访问url: http://127.0.0.1/uqcms/index.php/admin/ad/save
HACK学习
2019/10/14
2.4K0
PHP代码审计 | 记一次CMS代码审计
KKcms全套代码审计
KKCMS是基于PHP+MYSQL开发的开源CMS。可以直接在GitHub上下载就可以了。
字节脉搏实验室
2020/07/09
1.8K0
KKcms全套代码审计
PHP代码审计
代码审计顾名思义就是检查源代码中的缺点和错误信息,分析并找到这些问题引发的安全漏洞,并提供代码修订措施和建议。
信安之路
2018/08/08
5.1K0
PHP代码审计
熊海CMS_V1.0: 审计过程与漏洞分析
file变量通过GET请求r参数获取文件名,经过了addslashes函数。第5行通过三元运算符判断文件是否为空,为空则载入files/index.php文件。反之赋值加载files/file.php(action=file)。这里的代码逻辑限制了只能访问files目录下的php文件(对文件进行了拼接
黑白天安全
2021/03/16
2.5K0
熊海CMS_V1.0: 审计过程与漏洞分析
BlueCMS_V1.6:审计过程与漏洞分析
而在ad_js.php文件的开头(第10行)引入了过滤文件require_once dirname(__FILE__) . '/include/common.inc.php';
黑白天安全
2021/03/16
2.9K0
BlueCMS_V1.6:审计过程与漏洞分析
相关推荐
记一次审计 xiaocms 的过程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验