DASCTF_GFCTF_2024
DASCTF X GFCTF 2024|四月开启第一局
Web
cool_index
先看看附件,逻辑并不复杂
import express from "express"; |
一来就看到了ejs的3.1.9版本,这个是有一个不算漏洞的漏洞的,因为作者不认为他是一个漏洞,如果有如下的渲染参数,则可以RCE:
app.post('/', (req, res) => { |
可通过传参
settings[view%20options][closeDelimiter]=1")%3bprocess.mainModule.require('child_process').execSync('calc')%3b// |
或者
settings: { |
回到题目,有render()的地方只有一个,就是/路由的用户名那里,但是!!,用户名并不是像漏洞渲染的那样接受全部的参数的,而是经过了jwt的验证后传出来的,所以这里不能使用这个打法了
接着往下看题目,也可以顺着题目逻辑来获取flag的,那就是通过/register路由来注册一个premium身份的账号,然后在/article路由才能选择id=7来获得flag,但是注册premium身份的账号要知道FLAG + JWT_SECRET,这又是不可能的事
最后也只能在传参index上下手了,可以看到index从请求体中传过来后,还会经过一个index = parseInt(index);才会取文章。并且在解析后还进一个判断Number.isNaN(index) || index > articles.length - 1,要求一定是数字并且不能溢出数组才通过
parseint()就是将字符串解析成数字,在文档中看到一个用法
在parseint之前几次数值的比较,例如decoded.subscription !== "premium" && index >= 7,我们去试试带着别的字母会不会影响比较:
不影响,那就直接改参数传入7a之类的
EasySignin
先看题目,可以注册登录,在注册的时候就能发现已经有admin账户了,随便注册一个账户进去可以看到有查看图片,修改密码,退出登录的几个功能
改密码改包能修改admin的密码
使用修改的密码来登录admin账户就能查看图片了,查看图片的url长这样
/getpicture.php?url=https://tvax3.sinaimg.cn//large/0072Vf1pgy1foxkjfmwohj31kw0w0x2o.jpg
传了一个url参数,可能存在ssrf的,尝试一下file协议
base64解码是nonono,经过尝试flag、file、etc、dict等都会返回nonono,但是还有一个gopher能用,扫了一下目录有一个.DS_store文件,但是并没有什么用
经过多次尝试发现有3306端口是可以通过本地访问的gopher://127.0.0.1:3306

gopher通过ssrf打mysql有工具生成payload的,猜测无需密码的mysql账户时root,尝试直接读文件
