본 포스팅은 구글 프로젝트 제로의 멤버인 Ivan Fratric이 'So you want to work in security?'라는 제목으로 정보보안 직종에 종사하고 싶은 후배들에게 한 블로그 포스팅을 번역한 포스팅입니다.


번역 상에 오역이 있을 수 있으므로, 원문도 같이 첨부합니다.


원문 링크 : http://ifsec.blogspot.kr/2018/02/so-you-want-to-work-in-security-and-for.html?m=1


트위터를 써라



갑자기 트위터라는 SNS하라는 것이 이상한 소리처럼 들리겠지만, 많은 보안 커뮤니티가 정보를 공유하기 위해 트위터를 쓴다. 그리고 최근 연구, 취약점, PoC, 컨퍼런스 발표자료 소스같은것도 올라온다. 나는 이런것들이 어떻게 올라오는지 모르지만, 불필요하게 긴 토론이 있는 것 보다는 이런식으로 공부 자료들에 대한 링크를 공유하는 것이 더 높아 보인다. 그러므로 트위터에서 관심있는 보안 관련 자료들을 게시하는 사람들을 찾아라.



트위터 말고도, 너가 관심있을 만한 자료들을 찾을 수 있는 곳이 또 있다. r/netset고 해커뉴스이다.(비록 요녀석들은 보안과는 관계없는것들도 공유하긴하지만) 컨퍼런스 발표자료와 녹음본들도 확인해라(그런 자료들이 많다, 하지만 모두 다 좋은 자료는 아니긴 하다. 기술적인 부분에만 집중해서 봐라)


CTF를 하는 것은 배우기 좋은 방법 중 하나이다.



나는 해본적이 없지만 남에게는 추천하는 이상한 충고가 또 있지만, 내가 학습 곡선을 그린 것을 기억하는가? CTF는 다양한 어려움에 직면하기 때문에 학습을 점근적으로 하도록 해줄 수 있다.(각 문제의 점수로 난이도를 알 수 있다.) 따라서 쉬운 것 부터 시작해서 공부하게 할 수 있다. 예를 들어 미티게이션이 해제된 체 있는 익스플로잇 문제가 있는 경우가 있다. 그런 것을 익스플로잇 할 수 있는 버그와 방법이 있다는 것을 알게 되는식으로 공부할 수 있다.



CTF는 거의 매주 있으며 대부분 온라인에서 참여할 수 있다. 여기서 일정을 찾을 수 있다.(ctftime.org) 문제를 푸는 것을 실패한 경우, 문제 푼 사람들의 write-up을 확인하는 것을 잊지 말라.



CTF는 만족스러운 경험일 수 있지만, 그 이후에 실제 목표를 달성하기 위해 리얼월드 취약점을 찾으러 나가고 시도하는 것을 두려워 하지 말라. 너는 스스로 놀랄것이다.


그리고 리얼월드 취약점을 찾으러 나갔을때


실패를 두려워하지 말라, 많이하더라도


특히 최근에 취약점 분석 연구는 너를 매우 시무룩하게 할 수 도 있다. 너가 시도하는 대부분의 타겟들은 너가 원하는 대로 동작하지 않을 것이고, 너는 그걸 받아들여야 한다. 그렇다고 시도를 포기하지 마라. 이런 일은 너에게만 일어나는 것이 아니라, 나한테도 일어나고 다른 경험많은 연구원들도 똑같이 겪는 일이다. 하지만 다른사람들은 결국 성공하기 때문에 이런 일은 너에게만 일어난다고 생각하기 쉽다. 중요한 점은, 너의 아이디어가 실패했을 경우 왜 실패했는지를 파악하는 것이다.


너는 너 생각보다 똑똑하다(반대로, 다른 사람들은 너가 생각하는 것 보다 똑똑하지 않다)



다른 사람들은 "너는 개발자 보다 똑똑하지 않다"라는 조언을 주었기 때문에, 이 조언은 논란의 여지가 있을 수 있습니다. 이러한 조언은 맞는 말이고, 실제로 이미 산업에 있는 많은 사람들에게 좋은 조언입니다. 하지만, 이제 막 입문하였거나 입문하려는 사람들에게는 잘못된 조언일 수 있습니다. 해당 분야에서 해낸 것이 아무것도 없는 상태에서 똑독한 사람들이 직접 하는 일들을 보면, 자신의 능력을 의심하기 쉽다는 것입니다. 내 개인적인 예를 하나 들어보겠습니다.



