[西湖论剑 2022]Node Magical Login

[西湖论剑 2022]Node Magical Login

main.js 部分源码:

app.get("/flag1",(req,res) => {
    controller.Flag1Controller(req,res)
})

app.get("/flag2",(req,res) => {
    controller.CheckInternalController(req,res)
})

app.post("/getflag2",(req,res)=> {
    controller.CheckController(req,res)
})

controller.js 部分源码

function LoginController(req,res) {
    try {
        const username = req.body.username
        const password = req.body.password
        if (username !== "admin" || password !== Math.random().toString()) {
            res.status(401).type("text/html").send("Login Failed")
        } else {
            res.cookie("user",SECRET_COOKIE)
            res.redirect("/flag1")
        }
    } catch (__) {}
}
function Flag1Controller(req,res){
    try {
        if(req.cookies.user === SECRET_COOKIE){
            res.setHeader("This_Is_The_Flag1",flag1.toString().trim())
            res.setHeader("This_Is_The_Flag2",flag2.toString().trim())
            res.status(200).type("text/html").send("Login success. Welcome,admin!")
        }
        if(req.cookies.user === "admin") {
            res.setHeader("This_Is_The_Flag1", flag1.toString().trim())
            res.status(200).type("text/html").send("You Got One Part Of Flag! Try To Get Another Part of Flag!")
        }else{
            res.status(401).type("text/html").send("Unauthorized")
        }
    }catch (__) {}
}

访问flag1路由,设置cookie 里user值为admin时,可以得到flag1

function CheckController(req,res) {
    let checkcode = req.body.checkcode?req.body.checkcode:1234;
    console.log(req.body)
    if(checkcode.length === 16){
        try{
            checkcode = checkcode.toLowerCase()
            if(checkcode !== "aGr5AtSp55dRacer"){
                res.status(403).json({"msg":"Invalid Checkcode1:" + checkcode})
            }
        }catch (__) {}
        res.status(200).type("text/html").json({"msg":"You Got Another Part Of Flag: " + flag2.toString().trim()})
    }else{
        res.status(403).type("text/html").json({"msg":"Invalid Checkcode2:" + checkcode})
    }

获得 flag2 的条件有两个,一个是 checkcode 的长度要是 16,另一个就是在转小写后要等于 aGr5AtSp55dRacer,这根本不可能,但我们可以让它提前异常结束,也就是在 checkcode = checkcode.toLowerCase()处异常报错,那么我们可以令 checkcode 为一个数组,且长度为16。这里要用json格式发送checkcode,并且POST访问getflag2路由

payload:

{"checkcode":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}

image-20230622233616621

posted @ 2023-06-22 23:38  Magic水瓶  阅读(226)  评论(0)    收藏  举报