#01: Web hacking

onezerokang·2021년 5월 27일
0

백엔드 개발을 하다가 보안에 대해 너무 무지한 것 같아 웹 해킹 공부를 시작했습니다. 앞으로 공부한 내용을 복습하며 블로그에 정리해보려고 합니다.

해킹의 정의

해킹은 타인의 컴퓨터 시스템에 무단 침입하여 데이터에 접속할 수 있는 권한을 얻는 것이다(위키백과). 타인의 컴퓨터에 침입하기 위해서는 설계자, 운영자보다 해당 시스템에 대한 더 높은 이해도가 필요하다. 그래서 첫 시간에 대해서는 웹에 대해 쭉 훑어봤다.

Web Browser

문서 편집을 위해 워드 프로세서 소프트웨어나 구글 문서를 사용하는 것 처럼 웹을 사용하기 위해 웹 브라우저를 사용한다. 웹 브라우저는 HTTP를 통해 인터넷 상에서 통신하며 서버로 전달받은 웹 리소스를 가공해 사용자가 웹과 HTTP에 대한 이해가 없어도 웹을 사용할 수 있도록 돕는 GUI기반의 소프트웨어다.

웹 브라우저에서 주소창에 주소를 입력하면 사용자가 입력한 주소를 웹 브라우저가 대신 접속해 서버에서 응답한 데이터를 해석하고 화면에 출력한다.

Web Resource

웹 리소스는 웹 상에서 사용하는 자원을 말한다. HTML, CSS, JS, Image 등이 있다. 이 웹 리소스를 가르키는 주소는 URL(Uniform Resource Locator)라고 한다.

URI(URL)

Uniform Resource Identifier의 약자로 리소스를 식별하기 위한 식별자다.
URI는 Scheme, Authority(UserInfo, Host, Port), Path, Query, Fragment의 구성요소로 이루어져있다.
Scheme: 웹 서버에 접속할 때 어떤 프로토콜을 이용할지(HTTP, HTTPS 등...)

HOST: 접속할 웹 서버의 서버 주소에 대한 정보

PORT: 접속할 웹 서버의 포트에 대한 정보를 가지고 있다.

Path: 접속할 웹 서버의 경로를 갖지고 있다.

Query: 웹 서버에 전달할 파라미터이며 Query 앞에는 ?(물음표)가 붙는다.

Fragment: 웹 페이지 내에서 존재하는 서브 리소스에 접근할 때 식별하기 위한 정보다. Fragment뒤에는 #이 붙는다.

URI구조 예시

 scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]

 https://www.google.com:443/login?id=wonyoung#title

Encoding

Encoding은 문자, 기호 등의 정보를 표준화, 보안목적으로 다른 형태나 형식으로 변환하는 처리, 처리방식을 이야기한다. Decoding은 Encoding된 정보를 원래대로 되돌리는 것을 말한다.
Encoding의 경우 알고리즘이 공개되어 있고 같은 키와 요소가 포함되어 있어 원래 정보로 복원가능하다.

웹에서 대표적인 인코딩은 URL과 Entity가 있다.

URI 구조내에서 ?이나 # 등 예약어로 사용되는 문자들을 전송할 때 인코딩해야 한다. 예를 들어 벨로그에 글을 써서 저장하면 velog.io/[글 제목] 형식으로 저장된다고 치자. "치킨먹는법"이라는 제목일 경우 velog.io/치킨먹는법 이렇게 되는거다.

그런데 만약 제목이 "?이게 뭐지?"라는 제목이라고 가정하자. 그러면 velog.io/?이게 뭐지?라는 주소를 갖게 될 것이다. 문제는 ?는 Query를 사용할 때 앞에 붙는 예약어이기 때문에 이를 쿼리로 인식하고 예상치 못한 동작을 할 수 있다. 그래서 해당 글자를 Ascii 테이블에서 매칭되는 Hex 값 앞에 %를 붙여 인코딩하는 것이다. 그러면 이렇게 된다. velog.io/%3F치킨먹는법%3F.

