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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MODIS遥感影像数据Earthdata中批量下载
  前面我们介绍了Landsat系列卫星遥感影像数据USGS中批量下载多张图像的方法。而较之Landsat、Sentinel等遥感数据,MODIS影像数据下载略嫌麻烦,更重要的是其下载方法经常失效,下载网站的网络访问有时也不太稳定。这里介绍一种基于Earthdata的MODIS批量下载方法,但要注意:截止2021年05月,该方法也变成了只能借助可以使得我们访问外国网站的软件才可以进行下载的方法。
疯狂学习GIS
2021/07/22
2.7K0
高分GF与环境HJ系列国产卫星遥感影像免费批量下载方法
  本文介绍高分(GF)与环境(HJ)等主要国产卫星遥感数据的免费下载(包括批量下载)方法。
疯狂学习GIS
2021/07/22
5.7K0
基于LAADS DAAC的MODIS遥感影像批量下载
  本文介绍国内用户在LAADS DAAC中批量下载MODIS遥感影像各产品的方法。
疯狂学习GIS
2021/07/21
1.3K0
基于LAADS DAAC的MODIS遥感影像批量下载
批量下载Landsat与MODIS等遥感影像的最新可行方法
  本文介绍在USGS网站中,批量下载Landsat、MODIS等遥感影像数据的方法。
疯狂学习GIS
2024/07/31
8290
批量下载Landsat与MODIS等遥感影像的最新可行方法
哨兵Sentinel遥感影像下载方法
  本文介绍在Sentinel哨兵遥感影像数据官网中,下载已经经过大气校正的Sentinel-2L2A级遥感影像产品的方法。
疯狂学习GIS
2025/04/19
3850
哨兵Sentinel遥感影像下载方法
高分卫星、环境卫星、资源卫星等遥感影像下载
  本文介绍高分(GF)、资源(ZY)与环境(HJ)等主要国产卫星遥感数据的免费下载(包括批量下载)方法。本文于2025年02月更新。
疯狂学习GIS
2025/04/18
3660
高分卫星、环境卫星、资源卫星等遥感影像下载
地理空间数据云下载遥感影像
地理空间数据云,作为国内免费下载遥感卫星影像的一个大平台,随着年代发展正是蒸蒸日上。界面做得越来越美观,操作也越来越便捷。今天小编将主要介绍 “数据资源” 和 “高级检索” 两个最常用的功能。
Twcat_tree
2022/12/05
2.8K0
地理空间数据云下载遥感影像
MODIS数据的简介和下载(二)——MODIS数据下载方式(FTP)「建议收藏」
前一篇我们已经介绍了MODIS数据的简介、参数以及相关的典型应用。这一篇我们来介绍下MODIS数据的下载方式。当然这边主要是介绍国外网站的下载方式,国内网站的普遍是在地理空间数据云和遥感集市下载。国外网站(NASA官网)下载方式主要介绍两种。本篇主要针对第一种方式,基于完整的一景影像下载的过程(FTP工具)。后面一篇更新的是基于MODIS Web Service的客户端下载的方式(Matlab和R)。 FTP下载工具以及完整影像下载的方法 笔者最早也是参照网上某篇博客学习的下载方式,老规矩,文末贴链接,这里先感谢这位写博客的同学。同时NASA官网最近刚刚改版了网站,新版网站的下载方式暂时没有看到其他人整理,故稍作些整理。 NASA官方遥感影像数据下载网址(里面不止有MODIS,还有ENVISAT,NPP-VIIRS等):
全栈程序员站长
2022/09/02
6K1
MODIS数据的简介和下载(二)——MODIS数据下载方式(FTP)「建议收藏」
NASA环境数据下载
美国国家航空航天局(NASA)地球科学数据和信息系统(ESDIS)项目是戈达德太空飞行中心飞行项目管理局下属地球科学项目部的一部分。作为ESDIS的关键组成部分,由美国独立设施的分布式网络运营12个互连的分布式活动档案中心(DAAC)
Jamesjin63
2022/10/25
1.3K0
NASA环境数据下载
USGS批量下载Landsat遥感影像数据时无法下载Surface Reflectance的解决
  利用这篇博客[1]中遥感影像批量下载方法下载Landsat数据时,出现如下报错:
