CSRF는 Victim의 의지 및 의도와는 무관하게 Attacker가 의도한 특정 행위를 웹 사이트에 요청하는 공격 기법이다.

 

원리는 사용자가 웹 사이트에 로그인한 상태에서 CSRF 공격 소스가 삽입 된 페이지를 열면 웹 사이트를 공격 하게 된다.

웹 사이트는 신뢰하는 사용자의 요청이기에 이를 수행함으로써 공격에 노출되게 되는 것이다.

 

[그림 1]

굉장히 많은 종류의 CSRF 모식도가 그려져 있는데 그중 하나를 퍼왔다. 이를 이용하여 설명 하고자 한다.

 

1.공격자가 사용자에게 공격소스가 삽입된 페이지를 보낸다.

2.로그인 되어 있는 사용자는 이를 실행하고 소스 대로 여러가지 행위를 요청한다.

3.웹은 소스대로 행위에 대한 결과 값을 공격자에게 송신한다.

 

이 모식도는 사용자의 정상적인 Session값을 탈취하여 공격자가 사용자를 대신하려는 것으로 보인다.

 

CSRF는 위 그림과 같은 일련의 방식으로 일어난다.

사용자가 어떻게든 공격 소스를 실행 하게끔 만드는게 이 공격 기법의 핵심이며 이를 위해 여러 방법이 사용된다.

(방법에 따라 모식도가 조금씩 달라진다.)

 

대응 방안

-Referrer 검증

Back-end에서 requet의 referer를 확인하여 전에 들어온 주소와 도메인이 일치하는지를 검증 하는 방법이다.

쉬운 보안이지만 CSRF의 전반적인 공격의 방어가 가능하다. XSS취약점이 존재할 경우 방어가 무의미하며 리퍼의경우 값이 변조 될수 있다. 그러면 어떻게 해야되는가?

 

X-CSRF 커스텀 헤더를 사용하는것이다.

웹 브라우저는 커스텀 헤더를 다른 도메인으로 전달하지 않는다.

따라서 공격자가 공격 페이지를 만들더라도 X-CSRF 헤더가 포함되지 않음을 알수 있다.

그렇다면 만들면 되지 않느냐? 아니다 XHR객체를 사용하더라도 정상적인 요청은 생성할 수 없다.

 

-CSRF Token 사용

사용자 세션에 임의의 값을 저장하여 모든 요청에 대하여 서버단에서 검증하는 방법이다.

XSS 취약점이 있을경우 무용지물

 

-Double-Submit Cookie Pattern

웹 브라우저의 Same Origin 정책으로 공격자가 쿠키값에는 접근 할수 없다는 점을 이용하여 브라우저는 토큰 값과 시크릿키값을 서버로 부터 받는다.

브라우저에서 write 요청시 header에 토큰 값을 주고 쿠키 값에 시크릿키를 부여하여 서버의 미들웨어에서 토큰값을 decode해 decode한 시크릿 쿠키 값과 일치하는지 체크한다.

XSS나 메타태그를 이용하여 쿠키값을 조작 할 수 있어 완벽하지는 않다.

 

 

 

사진 참조: https://stackhoarder.com/2019/08/19/laravel-%EA%B8%B0%EB%B3%B8-10-csrf-protection/

'Basic Concepts > Web' 카테고리의 다른 글

생각날때마다 끄적이는 웹 공격 대응방법  (0) 2020.03.05
XSS (Cross Site Script)  (0) 2020.02.26
meta 태그(meta tag)  (0) 2020.02.25
커맨드 인젝션(Command Injection)  (0) 2020.02.19
브루트 포스(Brute Force)  (0) 2020.02.18

-경쟁상태

둘 이상의 입력 또는 순서 등이 결과값에 영향을 줄 수 있는 상태를 말한다. 입력 변화의 타이밍이나 순서가 예상과 다르게 작동하면서 정상적인 결과가 나오지 않을 위험이 있는데 이를 경쟁 위험이라고 지칭 한다.

 

컴퓨터 메모리 또는 스토리지에서 데이터를 읽고 쓰는 명령들이 같은 순간이라고 해도 될정도로 순식간에 처리된다.

 