지금은 이상하게 들릴 수 있지만, 내가 보안을 취미로 처음 시작했을 때 Windows에서 버그를 발견할 만큼 충분히 "l33t"가 될 수 없을 것이라 생각했습니다. 그리고 내가 우연히 윈도우 버그를 발견하기 전 까지 시도조차 하지 않았습니다. 나는 오래된 이미지 라이브러리를 퍼징하고 있었고 잠시후 크래시를 일으키는 샘플이 있었습니다. 그리고 내가 우연히 그 크래시 샘플을 윈도우에서 눌렀을때, 윈도우 익스플로러가 크래시가 났고 그것은 CVE-2008-3013이었습니다.



다른 케이스도 있다. 소프트웨어를 리뷰하는 도중에, 이러한 생각이 들 수가 있다. "와, 바보같이 개발자들은 분명 그렇게 생각했다." 이러한 일은 종종 일어날 수 있다. 이거는 그들이 멍청해서그런게 아니라 그 당시 다른 문제를 생각했기 때문입니다. 하지만 "나는 그들보다 더 똑똑하다"는 사고 방식을 통해 자신이 스스로 설정한 한계를 뛰어넘을 수는 있지만, 다른데서 겸손해지게 되는 문제를 일으킬 수 있습니다.


당신이 다른사람들, 특히 개발자들과 이야기할 때 그런 생각을 놓을 때입니다. 당신이 그들을 적으로 만나지 않고 같이 일할 사람으로 만난다면 대화하면서 즐거운 시간을 보낼 수 있을 것입니다. 이것은 당신이 듣는 모든것을 믿으라는 뜻은 아닙니다. 명심하세요, 그들은 그들이 작성한 코드의 전문가이지만 당신은 보안에서 전문가입니다.


내가 가지고 있는 기술을 세상에 보여줄 준비가 되었을때 무엇을 해야하나요?



처음에는 돈을 벌면서 무언가를 할 수 있습니다. 많은 회사들은 자신들의 제품에 있는 버그를 찾기 위해 크고 작은 버그바운티를 합니다. 구글과 페이스북, 마이크로소프트가 그렇지요.



버그바운티 상금이 없는 제품을 보더라도, 많은 사람들이 사용하는 것이므로 버그를 발견하면 당신의 기술을 뽐낼 수 있는 좋은 방법이 될 수 있습니다. 그러면 다른 사람들도 당신을 알아채기 시작할 것입니다.



불균형적으로 많은 관심을 얻겠지만, 취약점을 리포트하는 것은 커뮤니티에 기여하는 유일한 방법은 아닙니다. 유용한 도구를 만들고 방어 리서치를 하는 것도 멋진 방법입니다!


내가 더 알아야 하는게 있나요?


보안 연구원의 삶은 당신이 상상하는 것 처럼 영광스럽지 않을 수 있습니다. 컴퓨터 앞에 오랫동안 앉을 것입니다. 그래서 뭔가 괜찮은 아이디어를 얻었는데 그것이 커리어에 좋은 경로가 아닐 수 있다. 또한 꽤 지적으로 도전적이고 일상적이지 않은 일입니다. 이것은 꽤나 보람이 있을 수 있지만 정신적으로 힘들 수 있다는 것을 의미합니다.

본 포스팅은 구글 프로젝트 제로의 멤버인 Ivan Fratric이 'So you want to work in security?'라는 제목으로 정보보안 직종에 종사하고 싶은 후배들에게 조언한 블로그 포스팅을 번역한 포스팅입니다.


번역 상에 오역이 있을 수 있으므로, 원문도 같이 첨부합니다.


원문 링크 : http://ifsec.blogspot.kr/2018/02/so-you-want-to-work-in-security-and-for.html?m=1


그래서 보안쪽 일을 하고 싶다고?


