Ajax 악성코드 방어하는 방법
최근 코딩테스트를 볼 기회가 주어져서 Node.js Ajax 관련 문제에 대해 고민해보는 시간이 있었다.
문제 자체는 어렵지 않았다. 주어진 api url로부터 $.ajax를 사용하여 데이터를 GET 해오고, 주어진 형식에 맞게 TABLE HTML을 만들면 되는 문제였다.
이 문제가 기억에 남았던 점은, json형태의 데이터 중 <script>, <img>
등 HTML TAG 라인이 섞여있어서
innerHTML로 완성된 HTML문구를 넣었을 때 일반 Text가 아니라 진짜 DOM으로서의 효력을 얻게 된다는 점이었다.
요점은, 이 안에 Reflected XSS 형태의 악성코드가 들어있어서 실제 HTML 코드로서 활성화되지 않고 단순 text로 취급되어야 점수를 받는 형태였다.
변명부터 하자면, 코딩테스트에서 Node.js ajax 호출하라는 문제를 처음 받아봤을 뿐더러, 단순 제외하는 것이 아니라 text로 취급되어야 한다는 조건에
풀이 방향성을 잃었던 것 같다.
이대로 넘어가기에는 너무 후회스러울 것 같아 간만에 블로그라도 작성하기로 한다.
Ajax
간단하게 Ajax에 대해 알아보는 시간부터 가지도록 한다.
AJAX(Asynchronous Javascript Ans XML)은 명칭 그대로 Client와 Server 간 비동기로 통신을 하는 방법을 뜻한다.
고전적인 웹 브라우저에서 새로운 데이터를 받기 위해서 처음부터 다시 Reload해야했던, 비효율적인 동기화 방식을 탈피하고자
필요한 데이터만을 조회, Reload할 수 있는 비동기식 방식이 개발되면서 현재까지도 널리 사용되는 통신 방식이다.
ajax는 통신하기 위해 여러 옵션을 추가할 수 있는데, 오늘 주제와 조금?은 관련된 옵션을 언급해보고자 한다.
- Data-Type : 서버에서 어떤 타입으로 받을 것인지 결정하는 옵션이다. Json, Html 등 원하는 형태를 옵션에 추가하면 그에 맞는 형식으로 바로 받아볼 수 있다.
- Content-Type : 서버에 요청 시 어떤 타입으로 보낼 것인지 결정하는 옵션이다. Data-Type과 반대되는 옵션으로, 서버에서 어떤 형식으로 받기를 희망하는지 작성할 수 있다. default 옵션은
application/x-www-form-urlencoded
이다.
XSS
Cross-Site-Scripting의 약자로, 권한 없는 사용자가 웹 사이트에 접근하여 다양한 방법으로 정보를 탈취하는 공격 행위를 일컫는 용어이다.
우리는 XSS 중 Reflect 방식을 알아보고자 한다.
Reflected XSS
사용자가 입력받은 값을 서버에서 되돌려주는 시점에, 해당 데이터를 탈취하여 Malicious Code를 삽입하는 방식이다.
위에서 언급했던 것 처럼 response 데이터에
img 태그에 onerror
옵션을 추가하고 src를 비워놓으면 error옵션이 확정적으로 실행되고, 이 옵션에 쿠키데이터를 탈취하거나 alert하는 function만 추가하면 손쉽게 쿠키를 얻을 수 있는 것이다.
해결방법
생각보다 쉬웠다… 테스트 당시에는 이를 어떻게 해결해야하나 고민하다가 못풀고말았는데, 조금만 찾아보니 바로 나오는 해결법이었다…
평소에 조금만 더 깊게 공부해왔다면 알 수 있는 지식이었다.
회사에서 보안 취약점을 담당하는 사람으로 이런 기초적인 지식에 대해 해결법도 모르고 있었다는 점에 스스로에게 화가 날 정도였다.
해결법은, HTML에서 text로 인식할 수 있는 Character로 Convert해주는 것이었다.
’<’ -> ‘<’
‘>’ -> ‘>’
single quote -> ‘'’
이런 식으로 바꿔주기만 하면 되는 것이었다….!!