혹은 HTML 문서내에 사용되는 문자열들이 HTML에서 사용하는 태그로 인식하지 않도록 지정된 Entity name을 사용하거나 Hex 값 앞에 &#x를 붙이면 된다.

HTTP

HTTP는 URI의 Scheme(Protocol)에 해당된다. 프로토콜은 컴퓨터 사이에서 어떻게 정보를 교환할지 정의하는 규칙이다. HTTP는 Hyper Text Transfer Protocol의 약자로 TCP 혹은 TLS를 사용해 통신하고 기본 포트로 80과 443포트를 사용한다(HTTP는 80번 포트를, HTTPS는 443포트를 기본 포트로 사용하고 이는 바꿀 수 있다).

HTTPS는 HTTP의 평문 전송을 암호화하여 보내는 방법이다. 보다 더 안전하다. HTTP는 사용자가 서버에 요청하는 Request와 서버가 사용자에게 응답하는 Response로 나뉜다.

HTTP Request

사용자가 서버에 하는 요청을 의미한다. 사용자와 서버가 서로 통신하기 위해선 약속된 데이터 구조로 데이터를 전달해야 한다. HTTP 구조에서 각각의 줄은 CRLF로 줄 바꿈이 이루어져야 한다. HTTP Request의 첫번째 줄에는 사용자가 서버에 요청 시 수행하고자 하는 Method, 웹 리소스의 경로인 Path, HTTP 버전을 나타내는 Version으로 구성된다.

두번째 줄부터는 Header이다. Header는 이름: 값 형태로 이루어진다. Header에는 사용자의 데이터 처리 방식, 데이터 형시에 대한 정보, 쿠키 정보등이 들어있다.

참고로 CRLF는 Carrage Return Line Feed의 약자로 커서를 현재 행의 맨 좌측과 수직아래로 이동시키는, 줄바꿈을 의미한다.

마지막으로 사용자가 서버로 데이터를 보낼 때 데이터를 담는 부분인 Body가 있다.

HTTP Method

HTTP Method는 서버에 요청을 보내는 방식이다.

HEAD: GET 메서드와 동일하지만 response의 body는 받지 않고 헤더 값만 받는다.
GET: 리소스를 요청한다.
POST: 특정 리소스를 생성하거나 추가한다.
PUT: 특정 리소스의 내용을 보낸 값으로 설정한다.
PATCH:특정 리소스의 내용 중 보낸 값의 key만 변경한다.
DELETE:특정 리소스를 삭제한다.
TRACE: 요청 받은 값을 Response Body로 다시 클라이언트에게 되돌려준다.

Request Header

HOST: 데이터를 보내는 서버의 주소
Cookie: 사용자 식별을 위한 정보
User-Agent: 사용자가 사용하는 프로그램의 정보
Referer: 페이지 이동 시 이전 URI의 정보
Content-Type: 사용자가 전달하는 데이터의 처리방식과 형식을 나타낸다. 사용자와 서버간의 데이터 처리방식이 일치되어야 정상적으로 데이터 통신이 이루어진다.

HTTP Response

사용자 요청에 대한 서버의 응답. Request의 구조처럼 각 줄은 CRLF로 줄 바꿈이 이루어져야 한다. HTTP RESPONSE구조중 첫번째 줄에는 Version과 사용자 요청에 대한 응답코드인 Status Code로 구성된다.

두번째 줄부터 Header부분이다. 이름: 값으로 이루어지며 헤더의 끝을 표기하기 위해 CRLF를 한번더 출력하고 Body로 구성된다.

웹 해킹에서는 서버의 응답을 주목해야 한다. 예를 들어 악의적인 입력을 보냈을 때 500 Status code(Internal Server Error)를 응답하면 해당 입력이 서버에 어떠한 영향을 끼쳤다고 짐작할 수 있고 취약점으로 도출해낼 수도 있습니다.

