GeekGame 2025 Web部分题解
官方归档
Web小北的计算器有源码,整体是对输入做了过滤,有几个函数
checkSafetyRegex
1234567891011function checkSafetyRegex(code: string) { const whitelist = /^[a-zA-Z0-9_+\-*/%() ]+$/ if (!whitelist.test(code)) { throw new Error('Bad Code') } const blacklist = /(eval|Function|__proto__|constructor|prototype|window|document|import|require|process|globalThis|self|global|this|module|exports|fetch|new|confirm|alert|prompt|%[0-9a-f]{2})/i if (blacklist.test(code)) { throw new Er ...
Xalan ClassLoader
看到这个字眼时还是很熟悉的,能够直接想到 TemplatesImpl 链子,以前做过一道 2023 巅峰极客 BabyURL 就用到了这个链子,自己当时也是分析过 ,也是很久以前的事情了,这次就巩固总结一下吧
TemplatesImpl 类位于 com.sun.org.apache.xalan.internal.xsltc.trax 包中,是 Java 标准库的一部分
其主要作用是处理 XSLT(Extensible Stylesheet Language Transformations);XSLT 是一种用于将 XML 文档转换为其他格式(如 HTML、文本或其他 XML 文档)的技术。
但由于其内部加载字节码的机制,因此可以被滥用于反序列化漏洞利用。其关键机制是 TemplatesImpl 类内部维护了一个 _bytecodes 字段,这是一个用于存储类的字节码(对其注入恶意代码),这种原生依赖限制在 Java 9 以前的 JDK 版本下
寻找利用大同小异,对于 ClassLoader 类加载器,我们能够想到的是加载恶意类直接利用,如果你熟悉 ClassLoader 的加载流程 ...
BCEL ClassLoader
BCEL是什么?
BCEL ClassLoader 本质上是一个自定义的类加载器,属于 Apache Commons BCEL(Byte Code Engineering Library)项目的一部分,主要利用于动态加载和解析 Java 字节码
类名:com.sun.org.apache.bcel.internal.util.ClassLoader
其重写了 Java 的 ClassLoader#loadClass() 方法,可以识别以$$$BCEL$$$开头的字符串,将其解码为字节码并加载为 Java 类;相比于原生的ClassLoader,其不能够直接加载嵌入在字符串中的字节码,必须提供类路径或 URL
由此可见,BCEL ClassLoader 提供了一种更便捷的方式,但同时也带来了安全问题
在JDK 1.8.0_251以前,其属于原生类,再这之后需要引入第三方库
BCEL攻击原理 BCEL ClassLoader先识别以 $$$BCEL$$$ 开头的字符串,随后将其转换为类字节码,最后使用defineClass注册解码后的类,接着就可以加载恶意类
这里我使用的JDK版本为1. ...
Phar反序列化
这篇文章其实早就在写了,但不知为何其被我遗留在一个不为人知的的角落里,再不发出来就要发霉了。。。
由于phar遇到的很少,这里只是对其基础知识进行学习,网上有很多师傅更深入了解的文章,也是在这里埋个坑以后继续学习
在PHP中,PHAR(PHP Archive)是一种将多个PHP文件、资源(如图片、样式表)和元数据打包成单个文件的归档格式,类似于Java的JAR文件。它的主要目的是简化代码的分发和部署。
它可以把多个文件存放至同一个文件中,无需解压,PHP就可以进行访问并执行内部语句
phar的文件结构首先我们需要知道php是如何标识一个phar文件的,且是如何从一个phar中访问php文件
Stub(引导程序)stub可以理解为一个phar文件的标识符,类似于可执行文件的“头部”,当直接运行phar时,PHP解释器会首先执行Stub中的代码
其本质上还是一个php文件,必须包含 __HALT_COMPILER(); 语句,通常用于定义自定义的加载逻辑或显示帮助信息,例如
12345<?phpPhar::mapPhar();require "phar://&quo ...
一些打点总结
7.8 ~ 9.8
验证机制与接口安全
短信验证码防护缺失:注意服务器未对短信验证做频率限制的情况,可通过Burp Suite的Turbo Intruder插件进行短信轰炸测试
接口鉴权缺陷:关注接口的鉴权key是否存在无效鉴权或未授权访问漏洞,特别是认证后的链接重定向功能,需检查是否能跳转到任意域外链接
客户端安全与逆向分析
前端加密分析:遇到前端加密时可尝试Js逆向,关键密钥或iv参数有时会硬编码在js文件中
源码泄露利用:注意.app等应用的.js.map文件,可通过reverse-sourcemap工具逆向出源码,查找敏感信息或业务逻辑漏洞
JS文件信息收集:重点关注js文件中泄露的敏感路由、API接口和baseURL,可根据系统或框架特征尝试常用路径
文件处理漏洞
压缩包处理漏洞:遇到自动解压功能时,尝试使用ZipSlip手法进行目录遍历,可能造成文件上传或覆盖(如kkFileView组件)
文件上传绕过:利用混合类型文件生成技术,将图片与PDF等不同格式文件合成,在不同后缀情况下显示为不同类型文件
存储桶配置错误:注意识别存储桶特征,配置不当可能具有ListBuck ...
基于Yapi下的MongoDB NoSQL注入造成的RCE
某次打点时偶遇Yapi管理平台资产,发现其存在版本下 (< 1.12.0) 的nday漏洞,整个攻击过程感觉挺巧妙的,以此记录下对其白盒测试的分析和思考
环境搭建YApi v1.10.2
1docker compose up -d
漏洞复现MongoDB的基础使用MongoDB是一种非关系型数据库 (NoSQL) 是一类不采用传统表格结构来存储数据的数据库,它将数据以类似 JSON 的格式存储,每条记录就是一个文档。这种结构非常适合存储复杂、嵌套的数据
虽然这有点脱离这篇文章的重心,但我觉得还是可以简单了解一下这种数据库的特性
简单来说就是在一些游戏活动场景下,并不是每个用户都会参与活动,如果像关系型数据库那样,给每个用户都添加该活动名的字段,那有很多用户的该字段下一定是空的,这样就会造成大量空间浪费,况且游戏迭代非常频繁,每次都会修改表结构
ID
Name
装备
春节活动
七夕活动
夏日活动
1
Hong
剑
是
2
Ming
枪
是
是
3
Bai
刀
是
但非关系型数据库就不会存在这样的情况,因为每一个文档就是一行数据,那多个文档对应 ...
记 Cobalt Strike 基础使用
启动服务器
1./teamserver <服务端ip> <CS服务端密码>
创建监听器上线客户端后,首先创建一个Beacon
可以看到这里有好几个类型,当然最常见的就是HTTP Beacon
Beacon是一种核心的远程控制组件,是植入目标主机后用于维持访问、执行命令、上传下载文件、横向移动等操作的“后门”,我们可以以此为载荷执行命令、上传下载文件、键盘记录、屏幕截图、横向移动、提权等
正如上图,其支持多种协议,用于不同的场景下
🔄Beacon的通信模式
异步通信:每隔一段时间(由 Sleep 设置)主动向 C2 请求任务并回传结果
交互式通信:实时响应命令(Sleep 设置为 0),适合快速操作但隐蔽性较差
External C2外部控制通道:自定义通信协议,将 Beacon 与 Team Server 连接起来(使用 Python、C、Go 等语言编写自己的第三方控制器和客户端)
Foreign HTTP/HTTPS外部 Beacon 会话:已经通过其他工具植入了 Payload,但想用 Cobalt Strike 的 GUI 来控制它,使用端口 ...
ClassLoder类加载器
以前学习Java反序列化的过程中多多少少接触了一些Java基础知识点,但自己并未系统性的学习过,借此机会来将Java基础巩固一下,也是对Java这门语言有更深刻的认识,二是更快上手Java安全的其它知识
ClassLoder初步感知众所周知,Java是依赖JVM的跨平台语言,其屏蔽了底层操作系统的差异,我们有时看到的.class文件就是被预先编译好的字节码文件,只能被JVM解释编译
当Java程序运行时,JVM并不会一次性加载所有类,而是按需加载,因此java.lang.ClassLoader就充当了一个中间人,加载类的任务由它完成;接着再调用JVM的native方法,从而创建一个 java.lang.Class 实例
ClassLoader类有如下核心方法:
loadClass(加载指定的Java类)
findClass(查找指定的Java类)
findLoadedClass(查找JVM已经加载过的类)
defineClass(定义一个Java类)
resolveClass(链接指定的Java类)
ClassLoder类加载流程主要是两种加载方式,当然加载后都要配合反射去调用输出 ...
NepCTF2025-Web
JavaSeri盲猜Shiro反序列化
1kPH+bIxk5D2deZiIxcaaaA==
有了key直接连
注入内存马后在环境变量中找到flag
RevengeGooGooVVVY这是一个Groovy表达式注入,在了解了基本的语法后发现
禁用闭包功能
1secureASTCustomizer.setClosuresAllowed(false);
禁用execute方法
123if (methodName.equals("execute")) { throw new SecurityException("Calling "+methodName+" on "+ "is not allowed");}
只允许调用string类的合法方法
1234567if (typeName.equals("java.lang.String")) { if (STRING_METHODS.contains(methodName)) { ...
Rootkit学习(二)
Root后门Linux信号机制Linux信号是进程间通信的一种方式,用于通知进程发生了某种事件或异常,其是异步的,可以由内核、其他进程或进程自身触发
比如kill -9 $PID强制杀死进程,其中9定义为SIGKILL,可以在signal.h查看
在64位中64号默认无特殊用途,需手动注册和处理,也许我们可以借助这个信号来埋藏一个后门
因此接下来的这个钩子的思路显而易见,即检查是否信号SIG = 64,否则就还是本身的系统调用sys_kill
1int kill(pid_t pid, int sig);
1234567891011121314151617asmlinkage int hook_kill(const struct pt_regs *regs){ void set_root(void); // pid_t pid = regs->di; int sig = regs->si; if ( sig == 64 ) { printk(KERN_INFO "rootkit: giving roo ...









