Introduction of Webhacking
https://dreamhack.io/lecture/courses/6를 바탕으로 작성했습니다
Introduction of Webhacking
웹 서비스가 동작하는 원리와 웹 서비스를 하기 위해 필요한 기본적인 요소들에 대해 학습할 수 있습니다.
dreamhack.io
1. 웹이란 무엇인가?
해킹 : 본래의 의도와는 다른 행위를 발생시키는 것. 따라서 설계 또는 운영의 약점을 찾아야 함. (해당 시스템에 대한 높은 이해도를 필요로 함) 따라서, 웹해킹을 하기 위해 웹에 대한 기본적인 이해가 필요
월드 와이드 웹(World Wide Web,WWW,W3)
웹 : HTTP를 이용해 정보를 공유하는 통신서비스
웹 서버(Web Server) : 서비스를 제공하는 대상
웹 클라이언트(Web Client) : 서비스를 받는 사용자
2. 웹 기초지식
웹 기초 지식
사용자가 웹 브라우저를 실행하고 주소창에 사이트 주소를 입력하면 사이트에 접속하게 됨. but, 실제론 수많은 과정이 수행됨
<키워드 정리>
- Web Browser(웹 브라우저)웹에 접속하기 위해 사용하는 소프트웨어
- Web Resource웹 상에 존재하는 모든 콘텐츠 (HTML,CSS,JS,PDF,PNG 등)
- URI(URL)리소스를 식별하기 위한 식별자. Uniform Resource Identifier의 약자
- HTTP(HyperText Transfer Protocol)웹을 이용하기 위한 통신 규약. 인터넷 서비스에선 서비스 대상 간 통신 규약(protocol)을 지정해 통신
- HTTPS(HyperText Tranfer Protocol Secure)기존 HTTP 데이터를 암호화하여 통신
- Cookie웹 브라우저에 저장하는 데이터
- Session서버에 저장하는 데이터
- Domain Name인터넷(웹) 네트워크상에서 컴퓨터를 식별하는 이름 (ex: www.naver.com)
- Server인터넷상에서 사용자에게 서비스를 제공하는 컴퓨터. 웹 서버는 사용자와 HTTP를 이용해 통신하는 서버
- Application서버에서 설정한 특정 기능들을 수행하는 소프트웨어
- DataBase(DB)데이터를 저장하기 위해 사용하는 데이터 저장소
Web Browser
HTTP를 통해 인터넷 상에서 통신을 해 서버로부터 전달받은 웹 리소스들을 가공해 사용자가 (웹과 HTTP의 동작 원리를 알지 못해도) 웹을 사용할 수 있도록 도와주는 소프트웨어
문서편집 -> 워드 프로세서 소프트웨어 사용
데이터분석, 계산 -> 스프레드 시트 소프트웨어 사용
'웹 사용 -> 웹 브라우저 사용' : 웹 브라우저를 통해 HTTP 원리와 동작방식을 몰라도 웹을 편리하게 사용 가능
(취약점은 입력값에서 발생, 입력 값을 웹 브러우저를 통해 전송 => 브라우저가 하는 행위를 알아야 함)
웹 브라우저 예) Chrome,Edge,Safari,Firefox
네트워크 프로그램을 통한 웹 사용 : HTTP의 데이터를 직접 작성해야 함
CLI프로그램을 통한 웹 사용 : 서버가 응답해주는 데이터를 출력해야 함 (html,css,js X)
웹 브라우저를 통한 웹 사용 : 주소창에 입력한 주소를 대신 접속해 서버에 응답한 데이터 해석 후 화면에 출력
Web Resource
웹에서 사용하는 콘텐츠
http:/dreamhack.io/index.html를 주소창에 입력. dreamhack.io에 존재하는 /index.html리소스에 대해 요청을 수행
대표적인 웹 리소스
- HTML(Hyper Text Markup Language)웹 문서의 뼈대를 구축하기 위한 마크업 언어. 정해진 태그와 속성을 지정해 문서를 구성
- CSS(Cascading Style Sheets)HTML이 표시되는 방법을 정의하는 스타일 시트 언어
- JS(JavaScript)Client Side Script로써 페이지 내에서의 행위들을 설정할 수 있음
- Etc문서,이미지,동영상,폰트 등
HTML Editor
웹 에디터를 통해 HTML/CSS/JS 코드를 삽입하면 브라우저에선 코드를 해석한 화면을 확인할 수 있다
URI(URL)
리소스를 식별하기 위한 식별자 (Uniform Resource Identifier의 약자)
URL(Uniform Resource Locator)은 리소스의 '위치'를 식별하기 위한 URI의 하위 개념
웹 사이트의 주소를 이용해 접근하는 것 : URL이자 URI를 사용한 것
URI의 구성 요소 : Scheme, Authority(Userinfo, Host, Port), Path, Query, Fragment
- Scheme웹 서버에 접속할 때 어떤 프로토콜을 이용할지에 대한 정보
- Host접속할 웹 서버의 호스트(서버 주소)에 대한 정보. Authority의 일부
- Port웹 서버의 포트에 대한 정보. Authoritiy의 일부
- Path접속할 웹 서버의 경로에 대한 정보. '/'문자로 구분됨
- Query웹 서버에 전달하는 파라미터(추가적인 정보). URI에서 '?'문자 뒤에 붙음
- Fragment메인 리소스 내에 존재하는 서브 리소스에 접근할 때 이를 식별하기 위한 정보. URI에서 '#'문자 뒤에 붙음
Encoding
문자 또는 기호 등의 정보, 형태를 표준화, 보안 등의 목적으로 다른 형태나 형식으로 변환하는 처리 혹은 그 처리 방식. 디코딩(decoding)은 변환된 형태를 원래 형태로 변경하는 것
Encoding(인코딩) : 알고리즘이 모두 공개되어 있음. 키와 같은 요소가 포함X, 모두가 원래로 복원 가능
(웹에서 사용하는 대표적인 인코딩 : URL, HTML Entitiy)
Encryption(인크립션) : 양방향 암호 알고리즘. 일치한 알고리즘과 유효한 키를 갖고 있을 때 원래로 복원 가능
* URL Encoding(percent encoding)
URI 구조내에서 예약어(구분자)로 사용되는 문자들을 전송할 때 사용.
예약어는 URI 구조내에서 문법적으로 중요한 의미를 가지고 있어서 문법적으로 사용하지 않을 땐 인코딩 필수!
인코딩 방식 : 입력된 문자를 Ascii테이블에서 매칭되는 Hex값 앞에 '%'문자를 붙인다
* HTML entity Encoding
HTML 문서 내에서 사용하는 문자열들이 HTML에서 사용하는 태그로 인식하지 않도록 하기 위해 사용
인코딩 방식 : 입력된 문자를 Ascii테이블에서 매칭되는 Hex값 앞에 '&#x'를 붙이거나, Entity name을 사용
HTTP
URI에서 Scheme(Protocol)에 해당. HTTP,HTTPS는 웹에서 이루어지는 통신을 정의한 프로토콜
Protocol(프로토콜)은 컴퓨터 내부 혹은 컴퓨터 사이에서 '어떻게 데이터를 교환할지'를 정의하는 규칙 체계
TCP 혹은 TLS(암호화된 TCP)를 사용해 통신
80(HTTP) 443(HTTPS) 포트 사용 *80,443이 무조건 서비스되는 건 아님
HTTP : Request(사용자가 서버에 요청), Response(사용자의 요청에 대한 서버 응답)
ex) https://dreamhack.io : HTTPS방식으로 dreamhack.io 서버와 통신.
HTTP Request
서버에 대한 요청. 사용자와 서버가 통신하기 위해서 서로가 이해하는 데이터 구조를 전달해야 함
HTTP의 구조에서 각각의 줄은 'CRLF'로 줄 바꿈이 이루어짐
HTTP Request 구조
1. 첫번째 줄
- Method (사용자가 서버에 요청 시 수행하고자 하는 동작) 요청하는 리소스가 허용하는 메소드 목록을 반환(ex:OPTIONS,GET,POST)
- Path (사용자가 서버에 요청하는 웹 리소스의 경로)
- Version (사용하는 HTTP의 버전)
2. 두번째 줄~
- Header ( '이름:값' 형태. 서버에 추가정보를 전달하는 데이터 부분. 입력 데이터를 전달하기 보단 사용자와 서버가 상호작용하기 위한 정보를 담는 부분으로 사용됨)
Host(데이터 보내는 서버의 주소를 의미)
Cookie(사용자를 식별하기 위해 사용)
User-Agent(사용자가 사용하는 프로그램의 정보)
Referer(페이지 이동 시 이전 URI의 정보)
Content-Type(사용자가 전달하는 데이터 처리방식과 형식,사용자와 서버 간의 데이터 처리 방식이 일치해야함)
상황에 따라 많은 데이터 포함 가능해서 끝을 표시하기 위한 CRLF를 한 번 더 출력해야 한다
3. 마지막 줄
- Body (사용자가 입력한 데이터가 서버에 전달 시 데이터를 담는 부분)
HTTP Response
사용자의 요청에 대한 서버의 응답.
HTTP와 마찬가지로 각 줄은 'CRLF'로 줄 바꿈이 이루어짐
1. 첫번째 줄
- Version (HTTP의 버전)
- Status code (사용자의 요청에 대한 서버의 처리 결과)
-200번 영역
사용자의 요청에 대한 서버의 처리가 성공하였음을 나타낸다
200 OK / 201 Created
-300번 영역
사용자가 요청한 리소스가 다른 경로로 변경된 경우를 나타내는 경우.
웹 브라우저에서 300번 영역의 응답 상태 코드가 반환되면, Response Header에 포함되어 있는 Location 헤더의 값으로 리다이렉션 함
301 Moved Permanently / 302 Found
-400번 영역
사용자가 서버에 요청하는 구조 또는 데이터가 잘못되었음을 나타낸다
400 BadRequest (사용자가 전달한 데이터나 구조의 잘못된 문법으로 서버가 요청을 이해할 수 없음을 의미)
403 Forbidden (사용자가 해당 웹 리소스에 접근할 권리를 갖고 있지 않음)
404 Not Found (사용자가 요청한 웹 리소스의 경로에 대해 응답할 데이터가 없음을 나타낸다)
405 Method Not Allowed (사용자가 요청한 Method가 서버에서는 허용하지 않는 Method임을 나타낸다)
-500번 영역
서버의 에러와 관련된 영역
500 Internal Server Error (서버의 에러가 발생하였음)
503 Service Unavailable (서버가 사용자의 요청을 처리할 준비가 되지 않았음)
2. 두번째 줄~
- Header ( '이름:값' 형태. Header의 끝 표시하기 위해 CRLF를 한번 더 출력한다)
Content-Type(서버의 응답 데이터를 웹 브라우저에서 처리할 방식과 형식을 나타냄)
Content-Length (서버가 사용자에게 응답해주는 데이터의 길이를 나타냄)
Server (서버가 사용하는 소프트웨어의 정보를 나타냄)
Allow (허용되는 Method 목록을 사용자에게 알려줄 때 사용)
Location (300번 영역의 응답 코드 사용 시 변경된 웹 리소스의 주소를 나타냄)
Set-Cookie (사용자에게 쿠키를 발급할 때 사용. 해당 헤더를 받은 웹 브라우저는 해당 쿠키를 저장함)
3. 마지막 줄
- Body (서버가 사용자에게 응답하는 데이터를 담는 부분)
* 웹 해킹에선 '사용자의 입력에 의한 서버의 응답'을 주목해야 함
ex) 악의적은 입력을 보냈을 때 500 Status code(Internal Server Error)를 응답하면 해당 입력이 서버에 어떠한 영향을 끼쳤다고 짐작할 수 있고 취약점으로 도출해낼 수 있음
HTTP Request&Response
https://dreamhack.io/learn/1/6#14
로그인 | Dreamhack
dreamhack.io
해당 링크를 통해 HTTP Request와 Response의 실제 데이터를 각 Method 별로 확인해볼 수 있다
HTTP-Cookie-1
HTTP : Request와 Response의 쌍이 독립적으로 구성되어 통신하는 connectionless, stateless 프로토콜
(1) connectionless
하나의 요청에 하나의 응답을 한 후 네트워크의 연결을 끝맺는 것. 웹은 불특정 다수에게 서비스 되어야 하기 때문에 계석해서 연결상태로 유지하면 서버 부하의 가능성이 발생한다.
(2) stateless
네트워크가 연결이 끝맺을 때 상태를 유지하지 않는 것. HTPP 요청마다 새로운 커넥션을 열어 사용자 인증을 계속해서 해야하는 단점을 개선하기 위해 Cookie(쿠키)가 생김
-웹 브라우저는 HTTP Response의 Set-Cookie Header나 Javascript 'document.cookie'를 통해 데이터를 쿠키에 저장
key=value; 쌍으로 데이터를 쿠키에 저장, ;뒤에 쿠키의 만료시간, 접근할 수 있는 도메인 등 추가 옵션 설정 가능
이후엔 웹 브라우저가 자동으로 헤더에 쿠키를 추가해 전송
HTTP-Cookie-2
쿠키는 인증상태를 포함할 수 있다.
HTPP-Session
쿠키에 인증 상태를 포함한 데이터를 저장하면 사용자가 임의 사용자로 인증된 것 처럼 요청을 조작할 수 있음.
따라서, 서버에 데이터를 저장하는 세션을 사용한다.
- 데이터를 서버에 저장
- 해당 데이터에 접근할 수 있는 유추 불가한 랜덤 문자열 키 생성해 응답 (=Session ID)
- 브라우저는 해당 키를 쿠키에 저장
- HTTP 요청을 보내면 서버에서 키에 해당하는 데이터를 가져와 인증 상태를 확인
-쿠키 : 데이터 자체를 사용자가 저장
-세션 : 데이터를 서버가 저장
HTTP/HTTPS
웹은 다양한 분야에서 사용되고 웹 서비스와 통신하는 요청과 응답에 개인정보 등 민감한 정보들이 포함된다.
HTTP : 모든 데이터를 암호화 되지 않은 평문으로 전송. 네트워크에서 전송된 데이터를 감청할 수 있으면 HTTP로 통신하는 데이터는 평문으로 노출됨.
HTTPS : TLS(Transport Layer Security), SSL(Secure Sockets Layer)를 사용해 암호화함. 공개키 암호화를 사용해 클라이언트와 서버가 키를 교환하기 때문에 비교적 안전.
<Wireshark를 통해 서버에서 응답 값을 전달하는 과정을 네트워크 단계에서 확인한 결과>
Domain Name / Host Name
*Host : 웹 브라우저가 어디에 연결할지 정하는 URI 구성 요소 (Domain Name이나 IP Address가 사용됨)
- IP Address 네트워크 상에서 통신이 이루어질 때 장치를 식별하기 위해 사용되는 주소. 불규칙한 숫자로 이루어짐
- Domain NameDNS(Domain Name Server. Domain Name,IP Address를 매핑해 저장)를 조회해 등록된 IP Address를 가져와 사용. 웹 브라우저에서 http://example.com/ 주소로 접속한다면 DNS에서 example.com(domain name)의 IP와 통신함
* nslookup 명령어를 사용해 Domain Name의 정보를 확인할 수 있다
웹 서버 어플리케이션 -1
* Web Server
사용자의 HTTP 요청을 해석해 처리한 후 응답해 주는 역할 (ex: nginx,Apache,Tomcat, IIS)
요청 처리 방법
(1) 웹 서버 자체적으로 처리 (ex: URI가 .html 확장자를 가진 리소스라면 웹 서버에서 해당 경로의 html을 반환 해줌)
(2) 들어온 요청에 맞게 내부 서비스로 연결 (ex: /payment/경로로 시작하는 요청은 payment 처리를 위한 어플리케이션에 요청을 연결)
* Web Application
사용자의 요청을 동적으로 처리할 수 있도록 만들어진 어플리케이션.
- 요청 내용에 대한 동적 처리를 위해 Web Application Language 사용됨. ex) PHP, NodeJS,Python, Java
- 웹 개발을 편하게 해주는 프레임워크도 존재 ex)Python의 django와 flask, Java의 spring
- 웹 어플리케이션은 서버에서 동작하기 때문에 웹 어플리케이션 구현체에서 취약적이 발생하게 되면 서버에 직접적인 영향을 끼치게 됨
웹 서버 어플리케이션 -2
*DataBase Management System (DBMS)
데이터베이스 내의 데이터 조회/수정/삽입을 용이하게 할 수 있도록 도와주는 서버 어플리케이션 ex)MySQL,MS-SQL
데이터베이스 : 해당 어플리케이션들이 관리하는 데이터. 사용자의 개인정보가 포함된 내용이 존재해 보안이 중요함
DBMS는 SQL Query를 통해 제어하는데, 사용자의 입력값을 SQL Query에 필터링 없이 사용하게 되면 SQL injection 공격에 노출됨.
3. 웹 해킹 개요
웹 해킹 : 본래의 의도와는 다른 동작을 일으키거나 주어진 권한 이상으로 정보를 열람,복제,변경 가능한 행위가 웹에서 발생하는 것
* 많은 기업들이 많은 서비스와 네트워크를 내부망으로 사용하지만, 대표 사이트 또는 제품등과 같이 웹을 통해 서비스를 운영하는 경우가 많다. 이런 웹 서비스들은 내부망과 연결되어 있을 가능성이 높아 공격자들이 내부망 침투를 위해 가장 먼저 웹을 공격하기도 한다. 따라서 웹에서 발생할 수 있는 취약점에 대해 익힉 방어 대책을 연구해야 함.
*웹 해킹 공격 벡터
Client-side : 사용자의 입력을 받고 웹 사이트와 통신
Server-side : 사용자의 요청을 처리
(이렇게 공격 대상을 나눌 수 있는데, 공격 대상에 따라 공격하는 방식, 형태가 달라지고 공격을 통해 가능한 행위도 달라짐)
* Client-side Attack
서비스 사용자에 대한 공격.
웹 서버가 제공해주는 데이터가 공격자에 의해 변조되면 웹 브라우저에서 렌더되는 과정에서 취약점이 발생하는 경우가 대표적.
* Server-side Attack
서비스를 운용하는 서버에 대한 공격.
다양한 공격 형태가 존재, 공격에 성공하면 서버 어플리케이션 코드, 사용자의 정보 유출, 서버 탈취 등으로 이어짐. 서비스의 구조와 특징에 따라 위협의 형태가 달라진다
4. Epilogue
웹과 브라우저 : 웹브라우저,마크업,스타일,HTTP요청을 주고받고, 할 수 있는,식별,식별자,80,443
웹 서버 어플리케이션 : 웹서버,웹어플리케이션,DBMS
웹 해킹 : 본래의 의도와는 다른 행위를 발생시키는 것
이번에 새로운 분야(해킹)에 대한 공부를 시작했다. 엄밀히 말하면 동아리에서 진행하는 소모임..!
해킹에 대한 기초상식조차 없다고 할 정도로 아는게 거의 0에 수렴해서 우선 여러 소모임을 들어갔다.
그 중 그래도 가장 궁금하면서도 기대된 건 웹해킹이였다. 아직 하드웨어에 대해 아는 게 정말 많이 없는데 그래도 웹해킹은... 전에 웹을 배운 적이 있으니까.. ㅎㅎ