前端断点调试到管理员登陆

发现前端漏洞
This is a 靶标,出于保密原因我就不上图了,长得非常泛微。

一般看到这种一眼通用的系统我都会直接跑路,但是一开始说了,this is a 靶标,所以还得先看一看。

由于前端一眼打包器,跑一跑URL。一轮下来也是一堆堆401,但有两个带sql的路径居然是200:在这里插入图片描述
这倒是有意思,直接发到重发器看看返回。在这里插入图片描述
由于不知道参数,直接返回脚本为空。但看返回的意思是可以直接执行sql语句?

于是折回前端看看js,看是否能找到参数。一番查找,很幸运的是路由跟参数表放在一起:在这里插入图片描述
sqlpart不出意外就是语句,argspart不知道,就先置为空。那么就代入参数再试一试:在这里插入图片描述
显示解密错误,应该是跟某种加密有关。那么我们返回js再向上看,确实套了一层des加密:在这里插入图片描述
直接搜索函数的名字:在这里插入图片描述
这里也是个很简单的标准DES,只不过两个参数key和iv不以明文方式出现。函数采用了类似导出的方式,它的上下文不太好找。

不过一般存在加密的网站会对所有请求包进行加密,所以我们可以先登录试试看看能不能直接走到这个函数,然后下断点抓key。函数第一行下断点前端登录查看是否能断下,结果并没有,请求包越过我的断点飞奔而去:

在这里插入图片描述
看来登陆请求使用的并非这个加密函数。那么我们如何通过断点调试获得key和iv呢?总不能真的手算吧?

创造一个断点调试的环境
获取一个desEncrypt
在遇到看似误解的难题时,我们通常需要细心观察。在函数所在js文件中上下查找,发现这个文件中存在多个加解密函数:
在这里插入图片描述
而它们都属于同一个导出。那么假设存在一个调用a.rsaEncrypt,那么这个a是否也有desEncrypt的上下文呢?依照这个思路,我们可以随机找一个使用加密的包然后在调用加密时下断。如果不想找,也可以给所有加密函数下断,然后等待调用。

还是登录包,在函数rsaEncrypt处断下。向前跳一个堆栈,来到encrypt函数处:

在这里插入图片描述
此时console会获得当前的上下文(也就是当前作用域下所有变量),我们尝试在console下调用desEncrypt,成功:

在这里插入图片描述
然后我们在控制台中将这个函数“导出”,也就是存储为全局变量:在这里插入图片描述
然后放开断点,直接调用导出的变量,成功:在这里插入图片描述
下断点v2
现在我们获得了一个可以直接调用的加密函数,先试用此函数试试SQL语句是否能够执行,比如加密select 1:

在这里插入图片描述
执行成功~这下起码确认漏洞是存在的。但本脚本小子肯定不愿意手动一个个调用desE再复制粘贴,所以需要一个全自动工具帮我跑出库名表名等,比如sqlmap。这就需要我找到真正的key,而不仅仅是在console中获得一个导出(其实笔者写的插件processorRemote可以在这种情况下跑,这里出于研究心态继续了)。

那就又回到断点问题,如何在没有调用的情况下进断点?

很简单,写一个调用不就行了^ ^。山不就我我来就山嘛。

已知登陆时会调用r[“a”].rsaEncrypt,那么启用本地替换并在前面补上一行r[“a”].desEcrypt(“a”)不就能进入desEncrypt的调用了?
在这里插入图片描述
说干就干,右键选择替换内容,然后在encrypt的第一行输入r[“a”].desEcrypt(“a”),下断。在这里插入图片描述
再次登陆,跟随断点直接获取到密钥的值:在这里插入图片描述
再战管理员
解不出一毛
一通瞎跑然后使用经典的用户表查询,也是很快就获取到了一个普通权限的账号密码登陆。本来一切顺风顺水~但突然来了个应急,笔者跟着帽子叔叔出去浪了一天,第二天到公司的时候sqlmap咋跑都跑不动了,低权限账号进去也是啥都没有,有个屁啊!在这里插入图片描述
但是冷静下来想,加密注入怎么可能一天就修了?这又不是GHvv,而且其他路由都没有问题,账号也可以继续登录——这并不像是应急的痕迹。

抛开sqlmap,手动再次访问端点,访问失败。

删除参数中的内容,访问成功。

再次使用select 1测试,成功。

使用select 1’,失败。

看来问题不出在web端,也许是蓝队发现数据库错误日志异常增加给数据库加上了什么修改。不过没事,昨天起码跑了一个账号,账号表的位置我还是知道的。