많은 사람들(내 구글 직장동료인 Parisa와 Michal을 포함해서)이 이미 이 주제에 대해 좋은 포스팅들을 많이 썻고 나도 그 포스팅들을 읽어보는 것을 추천한다. 내생각에는 내가 이제부터 할 말들은 걔내들이 이미 말한것들과 많이 겹치겠지만, 사람들이 이러한 주제로 나한태 물어볼때마다 채팅으로 치고, 앞서 말한 사람들의 포스팅들 링크를 던져주는 것 보다는 내가 직접 내 의견을 담은 내 포스팅을 쓰는게 낫다고 생각해서 쓰게 되었다.


일단, 나는 응용 보안을 하고, 취약점 연구부터 보안 리뷰, 버그헌팅, 해킹 등 너가 perspective라고 부르는 것들을 한다. 그리고 이쪽 보안바닥에 다른 커리어도 있는데, 보안개발이나 악성코드 분석, 인프라 보안과 기타 내가 잘 모르는 분야들, 내가 잘 몰라서 조언해주기 어려운 분야들도 있다.


그래서 내가 누구이고, 너가 내가 하는말을 왜 믿어야하냐? 음, 일단 나는 너가 내 말을 무조건 믿어야한다고 생각하지 않는다. 왜냐면 각각의 사람들은 각각의 경험이 있고 각각의 사람들이 걸어온 길은 다 다르니깐. 하지만 아마 너가 이쪽에 관심이 있을수 있으니 설명하자면, 나는 지금 구글 프로젝트 제로의 멤버이고, 구글 보안팀에서 일했었다. 그리고 너가 아마 이 블로그의 옛날 글들을 잘 뒤적거렸을 경우 발견할 수 있는 몇개의 보안툴들을 직접 만들었다.(근데 좀 업데이트가 안되서, 확인해보려면 GPZ 블로그의 가장 최신 포스팅을 봐라.) 그러면 너는 내가 10년넘개 보안관련 일들을 했다는것을 알 수 있을거다.


근데  나는 원래 이쪽바닥이랑은 좀 다른 전공지식을 갖고있는데, 내가 아는 보안하는 인간들은 정말 다양한 전공 출신이다. 예를 들어 나는 다양하게 학술적 기반을 갖고 있다.(전산학 박사, 그리고 대학에서 오랜기간 일했다) 하지만 내가 전산학 박사를 땃다는 것은 내가 같이 일하는 동료들 사이에서는 좀 특이한 케이스이고, 보안을 하기 위해서 이러한 조건이 필요한 것도 아니다. 이건 물론 학위를 따지 말라는 소리는 아니며, 내 전산학 지식이 나중에 내 기술 기반을 쌓아올리는데 많은 도움이 됬다고도 생각한다. 하지만 너가 이미 선택했거나 가지고 있는 학벌과는 관계없이, 이 보안 바닥에 종사하는 사람들이 공통적으로 가지고 있는 특징이 있는데, 이 특징에서 내가 주는 첫번째 팁이 있다.


너만의 일을 해라

내가 이쪽 바닥에서 알고있는 대부분의 사람들은, 보안은 일이기 이전에 취미로 시작했다. 당연히 너가 보안에 갓 입문하려고 할때, 너한태 어떻게 입문하는지도 알려주지 않고 "너 만의 일을 해라"라고 말하는건 별로 도움이 안되겠지. 계속 읽어봐라, 왜냐면 나중에 답이 나오니까. 하지만 명심해라(너를 기죽일려고하는게 아니라, 나중에 대처법도 알려줄거다)



지금을 보지마라, 하지만 10년전에 입문하는건 지금 입문하는 것 보다 훨신 어려웠다.


모든 사람들이 인정하진 않겠지만, 보안은 시간이 지날수록 매우 크게 발달되었다. 물론, 니가 적당히 잘 파보면 10년전의 기술이 여전히 동작하는 하드웨어와 소프트웨어들을 찾을 수 있을것이다. 하지만 예를들어 웹브라우저를 봐라. 내가 맨 처음 윈도우 익스플로잇을(힙 오버플로) 했을때, 마이크로소프트가 Safe Unlinking 기술을 도입해서 잘 알려진 힙 익스플로잇 테크닉들을 막아버렸을때 기죽었었다. 10년 뒤에 브라우저에서 익스를 하는 사람은 Safe Unlinking과 스택 쿠키 뿐만 아니라, SafeSEH/SEHOP, DEP, ASLR, CFG, ACG와 샌드박스 등에 대해 잘 알고 그걸 우회해야 한다. 그리고 이런것은 웹 브라우저에만 적용되는 것이 아니다. 만약에 너가 10년전의 웹 어플리케이션 프레임워크와 지금의 것과 비교를 한다면 보안 부분에서 매우 큰 차이가 있다는 것을 알 것이다.


