본문 바로가기

웹해킹/드림핵

드림핵 로드맵 5~10 학습 [자율학습]

반응형

STAGE 5 CSRF

What is CSRF

CSRF는 임의 이용자의 권한으로 임의 주소에 HTTP 요청을 보낼 수 있는 취약점입니다. 공격자는 임의 이용자의 권한으로 서비스 기능을 사용해 이득을 취할 수 있습니다. 

 

CSRF 공격에 성공하기 위해서는 공격자가 작성한 악성 스크립트를 이용자가 실행해야 합니다. 이는 공격자가 이용자에게 메일을 보내거나 게시판에 글을 작성해 이용자가 이를 조회하도록 유도하는 방법이 있습니다.

CSRF 공격 스크립트는 HTML 또는 Javascript를 통해 작성할 수 있습니다. Figure5는 HTML으로 작성한 스크립트입니다. 이미지를 불러오는 img 태그를 사용하거나 웹 페이지에 입력된 양식을 전송하는 form 태그를 사용하는 방법이 있습니다. 이 두 개의 태그를 사용해 HTTP 요청을 보내면 HTTP 헤더인 Cookie에 이용자의 인증 정보가 포함됩니다.


HTML img 예시

<img src=' http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337' width=0px height=0px>


js 공격 예시

location.href = ' http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337';

 

 


STAGE 6 SQL Injection

 

 

이용자가 SQL 구문에 임의 문자열을 삽입하는 행위를 SQL Injection이라고 합니다. SQL Injection이 발생하면 조작된 쿼리로 인증을 우회하거나, 데이터베이스의 정보를 유출할 수 있습니다.

 

SQL injection 예시

SELECT * FROM accounts WHERE user_id='admin'

 

 

Blind SQL Injection

질의 결과를 이용자가 화면에서 직접 확인하지 못할 때 참/거짓 반환 결과로 데이터를 획득하는 공격 기법

 

import requests
url = 'https://dreamhack.io/'
headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
    'User-Agent': 'DREAMHACK_REQUEST'
}
data = {
    'test': 1,
}
for i in range(1, 5):
    c = requests.post(url + str(i), headers=headers, data=data)
    print(c.text)

requests를 이용해서 exploit을 많이 진행했다. 그 중에서도 login 페이지는 POST 메소드로 많이 구성되기 때문에 POST 메소드를 이용한 Blind SQL Injection을 좀 더 학습했다.

 

 

NO SQL Injection

MongoDB의 NoSQL Injection 취약점은 주로 이용자의 입력값에 대한 타입 검증이 불충분할 때 발생합니다.
MongoDB는 이 외에도 오브젝트, 배열 타입을 사용할 수 있습니다. 오브젝트 타입의 입력값을 처리할 때에는 쿼리 연산자를 사용할 수 있는데, 이를 통해 다양한 행위가 가능합니다. 

 

http://localhost:3000/query?uid[$ne]=a&upw[$ne]=a
=> [{"_id":"5ebb81732b75911dbcad8a19","uid":"admin","upw":"secretpassword"}]

$ne 연산자를 사용해 uid와 upw가 'a'가 아닌 데이터를 조회하는 공격 쿼리와 실행 결과.

 

 

Blind NoSQL Injection

 

db.user.find({upw: {$regex: "^a"}})
db.user.find({$where:"return 1==1"})
db.user.find({$where: "this.upw.substring(0,1)=='a'"})
/?uid=guest'&&this.upw.substring(0,1)=='a'&&sleep(5000)&&'1
db.user.find({$where: "this.uid=='guest'&&this.upw.substring(0,1)=='a'&&asdf&&'1'&&this.upw=='${upw}'"});


STAGE 7 Command Injection

Command Injection은 이용자의 입력을 시스템 명령어로 실행하게 하는 취약점입니다.

'' 	# ''안에 들어있는 명령어를 실행한 결과로 치환
$() # $()안에 들어있는 명령어를 실행한 결과로 치환
&&, || # 명령어 연속 실행
; # 명령어 구분자
| # 앞 명령어의 결과가 뒷 명령어의 입력으로 들어감.

 

 

 

 


STAGE 8 File Vulnerability

1) File Upload Vulnerability

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

 

Path Traversal 취약점

: 업로드에 존재하는 이러한 제약을 우회하여, 임의 디렉토리에 파일을 업로드할 수 있는 취약점

 

 

2) File Download Vulnerability

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

https://vulnerable-web.dreamhack.io/download/?filename=notes.txt
https://vulnerable-web.dreamhack.io/download/?filename=../../../../../../etc/passwd
https://vulnerable-web.dreamhack.io/images.php?fn=6ed0dd02806fa89e233b84f4.png

 


STAGE 9 SSRF

웹 서비스의 요청을 변조하는 취약점으로, 브라우저가 변조된 요청을 보내는 CSRF와는 다르게 웹 서비스의 권한으로 변조된 요청을 보낼 수 있습니다.

 

SSRF 취약점을 통해 웹 서비스의 권한으로 요청을 보낼 수 있다면 공격자는 외부에서 간접적으로 내부망 서비스를 이용할 수 있고, 이는 곧 기업에 막대한 피해를 입힐 수 있습니다.

 

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

http://127.0.0.1:8000/image_downloader?image_url=http://127.0.0.1:8000/request_info

image_url 파라미터를 통해 reqeust_info를 불러온다.

 

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

http://api.internal/search?user_name=secret&user_type=private#&user_type=public
-> http://api.internal/search?user_name=secret&user_type=private

 

 

3)웹 서비스의 요청 Body에 이용자의 입력값이 포함되는 경우

{ "body": "body", "title": "title", "user": "admin" }

 


STAGE 10 Epilogue

 

 

728x90