Injection

주사를 놓을때 주사에 약물을 넣어 혈액에 주입할때,
Injection이라고 한다.

웹 보안에서 주로 Javascript 코드 주입, 그 중에서 악성코드를 주입할때 주로 사용된다.
주사처럼 취약점과 방법만 알면, 무서운 무기가 된다.
왜냐하면 아주 흔하다.
아주 쉽다.
그리고 서버에 매우 큰 영향을 줄 수 있다.
예시

여기 회사의 직원 퇴직금을 관리해주는 웹 서비스가 있다.

%를 기입하는 input 창
숫자를 넣는 공간이지만,
javascript 코드를 넣고 submit을 해보았다.
해커는 분명 시도해 볼 것이다.
Input창에 Node.js 코드를 주입해 보았다.
(process.exit()) 으로 서버를 다운 시켜 보겠다.

결과 서버가 터졌다.

다른 코드로 Injection을 할 수 있다.

process.kill(process.pid)로 직접 Process ID를 죽이거나,
while(1)코드 주입으로
영원히 무한 루프를 발생시켜 다른 요청을 처리하지 못하게 하는
여러가지 방법으로 DoS(서비스 거부 공격)를 발생시킬 수 있다.

res.end(require('fs').readdirSync('.').toString())
위와 같이 소스 코드에 어떤 파일들이 있는지 보인다.
당연히 res.end(require('fs').readFileSync('LICENSE'))
파일들이 어떤 내용을 가지고 있는지 읽을 수 있다.

Node.js 코드 Injection으로 LICENSE 파일을 해킹


Node.js 코드 Injection으로 서버 Server.js소스 코드를 해킹한 결과물

문제의 코드( eval() ) 함수 사용
// eval() 함수로 취약해진 코드
const preTax = eval(req.body.preTax);
const afterTax = eval(req.body.afterTax);
const roth = eval(req.body.roth);
// 해결방법은 parseInt()로 모두 정수형태로 만들어
//Server Side Javascript Injection 막는다.
const preTax = parseInt(req.body.preTax);
const afterTax = parseInt(req.body.afterTax);
const roth = parseInt(req.body.roth);
방지법 예시:
1. Validation(유효성 검사) 작업을 해주자.- 로그인된 사용자인지, 로그인된 사용자여도 권한이 있는지, input 값에 들어올 type값을 설정하기 등등
2. eval() 함수를 사용하지 말자. setTimeOut(),setInterval() 및 Function() 등 함수 사용에 주의를 기울이자.
3. JSON.parse()로 더 안전한 형태로 데이터로 문자열로 파싱해서 받자.
4.함수 시작시 "use stric"을 사용하자. strict 모드를 사용하기
위의 경우 예시이다.
현재 업계에서는 위 예시처럼 허술하게 뚫리는 경우는 없지만, 해커들은 언제나 빈틈, 기본적인 것부터 시작해서 수단과 모든 방법(예:brute force attack 등)을 가리지 않고 모두 시도하기 때문에, 가장 기본적이지만 치명적인 Injection의 방법, 원리, 위험성을 예시로 대해 배워 보았다.
SQL, NoSQL Injection도 원리는 동일하다.