본문 바로가기

PlayTheWeb

Play The Web - 2. 이제 개발 쫌 한다?

첫번째 글을 쓰고 나서 많은 생각이 들었다.


내가 하고 싶었던 말을 첫 글에 거의 쏟아부은 것 같아 더 이상 쓸 말이 없진 않을까? 하는 생각도 들었다.


이번 글은 첫번째 글이 개발에 입문시키기 위해 썼다면, 개발을 하면서 익힌 노하우를 보안에 써먹는법에 대해 내 생각을 적어보고자 한다.



웹 모의해킹을 하다보면 홈페이지의 디자인도 많이 보게 되지만 홈페이지에 속한 기능이 어떻게 동작하는지를 생각해보게 된다.


input의 순기능에 의해 데이터를 입력받고 그것을 GET이나 POST 메소드를 통해 넘기고... 동적 페이지에서 이를 처리해 웹 서버와 연결된 DB에 저장한다.


웹 개발을 하게 되면 자연스레 알게 되고 사이트마다 공부를 하지 않아도 위와 같은 방식이 통상적으로 쓰인다는 것을 알 수 있다.


사실 웹에서 쓰이는 작업들의 목적은 위의 문장과 연관되어 있다고 볼 수 있다. 자신이 어떤 데이터를 가공시키고 처리하느냐에 따라 그 방법이 달라질 뿐이다.


그렇다면 이 방식에서 나오는 보안 취약점은 몇개나 될까?


저 문장을 4단계로 나누면 다음과 같다.



1. Input의 순기능에 의해 데이터를 입력받고


2. 그것을 GET이나 POST 메소드를 통해 넘기고


3. 동적 페이지에서 이를 처리하고


4. 웹 서버와 연결된 DB에 저장한다.



이 4단계에서 나올 수 있는 취약점들의 이름을 댈 수 있다면 이 글을 보지 말고 뒤로가기를 누르도록 하자.



보통 우리가 배우는 웹 해킹 기술의 대표적인 것은 SQL Injection, Cross Site Script(XSS), CSRF 등 많을 것이다.


SQL Injection은 1998년 12월에 처음으로 그 개념이 발표되었다고 한다.


벌써 2018년 11월이니 19.9살이 된 기법이다. 근 20년이 된 어마어마한 기법이지만 OWASP에서도 꾸준히 1위를 유지하고 계시는 웹 해킹계의 마스코트이자 대장님이라고 부를만한 기법이다.(어휴 꼰대급 기법)


그렇다면 이 기법은 어떤 단계에서 먹히는 기법일까?


정답은 3단계이다.


어떤 사람은 이렇게 물을 것이다.


Input 단계에서 인젝션 못하게 치환해서 막아버리면 되지 않나요?


아 좋은 생각이다. 근데 그거 뚫린다.


어떻게 뚫냐? Input을 입력받는 과정에서 막아봐야 자바스크립트에서 해당 Input의 id를 통해 입력을 감지해 싱글쿼트( ' )가 입력되면 자동으로 공백으로 치환하거나 헛짓거리 하지말라고 새로고침 시켜버리던가 할 것이다.


전 글에서 말했지만 프론트엔드에는 HTML, CSS, 자바스크립트가 속한다. 


자 우리는 개발을 배웠다. 크롬의 갓발자도구를 사용할줄 알 것이다.


Ctrl + Shift + i 를 누르면 번쩍이며 등장해 개발자들에게 꿈과 희망을 주는 멋진 도구이다.


개발자도구는 Network단에서 어떤 데이터가 넘어갔는지, 어떤 데이터를 응답받았는지 간편하게 알 수 있고 내가 접속한 페이지에서 어떤 js, css, html 코드가 다운로드 되어졌는지 알 수 있으며 내가 지금 보고 있는 페이지의 소스코드가 어떻게 되어 있는지(PHP로 작성한 서버단 스크립트는 못본다.) 볼 수 있다.


웹 서버는 우리가 보고자 하는 페이지를 요청하면, 그에 맞는 화면을 뿌려준다. MVC 패턴을 배웠다면 금방 이해 할 것이고 요청하고 응답을 받는 클라이언트 - 서버 관계를 이해하고 있다면 금방 이해할 내용이다.


그렇다면 그 과정에서 변조를 시킨다면?



여러분에게 좋은 도구를 하나 소개 시키고자 한다.


burp suite에 대한 이미지 검색결과

Burp Suite

Burp Suite 라는 웹 프록시 도구이다.


옛날에 해킹좀 했던 친구들에게는 Paros라는 좋은 툴을 썼겠으나 지금은 피들러나 요 Burp Suite가 많이 쓰이는걸로 알고있다.


이 도구는 웹 페이지를 요청할때, 응답 받을때 아주 유용한 역할을 한다.


내 컴퓨터와 서버 사이에 또 하나의 고속도로 톨게이트 같으 존재가 되어 줄 수도있고


중국이 자국민을 검열하듯 중국 개X끼 라는 단어가 중국 사랑해 라고 바꾸는 존재가 될 수도 있다.


자 다시 위의 문제로 돌아가면, 싱글쿼터를 입력하면 공백으로 치환시켜버리는 해당 스크립트는 서버에서 다운로드 받는 즉시 웹 페이지에서 동작한다.


그러면 해당 스크립트를 다운로드 받는 과정에서 동작하지 않도록 변조시켜버리면 어떨까?


당연히 동작하지 않겠지.


해당 스크립트를 지웠으니 필터링하는 동작을 하지 않게 되고, 자연스럽게 싱글쿼터를 입력해도 아무런 변화가 일어나지 않는다.


여러분이 제일 잘 알고 있는 ' or 1=1#를 입력하는데 아무런 방해를 받지 않는다는 소리다.



이제 이쯤되면 본인이 알고있는 개발 지식이 보안 취약점으로 어떻게 다가갈 수 있는지 보일것이다.


첫번째 글에서 개발을 제발 공부하라고 한 이유가 이런 부분에 있어 도움이 굉장히 많이 되기 때문이다.


알았으면 이제 다시 가서 개발공부를 하자. 첫번째 글 읽고 난 싫어 그래도 개발 안해 하면서 이 글을 읽고 있는 사람에게 하는 말이다.



결론은 본인이 개발을 하면서 얻게 되는 것을 잊지 말고 써먹자. 고객에게 대응방안 써줄때도 시큐어코딩으로 써줘야 하는 일이 있을 것이다.


위의 취약점을 응용해서 대응방안을 써보자면 자바스크립트로 필터링하지말고 서버사이드에서 처리시키는 것을 권고한다. 가 될 것이고 보고서에 자신있게 쓰면된다.


마지막으로 웹 해킹을 공부할 때에는 개발 단에서는 어떻게 구현되있고, 진단하는 입장에서는 어떻게 보이는지 상상해보면서 공부하자. 


상상력이 때로는 엄청난 취약점을 발견하는데 도움을 줄 수 있고, 때로는 개발을 하는데 있어 좋은 아이디어가 될 수도 있다.


화이팅!