简单select * from dbs.users where isAdministrator=1找一下管理员账号,有五个:

在这里插入图片描述
真令人仰天锥心而泣血者也…这就像是临门一脚了发现对面用的金库保险门- -。

越权是程序员的原罪
这下又只能继续对后台进行测试了。后台左翻翻右翻翻还是没啥数据,sql注入已经有了,文件上传到了静态目录,RCE又不是一般黑盒能整出来的大活。

功能点看完了返回BP看一看原始包:在这里插入图片描述
其它的都无所谓,这个UserId水灵灵得让人发现端倪。一般能够在请求包中出现可枚举的用户ID时,这个系统都存在有用户越权的可能。这里的用户ID虽然不可枚举(这里是UUID)——但我拥有一整个数据库,查查用户ID还是易如反掌。

随便取出一个管理员所属ID,bp开启替换,再次刷新:在这里插入图片描述
喜提高贵的Administrator:在这里插入图片描述
意外收获
既然系统长得像泛微,那我是真得查一查:在这里插入图片描述
好了收工

在使用 Visual Studio Code (VSCode) 编写管理员系统的源代码时,通常需要结合后端框架(如 Spring Boot、Node.js 或 Python Flask)和前端技术栈(如 Vue.js 或 React)来实现前后端分离架构。以下是一个基本的开发流程及部分代码示例,帮助快速构建一个管理员系统。 ### 项目结构设计 假设管理员系统包含用户登录、权限管理、数据展示等核心功能。可以采用如下技术栈: - 后端:Spring Boot(Java)或 Node.js - 前端:Vue 3 或 React - 数据库:MySQL 或 MongoDB - 开发工具:Visual Studio Code ### 后端实现(以 Spring Boot 为例) 1. 创建 Spring Boot 项目并添加依赖项(Maven 配置片段): ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies> ``` 2. 创建管理员实体类 `Admin.java`: ```java @Entity @Table(name = "admins") public class Admin { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(unique = true, nullable = false) private String username; @Column(nullable = false) private String password; // Getters and Setters } ``` 3. 创建 Repository 接口 `AdminRepository.java`: ```java public interface AdminRepository extends JpaRepository<Admin, Long> { Optional<Admin> findByUsername(String username); } ``` 4. 创建 Controller `AdminController.java`: ```java @RestController @RequestMapping("/api/admins") public class AdminController { @Autowired private AdminRepository adminRepository; @GetMapping public List<Admin> getAllAdmins() { return adminRepository.findAll(); } @PostMapping public Admin createAdmin(@RequestBody Admin admin) { return adminRepository.save(admin); } } ``` ### 前端实现(以 Vue 3 为例) 1. 安装 Vue CLI 并创建项目: ```bash npm install -g @vue/cli vue create admin-frontend ``` 2. 在 `src/views/AdminList.vue` 中展示管理员列表: ```vue <template> <div> <h1>管理员列表</h1> <ul> <li v-for="admin in admins" :key="admin.id">{{ admin.username }}</li> </ul> </div> </template> <script> import axios from 'axios'; export default { data() { return { admins: [] }; }, mounted() { axios.get('http://localhost:8080/api/admins') .then(response => { this.admins = response.data; }); } }; </script> ``` 3. 在 `src/router/index.js` 中配置路由: ```javascript import { createRouter, createWebHistory } from 'vue-router'; import AdminList from '../views/AdminList.vue'; const routes = [ { path: '/admins', name: 'AdminList', component: AdminList } ]; const router = createRouter({ history: createWebHistory(), routes }); export default router; ``` ### VSCode 插件推荐 为了提高开发效率,可以在 VSCode 中安装以下插件: - **IntelliSense for CSS, Class names, HTML**:增强前端代码补全能力。 - **Spring Boot Extension Pack**:适用于 Spring Boot 项目的调试与部署。 - **ESLint & Prettier**:用于 JavaScript/TypeScript 代码格式化与规范检查。 - **GitLens**:加强 Git 版本控制功能。 - **REST Client**:测试 API 接口非常方便[^1]。 ### 数据交互与安全性 管理员系统需处理敏感信息,因此建议引入 JWT(JSON Web Token)进行身份验证。在 Spring Boot 中可通过 `jjwt` 库生成令牌,并通过拦截器验证请求头中的 token 信息。 ### 调试与部署 - 使用 VSCode 的调试器配置 `launch.json` 文件,支持断点调试 Java 或 Node.js 应用。 - 可将前后端分别打包为 Docker 镜像,部署至服务器环境(如 Nginx + Tomcat 或 PM2 管理 Node.js 应用)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值