web
CatBank
创建两个账号,test1和test2,第一个想第二个转账1000000,然后第二个在转给M猫,得到flag

猫猫的秘密
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
   | <script>        let token = '';                document.getElementById('loginBtn').addEventListener('click', async () => {            const username = document.getElementById('username').value;            const password = document.getElementById('password').value;                        try {                const response = await fetch('/login', {                    method: 'POST',                    headers: {                        'Content-Type': 'application/json'                    },                    body: JSON.stringify({ username, password })                });                                const data = await response.json();                                if (response.ok) {                    token = data.token;                    document.getElementById('loginResult').textContent = `登录成功: ${data.message}`;                    document.getElementById('loginResult').classList.remove('hidden');                    document.getElementById('loginSection').classList.add('hidden');                    document.getElementById('secretSection').classList.remove('hidden');                } else {                    document.getElementById('loginResult').textContent = `错误: ${data.error}`;                    document.getElementById('loginResult').classList.remove('hidden');                }            } catch (error) {                document.getElementById('loginResult').textContent = `发生错误: ${error.message}`;                document.getElementById('loginResult').classList.remove('hidden');            }        });                document.getElementById('getSecretBtn').addEventListener('click', async () => {            try {                const response = await fetch('/get_secret', {                    method: 'GET',                    headers: {                        'Authorization': token                    }                });                                const data = await response.json();                                if (response.ok) {                    let resultText = `${data.message}\n\n`;                                        if (data.public) {                        resultText += `${data.public}\n\n`;                    }                                        if (data.confidential) {                        resultText += `猫猫信息: ${data.confidential}\n\n`;                    }                                        if (data.flag) {                        resultText += `Flag: ${data.flag}`;                    }                                        document.getElementById('secretResult').textContent = resultText;                } else {                    document.getElementById('secretResult').textContent = `错误: ${data.error}`;                }                                document.getElementById('secretResult').classList.remove('hidden');            } catch (error) {                document.getElementById('secretResult').textContent = `发生错误: ${error.message}`;                document.getElementById('secretResult').classList.remove('hidden');            }        });                document.getElementById('logoutBtn').addEventListener('click', () => {            token = '';            document.getElementById('username').value = '';            document.getElementById('password').value = '';            document.getElementById('loginResult').classList.add('hidden');            document.getElementById('secretResult').classList.add('hidden');            document.getElementById('secretSection').classList.add('hidden');            document.getElementById('loginSection').classList.remove('hidden');        });    </script>
   | 
 

要打Authorization头认证
/get_secret路由需要认证,我们要伪造cookie,这里是jwt的认证(还有其他认证方式如Basic认证、Digest认证、Beare认证等)
提示Invalid algorithm  算法无效,那就改成none来试一下
JWT支持将算法设定为“None”。如果“alg”字段设为“ None”,那么签名会被置空,这样任何token都是有效的
https://www.cnblogs.com/backlion/p/16699442.html


没有flag,猜测权限问题,和权限有关的,payload部分为role,account,isAdmin等,这里是role继续构造


CatNet

admin目录

xff伪造127.0.0.1就行
然后就信息收集一下呗,有/admin/flag这个路由,加上头验证不对,应该是后面的000不对,爆破一下就好了


ezblog

把jar包反编译一下,dashboard.class里存在/backdoor,想要拿到flag,就得知道key

FileStaticRepository设置了基础目录/app/assets

这里有一个可控的参数,relativepath ,在solon框架中,这个参数是通过url路径传过来的,relativepath就是/assets后面的内容,对于恶意的url表现为,http://…/assets/etc/passwd
然后就想着拿key呗,key的话应该在真实的app.jar文件里,基础目录是assets那么payload构造就要为
/assets/../app.jar,拿到app下的真实jar文件

拿下

catshell
主播太菜,不会