ctfshow
本文最后更新于 2026年3月25日 晚上
文件上传
web161-163
文件头伪造
1 | |
竞争上传
1 | |
web164
上传一个正常的图片,发现查看图片的时候存在文件包含漏洞,打一个图片马
1 | |

web165
上传一个正常的图片访问的时候看到这样一串信息

表明是jpg二次渲染,这里用一下大佬的一个脚本
1 | |
先上传原始的图片,再查看图片右击保存,再用脚本渲染

web166
这次要求上传压缩包,下载文件的时候存在文件包含漏洞
用010editor给压缩包后面加上一句话木马

web167
上传.htaccess,
web168
后端没有验证,可以抓包上传php,但是它对文件内容有过滤,普通马肯定不行,方法也比较多
传参
1 | |
双引号执行命令
1 | |
远程包含
web169
上传.user.ini包含日志
1 | |
nodejs
web334
源码里有username: 'CTFSHOW', password: '123456'
1 | |
校验这里用户名不能是CTFSHOW,但是item.username === name.toUpperCase()又对输入的用户名进行了大写转义,所以直接用ctfshow,123456登录即可
web335
提示/?eval=,推测直接是命令执行,我们调用child_process模块
1 | |
web336
上题的wp不好用了,测试发现exec被过滤了
拼接绕过
1 | |
编码绕过
1 | |
不用exec
1 | |
这里其实可以读到源码
1 | |
查看当前文件路径/app/routes/index.js
1 | |
读文件
1 | |
可以发现过滤了exec和load
web337
1 | |
md5绕过,这里普通的数组绕过行不通

当我们传入a[a]=1&b[b]=2
经过
1 | |
就变成了{‘a’:’1’},这样就可以成功绕过

web338

login.js存在原型链污染漏洞
1 | |
web339
这里修改了login.js
1 | |
由于这里我们不知道flag是什么,所以上面的方法肯定是不行了
预期解
漏洞点在res.render('api', { query: Function(query)(query)});
Function里的query变量没有被引用,通过原型污染给它赋任意值就可以进行rce。
1 | |
在index界面POST之后直接POST访问api界面即可
非预期解
ejs模板漏洞导致rce
1 | |
web340
1 | |
这里的userinfo是user的属性,所以要往上找两层
1 | |
web341
这次没有api了,login和上题一样,用之前非预期解,注意修改嵌套
1 | |
web342-343
jade rce 再探 JavaScript 原型链污染到 RCE-先知社区
1 | |
web344
1 | |
过滤了8c、2c和逗号,然后要求GET传入参数query,且满足 query.name==='admin'&&query.password==='ctfshow'&&query.isVIP===true 才可以拿到flag
也就是正常情况下我们应该传入
1 | |
而经过URL编码之后变成
1 | |
双引号编码之后是%22,和c连接起来就是%22c,会被ban
这题用到了NodeJS的特性,当 URL 里传入了多个同名参数,如多次出现 query=,Express 解析会将这些参数放入数组中,然后JSON.parse 会将数组的字符串元素拼接成一个完整字符串再解析。同时c也要进行URL编码,变成%63,这样就不会被ban了
payload:
1 | |