네트워크의 보안을 위협하는 공격 기법은 다양한 것들이 있다. 이번에는 SQL injection을 중심으로 가양한 공격 기법들을 확인해 보자.
SQL injection은 공격자가 임의의 SQL문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 공격법이다. 이는 비교적 쉬운 방법이면서도 성공 시 큰 피해를 입힐 수 있는 공격으로 OWASP Top 10 중 첫 번째에 속해 있다.
오픈 웹 애플리케이션 보안 프로젝트(OWASP)는 웹 애플리케이션 보안에 전념하는 국제 비영리 단체이다. 여기서 발간하는 OWASP Top 10은 정기적으로 업데이트되는 보고서로 가장 중요한 10가지 위험에 초점을 맞춰 웹 애플리케이션 보안에 대한 보안 문제를 설명한다.
SQL 공격 기법은 여러 가지가 있는데, 크게 다음과 같이 여섯 가지로 구분 가능하다.
논리적 에러를 이용한 공격법으로, 가장 많이 쓰이는 대중적 공격 기법이다.
상기 그림에 나타난 쿼리문의 경우 'OR 1=1--'을 주입함으로써 -- 뒤의 구문을 주석처리하였다. 매우 간단한 구문이지만, 결론적으로는 Users 테이블의 모든 정보를 조회하게 되고, 이를 통해 가장 먼저 만들어진 계정(일반적으로는 관리자 계정이 가장 먼저 만들어진다)으로 로그인에 성공하게 된다. 이렇게 관리자 계정을 탈취한 공격자는 2차 피해를 발생시킬 수 있다.
UNION 명령어를 이용하여 의도하지 않은 테이블의 데이터까지 조회하는 방법이다.
상기 그림의 경우 원래의 쿼리문은 Board 테이블의 데이터만을 조회하려고 했으나, UNION 구문을 중간에 삽입함으로써 Users 테이블의 정보까지 조회할 수 있도록 하였다.
Blind SQL injection은 DB로부터 특정한 값이나 데이터를 전달받지 않고 단순히 참이나 거짓의 정보만을 알 수 있을 때 사용한다. Boolean based와 Time based로 구분할 수 있다.
Boolean based의 경우 서버가 응답하는 로그인 성공 및 실패 메시지를 이용하는 것인데, 상기 그림에서처럼 임의로 가입한 아이디(abc123)와 함께 '테이블명을 조회한 뒤 조회된 테이블명의 첫 글자를 ASCII로 바꾸어 뒤의 숫자(100)와 비교하는 구문'을 input에 넣어 준다. 유저 정보가 담긴 테이블이 Users라는 이름이라면 U가 아스키 코드로 변경된 수를 100과 비교하게 되고, 이것이 참이 되면 로그인에 성공하게 된다. 즉, 결과가 참이 될 때까지 뒤의 100이라는 숫자를 바꾸어 가면서 로그인을 시도함으로써 테이블의 정보(여기서는 테이블명)를 알아내는 것이다.
Time based의 경우도 서버로부터의 참 혹은 거짓 응답을 통해 데이터베이스의 정보를 유추하는 기법이다.
상기 그림은 Time based를 이용해 현재 사용 중인 데이터베이스의 길이를 알아내는 방법이다. DATABASE 함수를 통해 데이터베이스의 이름을 반환하고 그 길이가 1이라면 뒤에 위치한 SLEEP(2) 함수가 동작하게 함으로써 데이터베이스의 길이를 알아낼 수 있다.
'저장 프로시저(Stored procedure)'는 일련의 쿼리를 모아 하나의 함수처럼 사용하기 위해 만들어 둔 것이다. 공격자가 시스템 권한을 획득해야 공격이 가능하므로 난도는 높은 방법이지만, 성공한다면 서버에 직접적인 피해를 입히는 것이 가능하다.
2008년 처음 발견된 기법으로, 기존의 기법과 달리 한 번의 공격으로 다량의 데이터베이스를 조작함으로써 큰 피해를 입히는 방법이다.
OS command는 운영체제의 명령어를 말한다. OS 명령 주입은 승인되지 않은 운영체제 명령을 실행하도록 하는 공격법이다.
OS 명령 주입은 웹 애플리케이션이 실행될 때 정제되지 않고 필터링되지 않은 시스템 명령을 보낼 때 발생할 수 있다. 입력 유효성 검사가 불충분할 경우 공격자는 쉘 수준에서 작동하도록 자신의 명령을 주입할 수 있으며, 쿠키, 양식 또는 HTTP 헤더 등을 이용해 운영체제 명령을 도입한다.
XXE(XML eXternal Entity) injection은 외부 개체의 주입을 의미한다. 쉽게 말해 SQL injection이 SQL문을 주입하여 공격하는 것이라면, XXE injection은 XML을 주입하여 공격하는 것으로 이해하면 된다. XML 외부 개체를 참조할 때 XML이 아닌 다른 파일을 불러들이도록 하는 공격이다.
공격자가 게시판 등에 악의적인 스크립트가 담긴 게시글을 삽입하고, 사용자가 해당 게시글을 클릭할 경우 스크립트가 실행되어 공격하는 기법이다. 크게 '돔 기반(Dom based) XXS, 저장(Stored) XXS, 반사(Reflected) XXS'의 세 가지로 구분할 수 있다.
피해자의 브라우저에서 DOM 환경을 수정하여 클라이언트가 예상하지 못한 방식으로 공격 구문을 실행하는 XSS 공격이다. 즉, 페이지 자체(HTTP 응답)는 변하지 않지만, 페이지에 참조되는 클라이언트 측의 코드가 변조되어 공격 구문이 실행된다.
앞서 말했던 '게시물에 악성 스크립트를 삽입하고 피해자가 해당 게시물을 클릭하는' 공격이 여기에 해당한다. 공격자는 이를 통해 사용자의 쿠키, 세션 등 원하는 정보를 획득한다. 즉, 세션 하이재킹(Session Hijacking)dl rksmdgowlsek.
세션 하이재킹은 말 그대로 세션을 탈취하는 것으로, 세션을 탈취하면 로그인된 상태를 가로챌 수도 있고 세션에 담긴 정보를 확인하여 이를 이용한 다양한 공격이 가능해진다.
URL의 CGI(Common Gateway Interface) 인자에 스크립트 코드를 삽입하는 것이다. 예를 들어 공격자가 이메일로 어떤 웹 페이지의 링크를 보내고 사용자가 해당 링크를 클릭하면 그 링크에 대한 웹 페이지가 화면에 나오게 되는데, 이때 해당 링크에 삽입된 스크립트 코드가 실행되면서 웹 페이지의 내용이 변경되는 것이다.
CGI는 웹 서버와 외부 프로그램 사이에서 정보를 주고받는 방법 혹은 규약들을 의미한다.
일반적인 해킹 공격과는 달리 클라이언트를 대상으로 하는 공격이라는 점에서 주의할 필요가 있다.
공격자가 게시판에 악의적인 스크립트가 담긴 게시글을 올리고, 해당 게시글을 클릭하면 사용자의 인증 권한을 이용해 의도하지 않은 요청이 서버에 전송되도록 하는 공격 기법이다. 이때 스크립트를 이용해 사용자의 패스워드를 변경하는 것도 가능하다.
CSRF는 XSS와 비슷하지만 주요한 차이가 있는데, XSS의 경우 사용자가 해당 웹페이지를 신용한다는 점을 이용하는 것이라면 CSRF는 특정 웹사이트가 사용자의 브라우저를 신용하는 상태를 이용한다는 것이다. 즉, 사용자가 로그인한 상태에서 서버의 신뢰를 얻고, 그 상태에서 요청 위조 공격 코드가 삽입된 페이지를 열면 웹 사이트는 그 위조된 공격 코드가 '믿을 수 있는 사용자'로부터 발송된 것으로 판단한다는 것이다.