疯狂学习GIS
2021/07/22
9780
下载FileZilla并用其与服务器传输文件的方法
  在文章高分GF与环境HJ系列国产卫星遥感影像免费批量下载方法中,我们提到了下载高分遥感影像数据需要用到FTP(文件传输协议,File Transfer Protocol)软件FileZilla;这一软件用以在自己的电脑与服务器之间相互传输数据,在进行下载科学数据、网站开发等等操作时,经常需要用到。本文就对FileZilla软件的下载、安装、配置与使用方法加以详细介绍。
疯狂学习GIS
2024/02/17
2090
下载FileZilla并用其与服务器传输文件的方法
多种遥感数据批量下载方法
大家好久不见啊,已经很久没有更新公众号了。不光是因为自己懒,还有就是自从开学以后就各种事情不断。
GIS与遥感开发平台
2022/04/29
1.6K0
多种遥感数据批量下载方法
用Python批量下载DACC的MODI
本人初次尝试用Python批量下载DACC的MODIS数据,记下步骤,提醒自己,数据还在下载,成功是否未知,等待结果中。。。。。。
py3study
2020/01/16
8830
用Python批量下载DACC的MODI
下载大量遥感影像后用Python检查文件下载情况
  本文介绍批量下载遥感影像时,利用Python实现已下载影像文件的核对,并自动生成未下载影像的下载链接列表的方法。
疯狂学习GIS
2023/09/29
2210
下载大量遥感影像后用Python检查文件下载情况
ERA5全球气象每小时、每日与每月数据:手动下载与Python批量下载
  本文介绍在ERA5气象数据的官方网站中,手动下载、Python代码自动批量下载逐小时、逐日与逐月的ERA5气象数据各类产品的快捷方法。
疯狂学习GIS
2023/12/26
5.5K0
ERA5全球气象每小时、每日与每月数据:手动下载与Python批量下载
Wget for windows——优雅地实现HTTP批量下载
2.使用迅雷的批量下载(这里好像会限速,所以我并没有采用这个方法)提到批量下载,更多的人第一个想到的是迅雷——可惜纵然推出了轻量版,迅雷仍然属于不可忍受的广告类软件之一。
菜菜有点菜
2022/03/16
6.3K0
Wget for windows——优雅地实现HTTP批量下载
USGS批量下载Landsat遥感影像
  首先,打开EarthExplorer官网(https://earthexplorer.usgs.gov/),首先完成注册与登录。
疯狂学习GIS
2023/06/26
1K0
USGS批量下载Landsat遥感影像
哨兵2号Sentinel-2大气校正后的L2A级遥感影像下载方法
  本文介绍在Sentinel哨兵遥感影像数据官网中,下载已经经过大气校正的Sentinel-2 L2A级遥感影像产品的方法。
疯狂学习GIS
2022/12/18
2.3K0
哨兵2号Sentinel-2大气校正后的L2A级遥感影像下载方法
20个卫星遥感数据下载平台
自然资源卫星遥感云服务平台以云计算环境为支撑,以多平台、多时相、多尺度、多层次卫星影像产品为资源,以实时推送、管理和分发自然资源陆地为主的国产遥感卫星影像产品为主要任务,其目的是构建全球虚拟卫星影像数据服务中心,实现自然资源国产高分辨陆地卫星影像产品在国内、国际自然资源管理及各行业的即时共享和高效利用,满足自然资源管理与卫星遥感影像全球对地观测需求。
郭好奇同学
2021/01/12
2.7K0
20个卫星遥感数据下载平台
Chrome中实现使用迅雷一次性选中并下载网页内全部链接的方法
  前期的一篇博客中,我们详细介绍了USGS遥感影像批量下载的方法。在利用这一方法生成每一幅影像的下载链接后,我们直接结合可以批量获取网页内下载链接的下载软件进行下载。而在这一过程中发现,在Chrome浏览器中,常用的下载软件只有IDM可以一次性获取全部下载链接(即下图中的Download all links with IDM),迅雷则只能手动多选。
疯狂学习GIS
2021/07/22
4.2K0
推荐阅读
相关推荐
MODIS遥感影像数据Earthdata中批量下载
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验