그 일련의 과정 중 이전 데이터가 여전히 있는 동안 데이터의 일부 또는 전부를 덮어 씌우려 할 때 경쟁 상태가 발생한다.

 

 

process 1 process 2 memory value
A   0
Flip value   1
  A 1
  Flip value 0

 

프로세스1은 비트 플립을  수행하여 메모리값을 0->1 프로세스2도 비트플립을 수행하여 메모리값을 1->0으로 변경시킨다.

 

 

 

여기서 경쟁상태가 발생하여 두 프로세스가 겹치면 어떻게 될까?

process 1 process 2 memory value
A   0
  A 0
Flip value   1
  Flip value 1

 

메모리 값이 0이어야 하는 마지막 경우의 메모리 값은 1이 되어 있다. 이는 프로세스1이 동시 비트플립을 수행하고 있다는 것을 프로세스2가 파악하지 못하기 때문에 나온 결과이다.

 

 

-경쟁 상태로 인한 취약점

프로그램이 둘 이상의 작업을 동시 수행 하도록 하면 공격자는 교착 상태 또는 스레드 블록 상황을 만들기 위해 시작 시점과 보안 제어가 적용 되는 시점 사이의 시간 간격을 활용 할 수 있다.

(교착상태는 소프트웨어 시스템의 정지를 스레드 블록은 응용 프로그램 성능에 영향을 줄 수 있다.)

 

 

- 대응 방안

메모리 또는 스토리지 엑세스의 직렬화를 통해 경쟁 상태를 방지 할 수 있다.

 

 

webhacking.kr의 60번 문제가 네트워크에서 이를 이용하여 해결하는 문제다.

 

'Basic Concepts > System' 카테고리의 다른 글

SFPO(Stack Frame Pointer OverFlow)  (0) 2020.04.22
BOF(Buffer Over Flow)  (0) 2020.04.22
RET Sled  (0) 2020.04.22
NOP Sled  (0) 2020.04.10
스택(Stack)과 스택프레임(Stack Frame)  (0) 2020.01.26

커맨드 인젝션이란 웹 요청에 시스템 명령어를 삽입 하여 실행 하는 공격이다.

OWASP TOP10에도 속할 정도로 위험한 취약점에 해당한다.

 

OWASP TOP10

https://www.owasp.org/images/b/bd/OWASP_Top_10-2017-ko.pdf

 

웹 내부에서 시스템 명령어를 실행하는 경우 입력값을 제대로 검사하지 않는다면 공격자 마음대로 시스템 명령어를 실행 할 수 있게 된다. 이는 웹 개발자가 공격자를 위해 웹쉘을 제공하는 거나 다름이 없다.

 

[그림 1]

정상적으로 동작하는 서버를 대상으로 공격자가 ;cat /etc/passwd를 요청하는데 이는 ping IP;cat /etc/passwd 형식으로 수행이 된다.

 

대응방법

Command Injection 공격은 취약한 함수를 사용함에 따라 발생한다.

취약한 함수로는

perl  :  open(), sysopen(), system(), etc....

php :  exec(), system(), popen(), include(), eval(), preg_replace(), etc...

등이 있다.

 

또한 |, &, ; 와같은 멀티라인을 지원하는 특수문자는 검사 해주는 것이 중요하다.

 

 

'Basic Concepts > Web' 카테고리의 다른 글

생각날때마다 끄적이는 웹 공격 대응방법  (0) 2020.03.05
XSS (Cross Site Script)  (0) 2020.02.26
meta 태그(meta tag)  (0) 2020.02.25
CSRF(Cross-Site Request Forgery)  (0) 2020.02.25
브루트 포스(Brute Force)  (0) 2020.02.18

[브루트 포스]

브루트 포스 일명 무차별 대입 공격은 공격자가 공격 대상에게 무수하게 많은 요청을 보내 하나 맞아 떨어지는 것을 찾아내는 공격 기법이다. 가능한 모든 경우의 수를 검색해 보는 것이기에 이론적으로는 정확도가 굉장히 높다.

