2024 第一届VCTF 纳新赛 Web方向 题解WP

文章详细解析了一个利用JavaScript原型污染技巧的示例,通过修改`venom`对象的原型和属性来控制服务器响应。作者揭示了如何利用`hasOwnProperty`的覆盖和`welcome`属性检查实现flag输出,同时讨论了原型链污染的顺序影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hackjs

题目描述:A baby oldjs, just warm up.

附件给源码

const express = require('express')
const fs = require('fs')
var bodyParser = require('body-parser');
const app = express()
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());

app.post('/plz', (req, res) => {

    venom = req.body.venom

    if (Object.keys(venom).length < 3 && venom.welcome == 159753) {
        try {
            if(venom.hasOwnProperty("text")){
                res.send(venom.text)
            }else{
                res.send("no text detected")
            }
        } catch {
            if (venom.text=="flag") {
                let flag=fs.readFileSync("/flag");
                res.send("Congratulations:"+flag);
            } else {
                res.end("Nothing here!")
            }
        }
    } else {
        res.end("happy game");
    }
})



app.get('/',
function(req, res, next) {
    res.send('<title>oldjs</title><a>Hack me plz</a><br><form action="/plz" method="POST">text:<input type="text" name="venom[text]" value="ezjs"><input type="submit" value="Hack"></form>  ');
});

app.listen(80, () => {
  console.log(`listening at port 80`)
}) 

开题

image-20240316135254032

点击hack进入/plz路由,代码不分析了,gpt都能看懂。

所有继承了 Object 的对象都会继承到 hasOwnProperty 方法。这个方法可以用来检测一个对象是否含有特定的自身属性;和 in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性。

payload:

venom[__proto__][welcome]=159753&venom[hasOwnProperty]=Jay17&venom[text]=flag

解释一下:

  1. venom[__proto__][welcome]=159753:这一部分试图修改venom对象的原型(即venom对象的__proto__属性指向的对象)上的welcome属性。在JavaScript中,所有的对象默认继承自Object.prototype,除非明确地改变了对象的原型链。通过设置venom[__proto__][welcome]=159753,它实际上是在所有对象的原型上设置了welcome属性的值为159753,因为__proto__是指向对象原型的引用。
  2. venom[hasOwnProperty]=Jay17:这部分将venom对象的hasOwnProperty属性设置为字符串"flag"。正常情况下,hasOwnProperty是一个继承自Object.prototype的方法,用于检查对象是否拥有特定的自有属性。通过将它设置为一个字符串,venom.hasOwnProperty("text")的调用将会失败,因为hasOwnProperty已不再是一个函数。所以进入catch
  3. venom[text]=flag:这部分设置venom对象的text属性为字符串"flag"

现在,让我们回到原始的服务器端代码逻辑,看看为什么这个传参能够导致输出flag:

  • 服务器期望venom对象有一个welcome属性,其值为159753,而这已经通过原型污染在所有对象上设置了。
  • 服务器代码检查venom.hasOwnProperty("text"),这个调用会失败(抛出异常)因为hasOwnProperty已被覆盖为一个非函数值,这使得执行流进入到catch块。
  • catch块中,代码检查venom.text=="flag",这个条件为真,因为venomtext属性已经被设置为"flag"
  • 因此,满足了输出flag的条件。

image-20240316143200913

但是我很好奇的一点是,如下payload和之前同理,却无法输出flag

venom[welcome]=159753&venom[hasOwnProperty]=Jay17&venom[__proto__][text]=flag

image-20240316143913637

但是这样又可以了(为什么原型链污染一定要放在传参的最前面呢???)

venom[__proto__][text]=flag&venom[hasOwnProperty]=Jay17&venom[welcome]=159753

image-20240316143851261

Archived elephant【没出等WP】

题目描述:本打算通过写一个CMS来学习java狠狠赚他一笔,但写到一半发现好像有漏洞。都怪这个组件…虽然我也有问题:)

思路不要局限于文件上传本身,注意看题面

关键!!不是ueditor的历史漏洞,另外请注意pom.xml中存在较低版本的依赖

开题登录框。账号密码附件里找

image-20240316151031713

image-20240316151059831

之后是个文件上传点

image-20240316151219894

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay 17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值