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`)
})
开题
点击hack进入/plz
路由,代码不分析了,gpt都能看懂。
所有继承了 Object
的对象都会继承到 hasOwnProperty
方法。这个方法可以用来检测一个对象是否含有特定的自身属性;和 in
运算符不同,该方法会忽略掉那些从原型链上继承到的属性。
payload:
venom[__proto__][welcome]=159753&venom[hasOwnProperty]=Jay17&venom[text]=flag
解释一下:
venom[__proto__][welcome]=159753
:这一部分试图修改venom
对象的原型(即venom
对象的__proto__
属性指向的对象)上的welcome
属性。在JavaScript中,所有的对象默认继承自Object.prototype
,除非明确地改变了对象的原型链。通过设置venom[__proto__][welcome]=159753
,它实际上是在所有对象的原型上设置了welcome
属性的值为159753
,因为__proto__
是指向对象原型的引用。venom[hasOwnProperty]=Jay17
:这部分将venom
对象的hasOwnProperty
属性设置为字符串"flag"
。正常情况下,hasOwnProperty
是一个继承自Object.prototype
的方法,用于检查对象是否拥有特定的自有属性。通过将它设置为一个字符串,venom.hasOwnProperty("text")
的调用将会失败,因为hasOwnProperty
已不再是一个函数。所以进入catch
块venom[text]=flag
:这部分设置venom
对象的text
属性为字符串"flag"
。
现在,让我们回到原始的服务器端代码逻辑,看看为什么这个传参能够导致输出flag:
- 服务器期望
venom
对象有一个welcome
属性,其值为159753
,而这已经通过原型污染在所有对象上设置了。 - 服务器代码检查
venom.hasOwnProperty("text")
,这个调用会失败(抛出异常)因为hasOwnProperty
已被覆盖为一个非函数值,这使得执行流进入到catch
块。 - 在
catch
块中,代码检查venom.text=="flag"
,这个条件为真,因为venom
的text
属性已经被设置为"flag"
。 - 因此,满足了输出flag的条件。
但是我很好奇的一点是,如下payload和之前同理,却无法输出flag
venom[welcome]=159753&venom[hasOwnProperty]=Jay17&venom[__proto__][text]=flag
但是这样又可以了(为什么原型链污染一定要放在传参的最前面呢???)
venom[__proto__][text]=flag&venom[hasOwnProperty]=Jay17&venom[welcome]=159753
Archived elephant【没出等WP】
题目描述:本打算通过写一个CMS来学习java狠狠赚他一笔,但写到一半发现好像有漏洞。都怪这个组件…虽然我也有问题:)
思路不要局限于文件上传本身,注意看题面
关键!!不是ueditor的历史漏洞,另外请注意pom.xml中存在较低版本的依赖
开题登录框。账号密码附件里找
之后是个文件上传点