겁내지마라, 윗 단락에서 나온 단어들은 너에게 아무런 의미가 없다(아직까진)


그래서 어떻게 저렇게 빨리 발전하는 방어기법들과 싸울것인가?


학습자료들을 이용해라


일반적으로 진입장벽이 계속 높아지고 있지만, 팩트는 공부할 자료들도 이전보다 매우 많아졌다는 것이다.


그렇다고 안심할 순 없는게, 너가 나가서 스스로 공부할 수 있는 능력이 있어야 한다. 그 누구도 너의 손을 잡고 하나하나 알려주는 멘토가 되주지 않을 것이다(Sith에게 견습생으로 있을 수 있지만, 해커들이 그런식으로 일하는 경우는 거의 없다). 만약에 너가 잘 짜여진 커리큘럼을 따라가는 것을 좋아한다면(대부분의 공부를 그런식으로 한다면) 너는 보안을 하기는 힘들것이다.


너가 괜찮은 공부 자료를 구하기 전에, 너는 괜찮은 질문들을 던져야 한다. "해킹하는법"과 같은 단어로 구글링을 하면 지금까지 봐왔던 거지같은 결과만 나올 것이다. 대신 더 괜찮은 질문들을 해야 한다. 다음과 같은,


내가 관심있는 하드웨어/소프트웨어가 어떻게 동작하는가? 어떤 기술이 기반이 되는가? 내가 볼 수 있는 소스코드가 있는가? 튜토리얼? 서적?



내가 대상으로 하는 하드웨어/소프트웨어를 누군가가 공격시도한 적이 있는가? 그들이 write-up을 올려놓았는가? 익스플로잇을 올렸는가? 컨퍼런스 발표자료가 있는가? 내가 정말로 그사람들이 한 것들을 이해하는가?



따라서 누군가 실제로 만든 소프트웨어나 하드웨어가 어떻게 작동하는지 이해하려면 기술적으로 정통해야 합니다. 코드를 작성하는 것과 읽는 것은 정확히 같은 능력이 아닙니다. 만약 당신이 코딩을 쉽게쉽게 할 수 없다면 보안 공부를 깊게 하기 전에 이것부터 먼저 해야 합니다.



두번째 포인트를 잊지 마시오. 나는 예전에도 기술적으로 아는 것이 꽤나 많았지만, 내가 실제로 사람들이 공개한 취약점 연구와 익스플로잇들을 보기 시작하기 전에는 보안에 대한 내 이해도가 낮았다.



그리고 조언을 하나 더 하자면, 너가 모르는 무언가를 맞닥드렸을때 절때 포기하지 마라. 특히 너가 공부를 시작하고 다양한 자료들을 읽을때, 너가 모르는 무언가를 만날 경우가 매우 많을 것이다. 그 내용을 이해하지 않고 넘어가는 것은 쉬운 방법이지만, 한편으론느 잘못된 방법이기도 하다. 너가 모르는 무언가를 맞닥드렸을때, 모른다고 어렵다고 하기보다는 새로운 것을 배울 수 있는 단서가 된다고 생각해라.



내가 아무도 너의 손을 잡고 이끌어주지 않는다고 썻긴 했지만, 이 말이 너가 질문을 하지 말아야한다는 것은 아니다. 너는 편하게 생각해야 한다. 사람들은 너의 일을 대신해주지 않겠지만, 너가 멘붕에 빠졌을때 적절한 방향으로 가도록 도와줄 것이다.

백준저지에서는 다양한 언어를 지원합니다. 그 중에서도 32bit Assembly 언어도 지원을 합니다. 32bit Assembly로 백준저지에서 간단한 문제를 풀어보도록 하겠습니다.


