CTFSHOW-nodejs
文章发布时间:
最后更新时间:
最后更新时间:
web334. 开始nodejs
题面一打开是一个登陆框,并且给了源码,进行一波代码审计
第一题分析的细致一些,主逻辑应该是在login.js当中,开头导入了一个user模块,其中包含一个items,其中是一个很像用户名和密码的对象{username: 'CTFSHOW', password: '123456'}
{:height 90, :width 543}
我们再看路由findUser函数检验name是否不等于
CTFSHOW
且password等于123456
,若成功则会返回登陆成功及flag实际上username是小写hhhh,那就直接登就完了
- web335. 开始nodejs RCE
题目提示在源代码中
eval可以推测应该是node版代码执行。
在nodejs中,eval()方法用于计算字符串,并把它作为脚本代码来执行,语法为“eval(string)”;如果参数不是字符串,而是整数或者是Function类型,则直接返回该整数或Function
child_process.exec()
:spawns a shell and runs a command within that shell, passing the stdout and stderr to a callback function when complete.
child_process.execSync()
:a synchronous version of child_process.exec() that will block the Node.js event loop
- web336. 开始nodejs
和刚才题面一致,试一下上一题的payload
回显tql
,说明存在过滤
一个细节是__filename
可回显源码所在路径名
__filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。 如果在模块中,返回的值是模块文件的路径。 __dirname 表示当前执行脚本所在的目录。
然后利用fs
模块的readFileSync
即可读取文件内容Asynchronously reads the entire contents of a file.
源码如下 可以看到过滤了exec
和load
可以通过字符串拼接的方式来绕过 - web337. 数组绕过
直接给了源码 这题主要判断点在a && b && a.length===b.length && a!==b && md5(a+flag)===md5(b+flag)
思路也是跟PHP差不多的数组绕过{:height 481, :width 448}
这里其实是有点区别,不过意思就是输出一个与元素本身值无关的信息出去就行,比如上面这种形式对象的输出就是会显示其属性的类型而不是值 - web338. 原型链污染
题目给了源码 我们可以看到,要想得到flag,需要让secret.ctfshow
属性为36dboy,我们可控的是user的属性,其中唯一可以联系的就在这个copy函数当中,存在对象属性间的复制,这里就利用到了原型链污染漏洞
我们的目标就是污染secert
对象的ctfshow
属性 - web339.
可以看到源码当中的变动 新增了一个api.js
这里的细节就是query没有被其他变量复制,且我们的copy还在运作,所以仍然可以污染到Object
nodejs 没有require下引入模块 顺便补一下bash POC 之后访问/api 使得Function执行 - web340. 原型链污染
user.userinfo
由于isAdmin已经被写,但是之前的query依旧可被污染,需要注意的是,这道题当中对象之间多了一层关系,我们想要污染到Object,需要两层__proto__
POC
id:: 636142ba-9e3e-4edd-b6c1-a1dace261858
我们之前是直接复制到user当中,而修改后变成了 - web341. 原型链污染
再次查看题面,可以看到不会再输出flag变量了 同时index.js
中也删去了对query的可利用函数
那么原型链污染的利用点在哪里呢,在app.js
中我们可以看到var ejs = require('ejs');
这个模版引擎存在原型链污染RCE
因为没有下载相关ejs库源代码,这里直接截一个sink点的图{:height 353, :width 668}
这里可以看到,opts.outputFunctionName
成员属性在整个过程处于undefined的状态,在if条件句下会被拼接并在后续代码中执行。这里可以通过原型链污染漏洞进行属性污染,当然需要注意的是闭合前后两个拼接语句。 结合本题,我们的污染执行点还是在utils.copy(user.userinfo,req.body);
处
也就是进行两级原型链污染
payload - web342-343. 审计了1个小时发现的,此链目前网上未公开,难度稍大
app.js
中可以看到换了一套模版引擎 jade{:height 147, :width 638}
https://xz.aliyun.com/t/7025
原型链污染的触发点还是在index.js
的utils.copy(user.userinfo,req.body);
处
POC - web344.
题面给了hint 其中url中过滤了8c/2c/, 其中2c对应的就是,
针对逗号的过滤可以用&
绕过
nodejs 会把同名参数以数组的形式存储,并且 JSON.parse 可以正常解析。
payload 这里有个细节就是c
需要url编码,因为GET传参后,其前面的字符"
经过编码会为%22
与c连接会触发黑名单