一開始沒仔細看,後來仔細看發現有一段在說如果 function body 是 return this 就給過
if (!vm->options.unsafe) {
body = njs_argument(args, nargs - 1);
ret = njs_value_to_string(vm, body, body);
if (njs_slow_path(ret != NJS_OK)) {
return ret;
}
njs_string_get(body, &str);
/*
* Safe mode exception:
* "(new Function('return this'))" is often used to get
* the global object in a portable way.
*/
if (str.length != njs_length("return this")
|| memcmp(str.start, "return this", 11) != 0)
{
njs_type_error(vm, "function constructor is disabled"
" in \"safe\" mode");
return NJS_ERROR;
}
}
可是雖然過了但沒什麼用,然後題目又有給一個列出 global 的 endpoint,底下有個 process,我就一直想說是不是要用 glboal,或是透過 global 拿到 global.eval 來做事,就在想怎麼樣拿到 global 但想不出來
你 function 是 this.result 所以怎麼呼叫 this 都會是 c 而不會是 global QQ
因為一題都沒解出來所以就只好來檢討了,一樣以 web 題為主
njs
source code:
這一題當初看滿久的,看一看發現那個 toString 很可疑,想一想就發現可以傳多個 ops 進去,就可以讓
thtis.result
是 function constructor 然後執行:但這樣做會噴一個
TypeError: function constructor is disabled in "safe" mode
的 error直接拿關鍵字餵狗:
njs TypeError: function constructor is disabled in "safe" mode
,可以找到這段 diff:https://hg.nginx.org/njs/rev/142b3fec5d4f一開始沒仔細看,後來仔細看發現有一段在說如果 function body 是
return this
就給過可是雖然過了但沒什麼用,然後題目又有給一個列出 global 的 endpoint,底下有個 process,我就一直想說是不是要用 glboal,或是透過 global 拿到 global.eval 來做事,就在想怎麼樣拿到 global 但想不出來
你 function 是 this.result 所以怎麼呼叫 this 都會是 c 而不會是 global QQ
後來看到 discord 上的討論,都怪我沒有把程式碼看完,我找到正確的地方了但沒仔細看:https://github.com/nginx/njs/blob/0.4.4/src/njs_function.c
他是用字串拼接的方式把 function 拼起來,簡而言之就是:
(function(args){body})
,其中 body 一定要是 return this 才給過,所以就是:(function(args){return this})
,但問題是 args 是可控的!所以可以這樣搞:
(function(){return 123})//){return this})
,其中的參數部分就是:){return 123})//
透過這樣的方式就可以執行任意 js 了:
先用
require('fs').readdirSync('/home')
讀出檔案名稱,最後 payload:這題滿有趣的,應該是這次我最有機會過的一題但沒把握住
Forgotten name
我連題目都看不太懂...我有嘗試去找 justctf.team 有哪些 subdomain 但找錯方向了 應該要找 jctf.pro 才對
筆記幾個好用服務
https://crt.sh/?q=jctf.pro https://transparencyreport.google.com/https/certificates?cert_search_auth=&cert_search_cert=&cert_search=include_subdomains:true;domain:web.jctf.pro&lu=cert_search_cert
Baby CSP
https://hackmd.io/@terjanq/justCTF2020-writeups
最後的解法是這樣:
原來可以這樣運用 name 的嗎?這樣的話看起來是共用同一個 window?先讓 name = payload,再用 eval(name) 來逃避字數限制,看來該找時間研究一下 top window,我都不知道還可以這樣,讓跳轉後的網頁用到前面網頁的 name
CSP header 利用 PHP 特性蓋掉
Computeration
這題我方向有對但不知道怎麼實作XD
有想到利用 REDOS 搭配 timing attack 應該可以把 flag 弄出來但不知道怎麼實作
https://hackmd.io/@terjanq/justCTF2020-writeups
看了 writeup 沒有很懂,之後有機會再找時間實作看看