[CS Study] Network - 보안 공격 기법

Frye 'de Bacon·2023년 11월 8일
0

Computer Science(CS)

목록 보기
9/40

네트워크의 보안을 위협하는 공격 기법은 다양한 것들이 있다. 이번에는 SQL injection을 중심으로 가양한 공격 기법들을 확인해 보자.

SQL injection

SQL injection은 공격자가 임의의 SQL문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 공격법이다. 이는 비교적 쉬운 방법이면서도 성공 시 큰 피해를 입힐 수 있는 공격으로 OWASP Top 10 중 첫 번째에 속해 있다.

오픈 웹 애플리케이션 보안 프로젝트(OWASP)는 웹 애플리케이션 보안에 전념하는 국제 비영리 단체이다. 여기서 발간하는 OWASP Top 10은 정기적으로 업데이트되는 보고서로 가장 중요한 10가지 위험에 초점을 맞춰 웹 애플리케이션 보안에 대한 보안 문제를 설명한다.

SQL 공격 기법은 여러 가지가 있는데, 크게 다음과 같이 여섯 가지로 구분 가능하다.

Error based SQL injection

논리적 에러를 이용한 공격법으로, 가장 많이 쓰이는 대중적 공격 기법이다.

상기 그림에 나타난 쿼리문의 경우 'OR 1=1--'을 주입함으로써 -- 뒤의 구문을 주석처리하였다. 매우 간단한 구문이지만, 결론적으로는 Users 테이블의 모든 정보를 조회하게 되고, 이를 통해 가장 먼저 만들어진 계정(일반적으로는 관리자 계정이 가장 먼저 만들어진다)으로 로그인에 성공하게 된다. 이렇게 관리자 계정을 탈취한 공격자는 2차 피해를 발생시킬 수 있다.

Union based SQL injection

UNION 명령어를 이용하여 의도하지 않은 테이블의 데이터까지 조회하는 방법이다.

상기 그림의 경우 원래의 쿼리문은 Board 테이블의 데이터만을 조회하려고 했으나, UNION 구문을 중간에 삽입함으로써 Users 테이블의 정보까지 조회할 수 있도록 하였다.

Blind SQL injection - Boolean based SQL

Blind SQL injection은 DB로부터 특정한 값이나 데이터를 전달받지 않고 단순히 참이나 거짓의 정보만을 알 수 있을 때 사용한다. Boolean based와 Time based로 구분할 수 있다.

Boolean based의 경우 서버가 응답하는 로그인 성공 및 실패 메시지를 이용하는 것인데, 상기 그림에서처럼 임의로 가입한 아이디(abc123)와 함께 '테이블명을 조회한 뒤 조회된 테이블명의 첫 글자를 ASCII로 바꾸어 뒤의 숫자(100)와 비교하는 구문'을 input에 넣어 준다. 유저 정보가 담긴 테이블이 Users라는 이름이라면 U가 아스키 코드로 변경된 수를 100과 비교하게 되고, 이것이 참이 되면 로그인에 성공하게 된다. 즉, 결과가 참이 될 때까지 뒤의 100이라는 숫자를 바꾸어 가면서 로그인을 시도함으로써 테이블의 정보(여기서는 테이블명)를 알아내는 것이다.

Blind SQL injection - Time based SQL

Time based의 경우도 서버로부터의 참 혹은 거짓 응답을 통해 데이터베이스의 정보를 유추하는 기법이다.

상기 그림은 Time based를 이용해 현재 사용 중인 데이터베이스의 길이를 알아내는 방법이다. DATABASE 함수를 통해 데이터베이스의 이름을 반환하고 그 길이가 1이라면 뒤에 위치한 SLEEP(2) 함수가 동작하게 함으로써 데이터베이스의 길이를 알아낼 수 있다.

Stored procedure SQL injection

'저장 프로시저(Stored procedure)'는 일련의 쿼리를 모아 하나의 함수처럼 사용하기 위해 만들어 둔 것이다. 공격자가 시스템 권한을 획득해야 공격이 가능하므로 난도는 높은 방법이지만, 성공한다면 서버에 직접적인 피해를 입히는 것이 가능하다.

Mass SQL injection

2008년 처음 발견된 기법으로, 기존의 기법과 달리 한 번의 공격으로 다량의 데이터베이스를 조작함으로써 큰 피해를 입히는 방법이다.