여기서 눈 여겨봐야 될 것은 공격자의 컴퓨터 자원이다. 브루트 포스의 경우 병렬 작업이 가능하여 여러대의 컴퓨터 혹은 병렬 프로그래밍 기법을 사용하여 공격에 걸리는 시간을 단축 시킬 수 있다. 

 

브루트 포스 공격은 크게 두가지로 구분 할 수 있다.

1. 자동 부루트 포스 : 무식하게 모든 경우의 수를 전부 대입하는 방법이다.

 

문자열은 0~9 a~z A~Z 그리고 특수 문자들까지 경우의 수를 따져보면 자릿수가 늘어날때마다 기하급수적으로 증가한다.

ex)48^n (n은 자릿수)

 

그렇기에 많은 회원가입 서비스들이 몇자리 이상, 대소문자, 특수문자를 섞어 쓰는 것을 권장한다.

 

이는 단순히 문자열의 복잡성을 증가시켜 브루트 포스의 공격을 완화시키는 방법이지만 효과는 확실하다.

http://howsecureismypassword.net/를 통해 재미삼아 자신의 비밀번호가 얼마나 안전한지 확인 해볼 수 있다.

 

2. 딕셔너리 어택 : 사전에 있는 단어를 순차적으로 대입하는 방법이다.

 

사전에 적힌 문자열을 참조하여 사람들이 많이 사용하는 단어들을 공격에 사용한다.

 

*만약 딕셔너리에서 자신이 사용하는 비밀 번호를 발견한다면 교체하는 것을 권장한다.

 

대응 방법

 

무차별 적인 대입 공격을 컴퓨터는 순식간에 처리해 줌으로 이를 뒷바침해준다. 그렇다면 처리 속도를 의도적으로 늦춰주는 방법은 어떨까?

 

속도를 늦출 수야 있지만 언젠가는 풀리기 때문에 근본적인 해결책은 되지 못한다.

처리 지연 시간이 길면 일반적인 사용자는 피해를 보며 공격자는 공격 성공까지의 시간이 늦춰질 뿐이다.

 

그렇기에 n회 인증 내에 성공하지 못하면 locking이 되는 방식이 도입되었다.

여러 웹 사이트에서 사용 되고 있으면 휴대용 단말기에서도 사용 되고 있다.

Lociking

 

또한 브루트 포스에 한정하여 캡챠도 좋은 방안중에 하나이다.(캡챠도 완벽하지는 않다 우회가 가능 하기 때문이다.)

현재는 많은 대응 방법이 나와있다.

CAPTCHA

갭챠의 새로운 버젼인 리캡챠도 대응 방안의 하나이다.

 ReCAPTCHA

브루트 포스 공격에 대한 대응 방안이기에 완벽히 안전하지는 않다.

 

추후에 이 방법들의 우회도 다루어 보도록 하겠다.

'Basic Concepts > Web' 카테고리의 다른 글

생각날때마다 끄적이는 웹 공격 대응방법  (0) 2020.03.05
XSS (Cross Site Script)  (0) 2020.02.26
meta 태그(meta tag)  (0) 2020.02.25
CSRF(Cross-Site Request Forgery)  (0) 2020.02.25
커맨드 인젝션(Command Injection)  (0) 2020.02.19

IDS란 Intrusion Detection System의 약자로 '침입 탐지'를

IPS란 Intrusion Prevention System의 약자로 '침입 차단'을 의미한다.

 

IDS/IPS

침입 탐지 시스템은 네트워크 및 호스트 상에서 방화벽이 탐지할 수 없는 악성 트래픽을 탐지하기 위해 사용된다.

HIDS(Host-based IDS)와 NIDS(Network-based IDS)가 있다.

 

1.호스트기반 침입 탐지 시스템(HIDS)

-호스트에서 애플리케이션 로그, 시스템 콜 등은 분석하여 침입을 식별한다.

-네트워크에 대한 침입탐지는 불가능하다.

ex) Tripwire

 

2.네트워크 기반 침입 탐지 시스템(NIDS) 

-네트워크를 통해 전송되는 패킷을 수집 문석하여 침입을 탐지한다.

