HGAME-WEEK1

HGAME-WEEK1

web 4/5

image-20240215210138158

2048*16

混淆太厉害了,刚开始一直想修改变量值,但是它是动态的,改不成功,只能改bestScore

最后审计代码,发现关键部分

因为它是混淆过的,所以我刚开始几次路过这个地方都不太理解,感觉再难一点就把game-won也放到定义的数组里去混淆了

g[h(432)][h(469)] = function(x) {
    var n = h
      , e = x ? "game-won" : n(443)
      , t = x ? s0(n(439), "V+g5LpoEej/fy0nPNivz9SswHIhGaDOmU8CuXb72dB1xYMrZFRAl=QcTq6JkWK4t3") : n(453);
    this[n(438)][n(437)].add(e),
    this[n(438)][n(435)]("p")[-1257 * -5 + 9 * 1094 + -5377 * 3].textContent = t
}

都提示了game-won,那下面这个就是flag

s0(n(439), "V+g5LpoEej/fy0nPNivz9SswHIhGaDOmU8CuXb72dB1xYMrZFRAl=QcTq6JkWK4t3")
function s0(x, n) {
    for (var e = h, t = 36 * 52 + -590 + -1282, r, a, o = -1 * -1971 + -678 + -1293, c = ""; a = x[e(442)](o++); ~a && (r = t % (-1 * 445 + -324 + -1 * -773) ? r * (-64 * 33 + -6548 + 8724) + a : a,
    t++ % (-268 * -25 + 166 * -37 + -277 * 2)) ? c += String[e(423)](7397 + 173 * 13 + 1 * -9391 & r >> (-2 * t & 1573 + -2423 * 1 + -856 * -1)) : 3978 + -26 * 153)
        a = n[e(481)](a);
    return c
}

n(439)是什么

g[h(432)][h(469)] = function(x) {
    var n = h
	.....
}
var h = F;

把全部代码放入控制台后,输入F会发现是这个函数

function F(x, n) {
    var e = $();
    return F = function(t, r) {
        t = t - (-4073 * 1 + 84 * -39 + 7766);
        var a = e[t];
        return a
    }
    ,
    F(x, n)
}

先把全部代码放入控制台(防止漏掉条件),然后把上述条件(手动输入var n = h)都放入控制台

image-20240204230254471

Bypass it

禁用js,访问register才能注册用户,然后登陆即可

ezHTTP

常规的HTTP请求头,不说了

jhat

刚开始没思路,给了提示后做出来的

搜索发现jhat能够把内存一些东西放到7000端口的web服务上(附件给了开放端口)

就是一些内存的东西

然后发现一个OQL(类似于SQL的查询语句)

刚开始我以为要看文档,找到能够命令执行的函数什么的,然后就不会了

后来给了提示要RCE,我就查OQL进行rce

https://wooyun.js.org/drops/OQL(%E5%AF%B9%E8%B1%A1%E6%9F%A5%E8%AF%A2%E8%AF%AD%E8%A8%80)%E5%9C%A8%E4%BA%A7%E5%93%81%E5%AE%9E%E7%8E%B0%E4%B8%AD%E9%80%A0%E6%88%90%E7%9A%84RCE(Object%20Injection).html

发现了这个文章,能够

java.lang.Runtime.getRuntime().exec('calc')

就像OGNL和SPEL这样的写法

我当时做时已经给了不出网的提示,于是我就直接文件读取/flag

new java.util.Scanner(new java.io.File("/flag")).next()

image-20240204231833889

Select Courses *

。。。做不出来,没思路

唯一一个注入点就是POST个id,拿sqlmap跑没用

倒是能够在它渲染之前修改响应信息,使它显示成功选课

但最终那个fetch就是直接访问,也没带什么参数进行判断是否选课成功。。。

官方描述

帮助阿菇选到所有课程,即可获取FLAG。后端逻辑是每间隔 30s-180s 放出⼀⻔课,若 5s 内没有选到

课程,则课程⼜会满员。已经被选上的课程不会再放出。当所有课程都选上之后,点击“选完了”按

钮,后端判定所有课程都已经被选择,就会返回给前端FLAG

。。。。。。我就说咋有时候点开显示的是未满,然后又显示已满,还以为我眼花了呢

那没啥好说了

有意思的是用了selenium库,我看一些刷网课的代码也用这个

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep

driver = webdriver.Chrome()
driver.get("http://127.0.0.1:8000")
sleep(3)

courses_list = []

for i in range(1, 6):
    course = {
        'panel': f'//*[@id="selector-container"]/section[{i}]/div[1]',
        'status': f'//*[@id="selector-container"]/section[{i}]/div[2]/table/tbody/tr/td[5]',
        'submit': f'//*[@id="selector-container"]/section[{i}]/div[2]/table/tbody/tr/td[6]/button'
    }
    courses_list.append(course)

print(courses_list)

while courses_list:
    driver.refresh()
    sleep(2)
    for course in courses_list:
        panel = driver.find_element(By.XPATH, course['panel'])
        panel.click()
        status_element = driver.find_element(By.XPATH, course['status'])
        status_text = status_element.text
        print(status_text)
        if status_text != "已满":
            submit_button = driver.find_element(By.XPATH, course['submit'])
            submit_button.click()
            WebDriverWait(driver, 5).until(EC.alert_is_present())
            alert = driver.switch_to.alert

            alert.accept()
            courses_list.remove(course)
            break

sleep(10)
driver.quit()

finally

第一周就有点难,感觉又是个牛B的新生赛,毕竟是杭电啊


HGAME-WEEK1
https://zer0peach.github.io/2024/02/04/HGAME-WEEK1/
作者
Zer0peach
发布于
2024年2月4日
许可协议