Response의 구성요소

Version: HTTP의 버전을 나타냅니다.

Status code: 사용자의 요청에 대한 서버의 처리 결과를 나타냅니다.

Header: 사용자와 상호작용하기 위한 데이터를 담는 부분으로 사용됩니다.

e.g. 사용자(웹 브라우저)에서 서버의 응답 데이터를 처리하는 방식 및 형식에 대한 정보, 서버에서 사용자를 식별하기 위한 쿠키 발급 정보 등

Body: 서버가 사용자에게 응답하는 데이터를 담는 부분입니다.

Status code

200번 영역
사용자 요청에 대한 서버의 처리가 성공하였음을 알림

300번 영역
요청한 리소스가 다른 경로로 변경된 경우를 나타내는 영역
웹 브라우저에서 300번 영역의 응답상태가 반환되면
Response Header에 포함되어 있는 lOcation 헤더 값으로 리다이렉션한다.

400번 영역
사용자가 서버에 요청하는 구조 또는 데이터가 잘못되었음을 나타내는 영역

500번 영역
서버의 에러와 관련된 영역

ponse Header

Content-Type: 서버의 응답 데이터를 웹 브라우저에서 처리할 방식과 형식을 나타낸다.

Content-Length: 서버가 사용자에게 응답해주는 데이터의 길이

Server: 서버가 사용하는 소프트웨어의 정보

Allow: 허용되는 Method 목록을 사용자에게 알려줄 때 사용한다.

Location 300번 영역의 응답코드 사용시 변경된 웹 리소스의 주소를 나타낸다.

Set-Cookie: 사용자에게 쿠키 발급시 사용한다. 헤당 헤더를 받은 웹 브라우저는
해당 쿠키를 저장한다.

HTTP는 하나의 Request와 Response의 쌍이 독립적으로 구성되어 통신하는
connectionless, stateless 프로토콜이다.

connectionless: 하나의 요청에 하나의 응답을 하고 네트워크 연결을 끝맺는 것.
불특정 다수의 사용자에게 서비스를 제공해야 하는 웨 특성상 연결을 계속 유지하는 것은
서버 부하로 이어질 수 있어서 connectionless를 갖게 됨.

과거에는 네트워크, 서버 부하로 인해 connectionless 속성이 강조되었지만
최근에는 네트워크, 서버의 성능 향상으로 HTTP/1.1로부터 Keep-Alive를 통해
일정 시간동안 사용자와 서버가 계속 연결을 맺고 있는 방식을 사용한다.

stateless: 네트워크가 연결을 끊을 때 상태를 유지하지 않는 것의미
HTTP 요청마다 새로운 커넥션을 열기에 사용자 인증을 계속 해야함.
그래서 이런 단점을 개선하고자 Cookie 탄생

웹 브라우저는 HTTP Response의 Set-Cookie Header나
JS의 document.cookie를 통해 데이터를 쿠키에 저장한다.

데이터를 key=value;쌍으로 쿠키에 저장하고 ;뒤에 쿠키의 만료시간, 접근할 수 있는 도메인등 추가 옵션 지정 가능
추구 HTTP요청을 보낼 때 자동으로 헤더에 쿠키를 추가해 전송한다.

인증상태를 쿠키에 저장하면 그 쿠키를 탈취한 사람이
계정을 해킹할 수 있다.

Session

쿠키에 인증상태를 포함한 데이터를 저장하면 사용자가 임의 사용자로 인증된 것처럼 요청 조작 가능.따라서 서버에 데이터를 저장하기위해 Session을 사용한다.

세션을 활용하면 데이터를 서버에 저장하고 해당 데이터 접근할 수 있는 유추할 수 없는 랜덤한 문자열 키를 만들어 응답하며 이를 보통 SessionID라고 한다.

브라우저는 해당 키를 쿠키에 저장하고 서버에서 키에 해당하는 데이터를 가져와 인증상태를 확인한다.

