<주요 키워드>
(1) Web browser= 웹에 접속하기 위해 사용하는 소프트웨어
(2) Web resource= 웹 상에 존재하는 모든 콘텐츠(HTML, CSS, JS, PDF, PNG등)
(3) URL(URI)= 리소스를 식별하기 위한 식별자
(4) HTTP= 웹을 이용하기 위한 통신규약
(5) HTTPS= 기존 HTTP 데이터를 암호화하여 통신함
(6) Cookie= 웹 브라우저에 저장하는 데이터
(7) Session= 서버에 저장하는 데이터
(8) Domain Name= 웹 네트워크 상에서 컴퓨터를 식별하는 이름
(9) Server= 인터넷상에서 사용자에게 서비스를 제공하는 컴퓨터. 그 중 웹서버는 사용자(웹 브라우저)와 HTTP를 이용하여 통신하는 서버
(10) Application= 서버에서 설정한 특정 기능들을 수행하는 소프트웨어
(11) DB= 데이터를 저장하기 위해 사용하는 데이터 저장소
<(1)Web browser: 웹 브라우저로 http://example.com/index.html에 접속할 때>
1) 네트워크 프로그램(nc 또는 telnet)
웹 서버가 이해하고 해석할 수 있는 형태의 데이터를 직접 작성하여 전송
ex) $ echo -ne "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" |
2)CLI 프로그램(curl,wget)
서버가 응답하여 주는 데이터를 단순히 출력(html을 해석하여 화면에 출력하는 기능, css로 스타일을 입혀주는 기능, 자바스크립트를 실행하는 기능 등은 포함x)
ex) $ curl example.com
3) 웹 브라우저
<(2)Web resource: 웹에서 사용하는 콘텐츠> HTML, CSS, JS
-
HTML (Hyper Text Markup Language)
웹 문서의 뼈대를 구축하기 위한 마크업 언어로, 정해진 태그와 속성을 지정하여 문서를 구성한다.
-
CSS (Cascading Style Sheets)
HTML이 표시되는 방법을 정의하는 스타일 시트 언어로, 이미지, 태그, 글자 등 다양한 웹 리소스들의 출력 시 스타일을 설정한다.
-
JS (JavaScript)
HTML과 CSS는 화면에 출력되는 뼈대를 그리는 것이며, JS와 같은 Client Side Script를 이용하여 페이지 내에서의 행위들을 설정할 수 있다.
-
Etc
문서, 이미지, 동영상, 폰트 등
<(3)URI: Uniform Resource Identifier>
URL은 URI의 하위 개념
URI는 Scheme, Authority(Userinfo, Host, Port), Path, Query, Fragment의 구성요소를 가짐
http://example.com/path?search=1#fragment
Scheme= 웹 서버에 접속 할 때 어떤 체계(프로토콜)를 이용할지에 대한 정보를 담고 있음
보통 http/https를 사용하며 mailto, tel을 통해 메일 클라이언트나 연락처 프로그램을 열기도 함
Host= Authority의 일부로써 접속할 웹 서버의 호스트(서버 주소)에 대한 정보를 가지고 있음
Path= Authority의 일부로써 접속할 웹 서버의 포트에 대한 정보를 가지고 있음
Query= 웹 서버에 전달하는 파라미터(추가적인 정보)이며 URI에서 ? 뒤에 붙음
Fragment= 서브 리소스에 접근할 때 이를 식별하기 위한 정보를 담고 있으며 URI에서 # 뒤에 붙음
cf) 추가적인 URI 정보 확인 : https://tools.ietf.org/html/rfc3986
<Encoding>
-인코딩= 문자 또는 기호 등의 정보, 형태를 표준화, 보안 등의 목적으로 다른 형태나 형식으로 변환하는 처리 혹은 그 처리 방식 <-> 디코딩(다시 원래 형태로 변경하는 것)
-인코딩= 알고리즘이 모두 공개되어 있고 키와 같은 요소가 포함되어 있지 않아서 모두가 원래의 정보로 복원가능
-인크립션= 양방향 암호 알고리즘.일치한 알고리즘과 유효한 키를 가지고 있다면 원래의 정보로 복원가능
1)URL Encoding
GET 메소드로 a=?b, c=&d의 데이터를 보내기 위해서는
http://example.com/?a=%3Fb&c=%26d의 형태로 전송되어야 함
cf)인코딩방식= 입력된 문자를 ascii 테이블에서 매칭되는 hex 값에 %를 앞에 붙이면 됨
<문자> ? -> <URL 인코딩> %3F
<문자> # -> <URL 인코딩> %23
<문자> & -> <URL 인코딩> %26
<문자> = -> <URL 인코딩> %3D
2)HTML entity Encoding
HTML 문서 내에서 사용되는 문자열들이 HTML에서 사용하는 태그들의 문자로 인식되지 않도록 하기 위해 사용
cf)인코딩방식= 입력된 문자를 ascii 테이블에서 매칭되는 hex값에 &#x 를 앞에 붙이거나, 주요 문자들에 대해서 지정되어 있는 entity name 사용
<문자> & -> <entity name encoding> & -> <entity number encoding> &
<문자> < -> <entity name encoding> < -> <entity number encoding> &
<문자> > -> <entity name encoding> > -> <entity number encoding> >
예시) a&b, #3
1) a%26b & %233
2)a&b , #3
<(4)HTTP>
HyperText Transfer Protocol(HTTP), HyperText Transfer Protocol Secure Socket Layer(HTTPS)는 웹에서 이루어지는 통신을 정의한 프로토콜. TCP 혹은 TLS(암호화 된 TCP)를 사용해 통신하고 기본포트로 80(HTTP), 443(HTTPS)포트를 사용함. 웹 서버 중 가장 많이 사용되고 있는 톰켓 서버의 기본 포트 번호는 8080
<HTTP Request>
가장 첫 줄 : 사용자가 서버에 요청 시 수행하고자 하는 동작인 Method, 요청하는 웹 리소스의 경로인 Path, 사용하는 HTTP의 버전을 나타내는 Version으로 구성됨
두번째 줄 : Header 부분. 헤더 부분의 각 줄은 이름: 값 형태로 이루어지며, header 부분의 끝을 표시하기 위해 CRLF을 한번 더 출력한다.
cf) CRLF = 줄바꿈을 의미. hex코드 = 0x0d ,0x0a, 아스키코드 = "\r\n"
1)GET
GET /index.htmlHTTP/1.1
Host: dreamhack.io
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
2)POST
POST /index.html HTTP/1.1
Host: dreamhack.io //Host = 데이터를 보내는 서버의 주소 의미
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
//User-Agent = 사용자가 사용하는 프로그램의 정보를 나타냄.
Content-Length: 19
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
//Content-Type = 사용자가 전달하는 데이터의 처리 방식과 형식을 나타냄. 사용자와 서버 간의 데이터 처리 방식이 일치되어야 정상적으로 데이터 통신이 이루어짐.
<추가적인 헤더 구성요소>
Cookie = 사용자를 식별하기 위해 사용하는 정보.
Referer = 페이지 이동 시 이전 URI의 정보를 나타냄.
foo=bar&hello=world
<메소드>
OPTIONS: 요청하는 리소스가 허용하는 메소드 목록을 반환. 예를 들어, /login 페이지가 OPTIONS, GET,POST 메소드만 허용하는 경우 OPTIONS, GET, POST 가 반환됨
HEAD: GET 메소드와 동일하지만 Response의 Body 부분은 받지 않고, Header만 받는다( 서버의 상태 확인)
GET: 리소스 요청(게시물/프로필 보기, 이미지 등)
POST: 특정 리소스 생성 및 데이터 추가를 위해 값을 제출할 때 사용(게시물, 프로필 생성 등)
PUT: 특정 리소스의 내용을 보낸 값으로 설정(생성/ 업데이트 등)
PATCH: 특정 리소스의 내용 중 보낸 값의 key만 변경(게시글 업데이트)
DELETE: 특정 리소스 삭제(게시물 삭제)
TRACE: 요청받은 값을 Response의 Body로 다시 클라이언트에게 되돌려줌
<HTTP Response>
첫 줄: Version과 사용자의 요청에 대한 서버의 상태 응답 코드인 Status code로 구성됨.
두번째 줄: Header 부분으로, header 부분의 각 줄은 이름:값 의 형태로 이루어진다.
cf) Header 에 담기는 정보 = 사용자(웹 브라우저)에서 서버의 응답 데이터를 처리하는 방식 및 형식에 대한 정보, 서버에서 사용자를 식별하기 위한 쿠기 발급 정보 등
cf) body= 서버가 사용자에게 응답하는 데이터를 담는 부분
웹 해킹에서는 사용자의 입력에 의한 서버의 응답을 주목해야 한다. 예를 들어 악의적인 입력을 보냈을 때, 500 status code가 응답되면 해당 입력이 서버에 어떠한 영향을 끼쳤다고 짐작할 수 있고, 취약점이 있다고 가정해 더 살펴볼 수 있게 됨.
<1> 200 OK
HTTP/1.1 200 OK
Server: Apache/2.4.29 (Ubuntu) //server = 서버가 사용하는 소프트웨어의 정보를 나타냄
Content-Length: 61 //content-length = 서버가 사용자에게 응답해주는 데이터의 길이를 나타냄
Connection: Keep-Alive
Content-Type: text/html //content-type = 서버의 응답 데이터를 웹 브라우저에서 처리할 방식과 형식을 나타냄
<!doctype html> <html> <head> </head> <body> </body> </html>
<추가적인 header 구성요소>
allow = 허용되는 method 목록을 사용자에게 알려줄 때 사용함.
location = 300번 영역의 응답 코드 사용 시 변경된 웹 리소스의 주소를 나타냄.
set-cookie = 사용자에게 쿠키를 발급할 때 사용. 해당 헤더를 받은 웹 브라우저는 해당 쿠키를 저장함.
<2> 404 Not Found
HTTP/1.1404 Not Found
Server: Apache/2.4.29 (Ubuntu)
Content-Length: 255
Connection: Keep-Alive
Content-Type: text/html
<!doctype html> <html><head> <title>404 Not Found</title> </head><body> <h1>Not Found</h1> <p>The requested URL /not_found.html was not found on this server.</p> <hr> <address>Apache/2.4.29 (Ubuntu) Server at dreamhack.io Port 80</address> </body></html>
<3> 500 Interneral Server Error
-Request
POST/login HTTP/1.1
Host: dreamhack.io
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
Content-Length: 16
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
username={공격코드}
-Response
HTTP/1.1500 Internal Server Error
Server: Apache/2.4.29 (Ubuntu)
Content-Length: 0
Connection: close
Content-Type: text/html
<추가적인 HTTP 상태 코드> https://developer.mozilla.org/ko/docs/Web/HTTP/Status
(1) 200번 영역 = 사용자의 요청에 대한 서버의 처리가 성공하였음을 나타낸다.
-200 OK
-201 Created
(2) 300번 영역 = 사용자가 요청한 리소스가 다른 경로로 변경된 경우를 나타내는 영역입니다. 웹 브라우저에서 300번 영역의 응답 상태 코드가 반환되면, response header에 포함되어있는 location 헤더의 값으로 리다이렉션 한다.
cf) 리다이렉션의 뜻= 컴퓨팅에서 표준 스트림을 사용자 지정 위치로 우회할 수 있는 다양한 유닉스 셀을 포함한 대부분의 명령어 인터프리터에 일반적인 명령이다. 방향 지정, 방향 변경으로도 부른다.
ex) 301 = 항구적으로 이동
header( 'HTTP/1.1 301 Moved Permanently');
header('Location: http://dreamhack.io/users/ ');
302 = 임시적으로 이동
header( 'HTTP/1.1 302 Moved Temporarily');
header('Location: http://dreamhack.io/users/ ');
(3) 400번 영역 = 사용자가 서버에 요청하는 구조 또는 데이터가 잘못되었음을 나타내는 영역
-400 Bad Request
:사용자가 전달한 데이터 또는 구조의 잘못된 문법으로 인하여 서버가 요청을 이해할 수 없음을 의미
-403 Forbidden
:사용자가 해당 웹 리소스에 접근할 권리를 가지고 있지 않으
-404 Not Found
:사용자가 요청한 웹 리소스의 경로에 대해 응답할 데이터가 없음
-405 Method Not Allowed
:사용자가 요청한 Method가 서버에서는 허용하지 않는 Method 임을 나타냄.
(4) 500번 영역 = 서버의 에러와 관련된 영역
-500 Internal Server Error
:서버의 에러가 발생하였음을 나타냄.
-503 Service Unavailable
:서버가 사용자의 요청을 처리할 준비가 되지 않았음을 나타냄.
<(6)Cookie:상태를 유지하기 위해 나온 개념>
HTTP = 하나의 request 와 response 쌍이 독립적으로 구성되어 통신하는 connectionless, stateless 프로토콜
-connectionless 속성
:하나의 요청에 하나의 응답을 한 후 네트워크 연결을 끝맺는 것을 의미. 불특정 다수의 사용자에게 서비스되어야 하는 웹의 특성상 계쏙해서 연결상태를 유지하는 것은 서버 부하로 이어질 가능성이 있어 connectionless 를 갖게됨.
cf) 과거에는 네트워크, 서버 등의 부하로 인해 connectionless 속성이 강조되었지만, 최근에는 네트워크, 서버 등의 성능 향상으로 HTTP/1.1 부터 Keep-Alive 를 통해 일정 시간 동안 사용자와 서버가 계속 연결을 맺고 있는 방식을 사용.
-stateless 속성
:네트워크가 연결이 끝맺을 때 상태를 유지하지 않는 것을 의미. HTTP 요청마다 새로운 커넥션을 열기 때문에 사용자 인증을 계속해서 해야한다는 단점이 있어 Cookie 라는 개념이 나옴.
-HTTP Response
HTTP/1.1 200 OK
Server: Apache/2.4.29(Ubuntu)
Set-Cookie: name=test;
Set-Cookie: age=30; Expires=Fri, 30 Sep
2022 14:54:50 GMT;
-Javascript
document.cookie = "name-test;"
document.cookie = "age=30; Expries=Fri,
30 Sep 2022 14:54:50 GMT;"
// 데이터를 key=value; 쌍으로 쿠키에 저장하고 ; 뒤에 쿠키의 만료시간, 접근할 수 있는 도메인 등 추가 옵션을 설정할 수 있음.
<(7)Session:서버에 데이터를 저장하기 위한 목적>
쿠키에 인증 상태를 포함한 데이터를 저장하면 사용자가 임의 사용자로 인증 된 것처럼 요청을 조작할 수 있음.
세션을 활용하면 데이터를 서버에 저장하고 해당 데이터를 접근할 수 있는 유추할 수 없는 랜덤 문자열 키를 만들어 응답하며, 이를 보통 Session ID라고 부른다. 브라우저는 해당 키를 쿠키에 저장하고 이후에 HTTP 요청을 보내면 서버에서 해당 키에 해당하는 데이터를 가져와 인증상태를 확인한다.
@쿠키와 세션의 차이점
쿠키: 데이터 자체를 사용자가 저장
세션: 데이터를 서버가 저장
<HTTP/ HTTPS>
(1)HTTP= 모든 데이터가 평문으로 암호화 없이 전송된다. 네트워크에서 전송되는 데이터를 감청할 수 있다면 HTTP를 사용하는 통신은 평문으로 노출되고 웹에서 민감한 정보를 다룰 때 문제가 될 수 있다.
cf) 네트워크 상에서 평문으로 통신을 하며 상위 네트워크 장비, 같은 네트워크 상의 MITM 공격 등에 이해 통신이 노출될 경우 평문 정보를 그대로 출력하기 때문에 민감한 정보가 노출되며 심각한 위험을 초래
(2) HTTPS= Transport Layer Security(TLS), Secure Sockets Layer(SSL)를 사용해서 암호화한다.
공개키 암호화를 사용해서 클라이언트와 서버가 키를 교환하기 떄문에 비교적 안전하다.
<(8)Domain Name/ Host Name>
URI 구성 요소 중 Host는 웹 브라우저가 어디에 연결할지 정하게 된다. Domain Name이나 Internet Protocol(IP) Address가 Host에 사용된다.
ex) http://example.com/path1?search=1#fragment =>Host: example.com
IP Address= 네트워크 상에서 통신이 이루어질 때 장치들을 식별하기 위해 사용되는 주소
-의미를 부여해 사용하기 위해 Domain Name을 사용
-Domain Name을 이용해 Host를 조회할 때는 Domain Name과 IP Adress 정보를 매핑해 저장하는 Domain Name Server(DNS)에서 조회해 등록된 IP Address를 가져와 사용한다.
-nslookup을 사용해 Domain Name의 정보를 확인할 수 있다.
<웹서버 어플리케이션>
1)Web Server
-웹 서버는 사용자의 HTTP 요청을 해석하여 처리한 후 응답하여 주는 역할을 하며, 대표적으로 nginx, Apache, Tomcat,IIS 등이 있다.
-웹 서버는 사용자로부터 받는 요청을 (1)웹 서버 자체적으로 처리할지, 들어온 요청에 알맞은 (2)내부 서비스로 연결해줄지를 정할 수 있다.
ex) 클라이언트가 접근한 URI가 .html 확장자를 가진 리소스에 요청 시
:웹 서버에서 해당 경로의 html을 반환해줌
.php 확장자를 가진 리소스에 요청 시
:php 엔진을 통해 해당 요청을 처리
/payment/ 경로로 시작하는 요청에 대해서는
:payment를 처리하기 위한 어플리케이션에게 요청을 연결해주는 역할을 수행
2)Web Application
-웹 어플리케이션은 사용자의 요청을 동적으로 처리할 수 있도록 만들어진 어플리케이션이다.
-웹 어플리케이션을 작성할 때는 사용자가 요청한 내용을 동적으로 처리하기 위해 Web Application Language가 사용되며 대표적으로 PHP, NodeJS, Python, Java 등이 존재한다.
-이 외에도 굉장히 많은 언어가 존재하며 Python의 Django와 flask, java의 spring 처럼 웹 개발을 편하게 해주는 프레임워크도 많이 존재한다.
-또한 웹 어플리케이션은 서버에서 동작하기 떄문에 웹 어플리케이션 구현체에서 취약점이 발생하게 되면 서버와 직접적으로 연결되어 있어 더 큰 영향을 끼친다.
3)DBMS
-데이터베이스 내의 데이터 조회/수정/삽입을 용이하게 사용할 수 있도록 도와주는 서버 어플리케이션
-MySQL, MS-SQL등을 DBMS라 하고 해당 어플리케이션들이 관리하는 데이터를 데이터베이스라 한다.
-데이터베이스에는 사용자의 인증, 상품, 문서 등 중요한 개인 정보가 포함된 여러 가지 내용이 존재하기 때문에 보안에 각별히 신경써야 한다.
cf) SQL Injection 공격 노출
:프로그래머가 데이터베이스 내용을 조회/수정/삽입하기 위해 DBMS를 사용하게 된다. DBMS는 SQL Query를 통해 제어되는데, 이 떄 사용자의 입력 값을 SQL Query에 필터링 없이 사용하게 되면 SQL Injection 공격에 노출된다.
<웹 해킹 개요>
-웹 해킹은 해킹의 의미처럼
1)본래의 의도와는 다른 동작을 일으키도록 하거나
2)주어진 권한 이상으로 정보를 열람, 복제, 변경 가능한 행위가
웹에서 발생하는 것을 말한다.
-기업의 업무, 금융, 쇼핑 등 다양한 분야가 웹으로 서비스화
-> 제공하는 서비스의 복잡도와 다양성이 증가
->서버와 어플리케이션에서 처리하는 사용자의 입력 다양
->다양한 기능구현으로 인한 높아진 복잡도
->의도하지 않은 동작을 일으킬 수 있는 웹 해킹의 위협 증가
-기업에서 사용하는 웹 내부의 정보 :기업의 내부 자료, 직원 정보
-금융/쇼핑 분야: 사용자들의 개인 정보, 금융정보는 다양한 정보
-이에 대한 기업의 대응: 내부 네트워크망을 사용하지만, 웹을 통해 서비스를 운영하는 경우도 많음.
이러한 웹 서비스들은 내부망과 연결되어 있을 가능성이 높아 공격자들이 내부망 침투를 위해 가장 먼저 웹을 공격하기도 함.
-웹에서 발생할 수 있는 취약점에 대하여 익히고 방어 방법을 연구하여 공격자들보다 먼저 취약점을 찾아내 대응할 수 있는 역량을 키우는 것이 중요
-cf) 디페이스 공격= 웹 사이트/웹 페이지의 외관을 변경하는 공격
실제 디페이스 공격 사례 : https://www.boannews.com/media/view.asp?idx=86765&direct=mobile
<웹 해킹 공격 벡터>
웹 해킹의 공격 대상은 크게 Client-side, Server-side로 나뉘며, 공격대상에 따라 공격하는 방식, 형태, 공격을 통해 가능한 행위가 달라진다.
(1)Client-side Attack = 서비스 사용자에 대한 공격을 의미
-웹을 이용하는 사용자는 웹 브라우저를 통해 서비스를 제공받는다.
-웹 서버가 제공해주는 데이터가 공격자에 의해 변조되었을 경우, 웹 브라우저에서 렌더 되는 과정에서 취약점이 발생하는 경우가 대표적인 공격형태이다.
-공격 예시)게시판 서비스의 경우-사용자의 입력을 특별한 검증없이 출력할때
:사용자의 입력도 html처럼 취급되고 스크립트도 삽입할 수 있음.
이를 악용하여 공격자는 다른 사용자의 웹 브라우저에 원하는 행위를 한다.
(2)Server-side Attack = 서비스를 운용하는 서버에 대한 공격을 의미
-다양한 공격 형태가 존재하며, 공격자가 공격에 성공하게 되면 서버의 어플리케이션 코드 또는 다른 사용자의 정보 유출, 서버 탈취 등의 공격으로 발전될 수 있음.
-운영되는 서비스의 구조와 특징에 따라 위협의 형태가 달라짐.
-서비스의 형태에 따라 가지게 되는 특별한 공격방법이 존재할 수도 있다.
ex) 송금 기능을 지원하는 서비스에서 자신이 가진 금액보다 더 큰 금액으로 요청하게 될 떄, 특별한 검증절차 없이 진행된다면->공격자의 악용이 가능해진다.
※ 해당 글의 모든 사진과 내용의 출처는 Dreamhack.io 에 있습니다 ※
'1. Web hacking (웹 해킹) > 2) 개념 정리' 카테고리의 다른 글
[2020.9.19] DreamHack 개념 정리 - Client-side Basic (0) | 2020.09.24 |
---|---|
[2020.05.19] Dreamhack 개념정리 - 5강 Server-side Advanced - SQLInjection (0) | 2020.05.21 |
[2020.05.19] Dreamhack 개념정리 - 4강 Client-side Advanced (0) | 2020.05.20 |
[20.04.07] Dreamhack 개념정리 - Server-side Basic (0) | 2020.04.26 |
[2020.03.31] Dreamhack 개념정리 - Client-side Basic (0) | 2020.04.25 |