Nodejs的安全学习

Nodejs

Nodejs的文档

http://nodejs.cn/learn

弱类型

大小写比较

跟php比较相似

console.log(1=='1'); //true
console.log(1>'2'); //false
console.log('1'<'2'); //true
console.log(111>'3'); //true
console.log("ad">"v") //false
console.log('asd'>1); //false

总结:数字与字符串比较时:会优先将纯数字型字符串转为数字之后再进行比较;

字符串与字符串比较时:会将字符串的第一个字符转为ASCII码之后再进行比较;

而非数字型字符串与任何数字进行比较都是false。

数组的比较:

console.log([]==[]); //false
console.log([]>[]); //false
console.log([]>[]); //false
console.log([6,2]>[5]); //true
console.log([100,2]<'test'); //true
console.log([1,2]<'2');  //true
console.log([11,16]<"10"); //false

**总结:**空数组之间比较永远为false,

数组与非数值型字符串比较,数组永远小于非数值型字符串;

数组与数值型字符串比较,取第一个之后按前面总结的方法进行比较。

还有一些比较特别的相等比较:

console.log(null==undefined) // 输出:true
console.log(null===undefined) // 输出:false
console.log(NaN==NaN)  // 输出:false
console.log(NaN===NaN)  // 输出:false

js大小写绕过

大小写特性(P神)

ctfshow web334

看zip中的源码

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;

其中

toUpperCase()是javascript中将小写转换成大写的函数。
toLowerCase()是javascript中将大写转换成小写的函数
除此之外
在Character.toUpperCase()函数中,字符ı会转变为I,字符ſ会变为S。
在Character.toLowerCase()函数中,字符İ会转变为i,字符K会转变为k。

所以直接payload(小写绕过)

输入:ctfshow和123456

ES6模板字符串

我们可以使用反引号替代括号执行函数,如:

alert`test!!`

可以用反引号替代单引号双引号,可以在反引号内插入变量,如:

var fruit = `apple`;
console.log`i like ${fruit} very much`;

事实上,模板字符串是将我们的字符串作为参数传入函数中,而该参数是一个数组,该数组会在遇到${}时将字符串进行分割,具体为下:

["i like ", " very much", raw: Array(2)]
0: "i like "
1: " very much"
length: 2
raw: (2) ["i like ", " very much"]
__proto__: Array(0)

所以有时使用反引号执行会失败,所以如下是无法执行的:

eval`alert(2)`

命令执行

ctfshow web335

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值