일단 로컬에서 Assebmly 코딩을 하기 위해서 어셈블 환경을 만들어 볼 것인데요, 일단 Ubuntu 16.04기준으로 하겠습니다.


nasm과 gcc를 설치해줍니다. 만약 호스트가 64bit 운영체제라면 32bit 컴파일을 위해서 gcc-multilib을 설치해줘야 합니다.


다음 명령어로 어셈블리를 ELF파일로 빌드할 수 있습니다.


nasm -f elf32 assembly.asm -o assembly.o gcc -m32 assembly.o -o assembly.out


어셈블러로 어셈블리 소스코드를 오브젝트 파일로 바꾼 뒤, 실행가능한 ELF 바이너리로 빌드하는 과정입니다.


https://www.acmicpc.net/problem/2557


백준 2557번 Hello World를 어셈블리 코드로 작성해보도록 하겠습니다.


printf 라이브러리 콜을 이용해서 작성한 코드입니다.


extern을 이용해서 사용할 함수 명을 가지고 오며, 함수의 인자를 스택에다가 push해서 호출하는 것을 확인할 수 있습니다. Calling convention에 따라서 Caller function에서 스택을 정리하는 모습(add esp, 4)도 보입니다.

 
extern printf
section .data
    msg : db "Hello World!", 0xa, 0
        
section .text
    global main
main:
    push msg
    call printf
    add esp, 4
ret



write 시스템 콜을 이용해서 작성한 코드입니다.

int명령어로 인터럽트를 발생해서 시스템 콜을 호출하며, 시스템 콜 인자를 지정된 레지스터에 넣어서 호출하는 것을 확인할 수 있습니다.

EAX에는 시스템 콜 번호(write의 시스템 콜 번호는 4입니다), EBX는 첫번째 인자(stdout=1), ECX는 write할 Address로 두번째 인자, EDX는 세번째 인자로 문자열의 길이가 들어가게 되었습니다.

 
M: db "Hello World!"
section .text
global main
main:
    mov edx, 12
    mov ecx, M
    mov ebx, 1
    mov eax, 4
    int 0x80
    ret


어셈블리로 ps 문제 등을 풀면 어셈블리 언어에 대한 이해도가 늘고 리버싱이 쉬워질 것 같습니다.

GDB는 일반 어플리케이션 디버거로서도 사용되지만, 특히나 시스템 해킹을 공부하는 사람들이 많이 사용하곤 한다. 자주 사용하는 명령어들을 한번 정리해보겠다.


1. 실행

바이너리 실행 및 디버거 Attach

gdb -q [파일명]


런타임 Attach

gdb -q -p [pid]


2. 메모리 검사(Examine/ x 명령어)


x/[개수][포맷][크기] [주소]


개수에는 숫자가 들어간다


포맷은 다음의 경우가 있다.

1) x - 16진수

2) d - 10진수

3) c - 문자

4) s - 스트링

5) i - 인스트럭션(어셈블리 명령어)


크기는 다음의 경우가 있다.

1) b - 바이트(1byte)

2) h - 하프워드(2byte)

3) w - 워드(4byte)

4) g - 자이언트(8byte)


주소는 다음과 같이 있다.

1) 0xabfdefg - 16진수로 주소값을 직접 사용

2) $eip - 레지스터가 가지고 있는 값의 메모리 주소를 검사. 레지스터 이름 앞에 $를 붙여야 한다.



3. 디버기(debugee) 프로세스의 pid 및 정보 알아내기

(gdb) info inferior


4. 브레이크 포인트 걸기


(gdb) b *0x808080 
(gdb) b *main 
(gdb) b *main+5


와 같이 다양하게 브레이크 포인트를 걸 수 있다.


5. 브레이크 포인트 걸린 위치 확인


(gdb) info b


6. 프로세스 실행

(gdb) run

혹은

(gdb) r


7. 다음 브레이크 포인트까지 계속 실행

(gdb) continue

줄여서

(gdb) cont


8. 한 인스트럭션만 실행

(gdb) next instruction

(gdb) ni


-----------------

syscall들

https://syscalls.kernelgrok.com/