-설치 위치에 따라 네트워크 감시 대상 범위가 조절이 가능하다.

ex) Snort

 

Snort란 오픈소스 네트워크 IDS/IPS 시스템으로 트래픽 분석과 패킷 기록이 가능하다.

 

IPS 는 네트워크를 통과하는 트래픽을 감별하고 차단 격리시키는 일을 한다.

-침입차단 시스템

-능도적 방어 제공

-비정상 및 악성 트래픽 차단

 

OSI 7Layer에서 

방화벽은 전송 계층과 네트워크 계층만을 하는 반면

IDS/IPS는 네트워크, 전송, 세션, 표현, 응용 계층을 검사한다.

 

 

 

IDS/IPS 사진 출처https://ipwithease.com/difference-between-ips-and-ids-in-network-security/

'Basic Concepts > Network' 카테고리의 다른 글

curl(Clinet URL)  (0) 2020.03.17
SSL Strip Attack & SSL MITM Attack  (0) 2020.02.27
SSL (Secure Socket Layer)  (0) 2020.02.26
HSTS(HTTP Strict Trasport Security)  (0) 2020.02.25
방화벽 (FireWall)  (0) 2020.01.23

주기억장치보다 더 큰 메모리 영역을 제공하기 위해 우리의 컴퓨터는 가상 메모리라는 것을 사용한다.

이를 이용하여 프로세스들은 각각의 가상 주소 공간을 가지고 있다.

[그림 1]

가상적으로 주어진 주소 가상 주소(논리 주소)와 실제 메모리 상에서의 주소를 가리키는 물리 주소(실 주소)가 있다.

 

가상 주소 공간은 MMU(메모리 관리 장치)에 의해 물리 주소로 변환되며 두 주소를 매핑 시키기 위한 기술이 바로 페이징이다.

 

페이징 기법이란 컴퓨터가 메인 메모리에서의 사용을 목적으로 2차 기억장치로부터 데이터를 저장 및 검색하는 메모리 관리 기법이다.

 

이때 가상 기억 장치를 모두 같은 크기의 블록으로 편성하는데, 이 블록을 페이지라 한다.

주소 공간을 페이지 단위로 나눈 다음 실질적인 기억공간은 페이지 크기와 같은 프레임으로 나누어 사용한다.

 

페이지 : 가상 메모리를 일정한 크기로 나눈 블록 

프레임 : 물리 멤모리를 일정한 크기로 나눈 블록

 

프레임과 페이지의 크기는 같다.

 

페이지가 프레임과 매핑이 된다면, 물리 메모리에 위치한다.

그렇지 않았다면 페이지들은 외부 저장장치, 보조기억장치에 저장된다.

 

하나의 프로세스는 하나의 페이지 테이블을 갖는다. 페이지 테이블은 페이지의 정보가 담겨 있다.

페이지 번호, 페이지에 할당된 물리 메모리 즉, 프레임의 시작 주소를 값으로 가지고 있다.

 

페이지 테이블 엔트리(PTE)라는 것이 존재한다. 

이는 페이지 테이블의 레코드이다.

 

페이지 기본 주소(Page base address)

 

플래그 비트(Flag bit)

  •  접근 비트 : 페이지에 대한 접근이 있었는지를 나타낸다.
  •  변경 비트 : 페이지의 내용에 변경이 있었는지를 나타낸다.
  •  현재 비트 : 현재 페이지에 할당된 프레임이 있는지를 나타낸다.
  •  읽기/쓰기 비트 : 읽기/쓰기에 대한 권한을 표시한다.

마지막으로 동적 주소 변환이다.

 

페이징 기법에서 동적 주소 변환 과정은 알아두는것이 좋다.

 

1. 수행중인 프로세스가 가상 주소를 참조한다.

2. 페이징 기법을 통해 페이지 a가 페이지 프레임 A에 있음을 알아낸다.

3. 실 주소 = A + 오프셋을 한다.

'Basic Concepts > Reverse Engineering' 카테고리의 다른 글

IA-32(Intel Architecture 32) Register  (0) 2020.01.24
바이트 오더링  (0) 2020.01.24

+ Recent posts