대응 방안

  1. 입력 값에 대한 검증
    SQL Injection 에서 사용되는 기법과 키워드는 엄청나게 많으므로 사용자의 입력 값에 대한 검증이 필요하다. 따라서 서버 단에서 화이트리스트 기반으로 검증을 실시해야 한다. 블랙리스트 기반으로 검증하게 되면 수많은 차단 리스트를 등록해야 하며, 이때 하나라도 빠지면 공격에 성공하게 되기 때문이다.
    공백으로 치환하는 방법도 많이 쓰이는데, 이 역시 취약한 방법입니다. 예를 들어 공격자가 SESELECTLECT 라고 입력할 경우 중간의 SELECT가 공백으로 치환되면 SELECT 라는 키워드가 완성된다. 따라서 공백 대신 공격 키워드와는 의미 없는 단어로 치환해야 한다.
  2. Prepared Statement 구문 사용
    Prepared Statement 구문을 사용하게 되면 사용자의 입력값이 데이터베이스의 파라미터로 들어가기 전에 DBMS가 이를 미리 컴파일한 뒤 실행하지 않고 대기한다. 그리고 그 후의 사용자의 입력값을 문자열로 인식하게 함으로써, 공격 쿼리가 들어간다고 하더라도 사용자의 입력을 의미 없는 단순 문자열로 인식하게 하여 전체 쿼리문이 공격자의 의도대로 작동하지 않도록 한다.
  3. Error Message 노출 금지
    공격자가 SQL Injection을 수행하기 위해서는 데이터베이스의 정보(테이블명, 컬럼명 등)가 필요하며, 위에서 본 바와 같이 에러 메시지를 통해 데이터베이스의 정보를 확인할 수 있다. 데이터베이스 에러 발생 시 따로 처리를 해주지 않을 경우 에러가 발생한 쿼리문과 함께 에러에 관한 내용을 반환하며, 여기서 테이블명 및 컬럼명 그리고 쿼리문이 노출될 수 있다. 따라서 DB에 대한 오류 발생 시 사용자에게 보여줄 수 있는 페이지를 제작하거나 메시지 박스를 띄우는 등 오류 메시지를 노출시키지 않도록 해야 한다.
  4. 웹 방화벽 사용
    웹 공격 방어에 특화되어 있는 웹 방화벽을 하는 방법도 있다. 웹 방화벽은 소프트웨어형, 하드웨어형, 프록시형의 세 가지로 나눌 수 있는데 소프트웨어형은 서버 내에 직접 설치하는 방법이고 하드웨어형은 네트워크상에서 서버 앞단에 직접 하드웨어 장비로 구성하는 것이다. 마지막으로 프록시형은 DNS 서버 주소를 웹 방화벽으로 바꾸고 서버로 가는 트래픽이 웹 방화벽을 먼저 거치도록 하는 방법이다.


OS command injection

OS command는 운영체제의 명령어를 말한다. OS 명령 주입은 승인되지 않은 운영체제 명령을 실행하도록 하는 공격법이다.
OS 명령 주입은 웹 애플리케이션이 실행될 때 정제되지 않고 필터링되지 않은 시스템 명령을 보낼 때 발생할 수 있다. 입력 유효성 검사가 불충분할 경우 공격자는 쉘 수준에서 작동하도록 자신의 명령을 주입할 수 있으며, 쿠키, 양식 또는 HTTP 헤더 등을 이용해 운영체제 명령을 도입한다.



XXE injection

XXE(XML eXternal Entity) injection은 외부 개체의 주입을 의미한다. 쉽게 말해 SQL injection이 SQL문을 주입하여 공격하는 것이라면, XXE injection은 XML을 주입하여 공격하는 것으로 이해하면 된다. XML 외부 개체를 참조할 때 XML이 아닌 다른 파일을 불러들이도록 하는 공격이다.



XSS(Cross Site Scripting)

공격자가 게시판 등에 악의적인 스크립트가 담긴 게시글을 삽입하고, 사용자가 해당 게시글을 클릭할 경우 스크립트가 실행되어 공격하는 기법이다. 크게 '돔 기반(Dom based) XXS, 저장(Stored) XXS, 반사(Reflected) XXS'의 세 가지로 구분할 수 있다.

Dom based XXS

피해자의 브라우저에서 DOM 환경을 수정하여 클라이언트가 예상하지 못한 방식으로 공격 구문을 실행하는 XSS 공격이다. 즉, 페이지 자체(HTTP 응답)는 변하지 않지만, 페이지에 참조되는 클라이언트 측의 코드가 변조되어 공격 구문이 실행된다.

Stored XSS

앞서 말했던 '게시물에 악성 스크립트를 삽입하고 피해자가 해당 게시물을 클릭하는' 공격이 여기에 해당한다. 공격자는 이를 통해 사용자의 쿠키, 세션 등 원하는 정보를 획득한다. 즉, 세션 하이재킹(Session Hijacking)dl rksmdgowlsek.

세션 하이재킹은 말 그대로 세션을 탈취하는 것으로, 세션을 탈취하면 로그인된 상태를 가로챌 수도 있고 세션에 담긴 정보를 확인하여 이를 이용한 다양한 공격이 가능해진다.

Reflected XSS

URL의 CGI(Common Gateway Interface) 인자에 스크립트 코드를 삽입하는 것이다. 예를 들어 공격자가 이메일로 어떤 웹 페이지의 링크를 보내고 사용자가 해당 링크를 클릭하면 그 링크에 대한 웹 페이지가 화면에 나오게 되는데, 이때 해당 링크에 삽입된 스크립트 코드가 실행되면서 웹 페이지의 내용이 변경되는 것이다.

CGI는 웹 서버와 외부 프로그램 사이에서 정보를 주고받는 방법 혹은 규약들을 의미한다.

일반적인 해킹 공격과는 달리 클라이언트를 대상으로 하는 공격이라는 점에서 주의할 필요가 있다.



CSRF(Cross Site Request Forgery, XSRF)

공격자가 게시판에 악의적인 스크립트가 담긴 게시글을 올리고, 해당 게시글을 클릭하면 사용자의 인증 권한을 이용해 의도하지 않은 요청이 서버에 전송되도록 하는 공격 기법이다. 이때 스크립트를 이용해 사용자의 패스워드를 변경하는 것도 가능하다.

CSRF는 XSS와 비슷하지만 주요한 차이가 있는데, XSS의 경우 사용자가 해당 웹페이지를 신용한다는 점을 이용하는 것이라면 CSRF는 특정 웹사이트가 사용자의 브라우저를 신용하는 상태를 이용한다는 것이다. 즉, 사용자가 로그인한 상태에서 서버의 신뢰를 얻고, 그 상태에서 요청 위조 공격 코드가 삽입된 페이지를 열면 웹 사이트는 그 위조된 공격 코드가 '믿을 수 있는 사용자'로부터 발송된 것으로 판단한다는 것이다.



참고 자료

profile
AI, NLP, Data analysis로 나아가고자 하는 개발자 지망생

0개의 댓글