지난 포스팅인 Lord of SQL Injection 사이트 소개에 이어서 해당 워게임 사이트의 첫번째 문제를 풀어보도록 하겠습니다. 첫번째 몬스터인 그램린을 클릭하자 다음과 같은 페이지가 나타나게 됩니다.


페이지에 나타난 부분은 php 소스코드입니다. 실제 웹사이트에서 php와 같은 서버사이드 언어의 소스코드를 획득할 수 있을 가능성은 매우 낮지만, 공부를 목적으로하는 워게임 사이트이다 보니 소스코드를 보여주고, SQL Injection을 이용하여 공격을 해 보라는 뜻입니다. solve("gremlin")이라는 함수를 실행시키도록 하면 문제가 풀릴 것으로 보입니다.


또 관찰해 보면 mysql_fetch_array라는 함수를 실행시키는 모습이 보입니다. 이것으로 보아서 서버는 MySQL DBMS를 사용한다는 것을 알 수 있습니다.


$query 부분에 SQL 쿼리를 생성시키는 모습입니다. 인자값으로 $_GET[id]와, $_GET[pw]의 값을 받습니다. 즉 $_GET[pw]는 사용자가 임의로 변경시킬 수 있는 입력값입니다. $query가 실행되었을 때, 만족되는 값이 하나라도 나타나면 성공입니다.


SQL Injection에 처음 입문 시 많이 사용하는 쿼리인 ' or 1=1 # 또는 ' or 1=1 -- 를 사용해 보겠습니다.


url에 맨 마지막 부분에 다음과 같이 추가적으로 입력한 뒤 엔터를 쳐 봅니다.


?id=%27%20or%201=1--%20a

HTTP GET 방식으로 쿼리 파라메터 id에 %27%20or%201=1--%20a라는 값을 넣어서 전송하겠다는 뜻입니다.


여기서 %27은 URL 인코딩이 된 값으로 ' 문자(싱글쿼터)를 뜻합니다.

F12를 눌러서 크롬 개발자도구를 띄운 뒤, Console 탭에 다음과 같이 입력해서 %27가 싱글쿼터가 맞음을 확인할 수 있습니다. 비슷한 원리로 encodeURI('\'')라고 입력하면 %27가 출력되게 됩니다.


쿼리가 위와 같이 변경되면서 클리어가 됩니다.


왜 이러한 SQL 구문을 통해서 클리어가 될 까요? Subline text에 해당 쿼리를 한번 그대로 입력해보겠습니다.

구문 강조(Syntax Highlighting)을 SQL로 설정한 뒤 해당 쿼리를 입력해 보니, -- 문자 이후는 회색처리가 되어있습니다. 즉 주석으로 인식한다는 뜻입니다.


MySQL에서 지원하는 SQL 문법에 대하여 정확하게 알아보려면 해당 공식 사이트의 레퍼런스 메뉴얼을 참조하는 것입니다.

https://dev.mysql.com/doc/refman/5.7/en/comments.html

위 링크는 MySQL에서 주석문에 대한 매뉴얼 페이지입니다.


MySQL에서 주석은 /* */으로 여러 줄 주석처리가 가능하며, #이나 -- 으로 한 줄 주석처리가 가능합니다. 이 때, -- 로 한 줄 주석처리를 할 경우 -- 이후 공백 문자 1칸이 반드시 필요합니다. 이렇게 뒷 부분이 주석처리가 되다 보니 where 구문은 id='' or 1=1으로 인식되는데, 1=1 구문때문에 항상 참 값을 갖게 되어서, 해당 테이블에 있는 모든 id값이 출력되게 됩니다.


웹해킹 공부를 하기 좋은 방법이 여러가지가 있는데, 그 중 하나는 웹해킹 워게임을 푸는 것이라고 생각합니다. 워게임은 해킹관련 문제들을 풀어볼 수 있는 사이트라고 보시면 이해하기 편합니다.


그러한 웹해킹 워게임 사이트 중에서도, SQL Injection이라는 해킹 기법에만 초점을 맞춘 워게임 사이트가 있는데, 통칭 Lord of SQL Injection이라고 불립니다.


해당 사이트 링크는 다음과 같습니다.

https://los.eagle-jump.org/