쿠키는 데이터 자체를 사용자가 저장하고 세션은 서버가 저장한다.

HTTP/HTTPS

HTTP는 모든 데이터를 암호화되지 않은 평문으로 전송한다. 네트워크에서 전송된 데이터를 감청할 수 있다면 HTTP로 통신하는 데이터는 평문으로 노출되고 민감한 정보를 다룰 때 문제가 될 수 있다.

HTTPS는 Transport Layer Security(TLS), Secoure Sockets Layer(SSL)을
사용해서 암호화한다. 비교적 안전하다.

Domain Name/Hosh Name

URI구성요소중 HOSH는 웹 브라우저가 어디 연결할지 결정하게 된다. Domain Name이나 Internet Protocol Address가 Host에 사용한다.

IP Address는 네트워크 상에서 통신이 이루어질 때 장치를 식별하기 위해 사용되는 주사. IP Address를 외우기 쉽고, 의미를 부여하기 위해 Domain Name을 사용한다.

Domain Name을 이용해서 host를 조회할 때 Domain name과 IP Address 정보를 매핑해 저장하는 Domain Name Server에 조회해 등록된 IP Address를 가져와 사용한다.

웹 서버 어플리케이션 -1

웹서버는 사용자의 HTTP요청을 해석하여 처리한 후 응답하여 주는 역할

대표적으로 nginx, Apache, Tomcat, IIS등이 있다. 웹 서버는 사용자로부터 받는 요청을 서버 자체적으로 처리할지 요청에 알맞은 내부 서비스로 연결할지 정할 수 있다.

예를들어 클라가 접근한 URI가 .html확장자를 갖은 리소스라면 웹서버에서 해당 경로의 html을 반환해주고 .php확장자를 가진 리소스라면 php엔진을 통해 해당 요청을 처리한다.

Web Application

웹 어플리케이션은 사용자의 요청을 동적으로 처리할 수 있도록 만들어진 어플리케이션

웹 어플리케이션을 작성할 때는 Web Application Language가 사용되며 PHP, NodeJS, Python, Java등이 존재합니다.

이 자체에서 취약점이 발견되면 서버에 직접적인 영향을 끼치게 된다.

웹 서버 어플리케이션-2

Database Management System

DBMS은 DB내의 데이터 조회/수정/삽입을 용이하게 할 수 있도록
도와주는 서버 어플리케이션이다. MySQL, MS-SQL등을 DBMS라 하며
해당 어플리케이션이 관리하는 데이터를 데이터베이스라고 한다.

웹 해킹 개요

현대 웹 기술이 증가하며 웹 해킹에 대한 위협도도 증가함.
기업들이 자산을 보호하기 위해 서비스와 네트워크를 내부망으로 사용하지만
기업의 대표사이트, 제품 서비스 등은 웹을 통해 운영. 이런 웹 서비스는 내부망과
연결될 가능성이 높아 내부망 침투를 위해 웹을 공격하기도 한다.

웹 해킹 공격 백터

웹 해킹은 Client-Side와 Server-Side로 공격대상을 나누어 볼 수 있다.

Client-side-attack
서비스 사용자에 대한 공격
웹 서버가 제공해주는 데이터가 공격자에 의해 변조되었을 경우 웹 브라우저에서
렌더되는 과정에서 취약점이 발생하는 경우가 대표적
ex) 게시판 내용에 스크립트를 삽입하여 다른 사용자의 웹 브라우저에서 원하는 행위 수행

Server-side-attack
서비스를 운용하는 서버에 대한 공격
공격에 성공하면 서버의 어플리케이션 코드, 다른 사용자의 정보 유출, 서버 탈취로 이어진다.

출처
https://www.dreamhack.io
https://ko.wikipedia.org/wiki/%ED%95%B4%ED%82%B9

profile
블로그 이전 했습니다: https://techpedia.tistory.com

0개의 댓글