이 사이트는 Rubiya라고 하시는 분이 제작했다고 알려져 있고 당연한 이야기일 수도 있겠지만 SQL Injection에 관심이 많다고 합니다. (운영은 stypr이라는 분이 한다고 하네요)


Rubiya라고 하는분이 해커스쿨 사이트에 올린 SQL Injection 관련 문서들도 있습니다.


초보자용 문서

http://hackerschool.org/Sub_Html/HS_Posting/?uid=42

전문가용 문서

http://hackerschool.org/Sub_Html/HS_Posting/?uid=43


SQL Injection은 간단하게 설명하자면, 웹 사이트 사용자가 입력한 값이 웹 서버로 가서, 그 값을 토대로 SQL 쿼리문을 만들고, 그 쿼리로 DBMS에 명령을 내립니다. 이때 사용자가 입력한 값이 SQL 쿼리문을 요렇게 저렇게 변형시켜서 웹 사이트 개발자가 의도하지 않은 동작을 하도록 만드는 공격 기법이 SQL Injection이라고 할 수 있습니다.


웹 어플리케이션을 개발해보신 분이라면 좀 더 이해하기 쉽겠지요? 그래서 웹 해킹을 잘하려면 웹 개발에 대하여 잘 알아야 한다는 이야기도 있습니다. 스타트업 회사에서 인턴을 하면서 웹 개발을 1년가까이 해본 저로서는 맞는 이야기라고 생각합니다. 웹 개발 경험이 많이 있거나, 웹 서비스 자체에 대한 이해도가 높을 수록 웹 해킹 기법에 대하여 알게 되었을 때 빨리빨리 습득한다고 생각합니다.


이제 Lord of SQL Injection 사이트에 대해 좀더 알아보겠습니다.


위에 알려진 링크로 이동하시면 다음과 같은 페이지가 나타납니다.



이 사이트는 IE(Internet Explorer: 인터넷 익스플로러)를 지원하지 않는다라는 이야기가 보이네요. 웹 해킹을 하시려면, 아니 웹 개발과 같은 웹 관련된 무언가를 하시려면 필수적으로 크롬 브라우저는 설치하시는 것을 추천합니다. 이유는 다양하게 있겠지만, 웹 표준을 가장 잘 준수하는 웹 브라우저이기도 하고, 성능과 보안측면에서도 뛰어나며, 여러 강력한 확장 프로그램들도 지원합니다. 크롬 브라우저에 내장된 개발자도구 역시 좋습니다.


enter to the dungeon을 눌러서 로그인 페이지를 한번 띄워보겠습니다.

아주 심플한 로그인/회원가입 창이 나타납니다. 이런 워게임 사이트에 가입을 하실 때 어느정도 눈치채신 분도 있겠지만, 일반적인 웹 서비스를 제공하는 사이트에 비해 UX가 몹시 떨어집니다. Join 버튼을 눌렀을 때, 패스워드 확인과 같은 필드가 아예 없는 것을 비롯해서, 비밀번호 찾기 등의 기능도 없습니다. 패스워드의 길이제한이라던지, 특수문자를 몇개를 넣으라던지 같은 제약사항도 없는 경우가 많습니다.


그리고 한가지 더 조언해드리는 바로는 이러한 사이트들은 보통 소위말하는 해커, 정보보안쪽에 관심이 많거나 그쪽 분야에 종사하는 분들이 만든 사이트이고 일반적으로 회원가입한 패스워드가 서버에 암호화되어 저장되지 않을 가능성이 높습니다. 다르게 말하면 여러분들이 가입할때 기입한 패스워드는 사이트 운영자가 그대로 볼 수 있다는 것이지요. 따라서 패스워드는 1234 등과 같이 털려도 상관없는 값으로 하는 것을 추천드립니다.


이렇게 회원가입 후 들어가보도록 합시다.


대충 이러한 페이지가 나타나게 된다. 저기 나타난 몬스터들이 각각 Level의 문제들을 나타내는 것이고, 몬스터 이미지를 클릭하면 해당 문제로 넘어갈 수 있다. 일단 첫번째 저 몬스터를 클릭해서 Level 1을 풀어보겠습니다.


+ Recent posts