파라미터 변조

- 클라이언트와 서버 사이에서 주고받는 파라미터 값을 조작

- 매개변수라고 하며 웹페이지상에서 request 대한 값을 가지고 있는 변수

- 사용자 기밀정보, 허가, 상품의 개수, 가격 등을 조작

- 이러한 정보는 쿠키나 숨겨진  필드, UR 쿼리 문자열 등에 저장


출처: http://elmosec.tistory.com/4 [보알못 엘모의 보안 겅부 필기 공책 :)]


게시판으로 예시를 들어보도록 하겠습니다.

게시판의 메인 페이지입니다. 여러 글들이 있고, 그 중 비밀글인 글들이 보입니다.

파라미터 변조를 통해 비밀글에 접근을 해보도록 하겠습니다.


1. 대상 확인

1.1) 비밀글을 열람하려고 글을 클릭하면 비밀번호를 묻는 페이지가 나오고, 비밀번호가 틀리면 비밀번호가 틀렸다는 얼럿이 나타납니다. 


1.2) 서버에 날아가는 요청을 프록시 툴인 Burp Suite로 분석을 해보겠습니다.


우선, 요청 url은 openSecret_ok.jsp이며,

POST방식으로 입력한 패스워드가 평문으로 전송되고, 비밀 게시글의 번호가 idx라는 GET파라미터로 전송되고 있습니다.

이 페이지(openSecret_ok.jsp)에서 글의 인덱스와 비밀번호를 파라미터로 받아서 패스워드 검사를 하였는지, 비밀번호가 틀렸다는 알럿 메시지가 뜨는 자바스크립트를 응답으로 받았습니다.


2. 로직 분석

메인 아이디어는 아래와 같습니다. 이 게시판 서비스는 openSecret.jsp에서 비밀번호를 입력 받은 후 openSecret_ok.jsp에서 인증을 하여 인증에 성공한 경우 view.jsp에서 서비스가 실행 되는 구조로써 인증과 서비스 로직이 분리되어 있어 이 점을 이용하였습니다.


3. 우회 시나리오

1) openSecret_ok.jsp 에서 인증가능한 파라미터를 전달합니다.

 - 하나의 새 글을 작성하여 패스워드를 알고있는 글을 만들었습니다.

2) openSecret_ok.jsp의 인증을 따낸 후 view에 글을 열람할 인덱스를 전달 할 것이므로, 이 인덱스를 우리가 원하는 비밀글의 인덱스로 변경하여 전달합니다.


사실 비밀글이 아닌 곳에서 view.jsp에 전달되는 get 파라미터만 변경하여도 비밀글에 접근이 가능했었습니다..ㅋㅋ


조치 방안에서는 이 두 가지 문제점 모두 수정하였습니다. :)


4. 우회 과정

4.1 시나리오에서 언급했던 것 처럼 새 글을 비밀번호 1234로 하여 작성하였습니다. 

4.2 비밀번호 입력 후 패킷을 변조해봅시다.

패스워드를 1234로 변경하였고(입력할 때 부터 1234로 입력해도됩니다.), 인덱스가 원래 4였지만 18(우리가 게시한 글의 인덱스)로 수정하였습니다.

 

4.3 인증에 성공하자 예상한 대로 view.jsp에 GET방식으로 파라미터를 인덱스로 던지고 있습니다. 이 부분을 4(비밀게시글 인덱스)로 수정해보겠습니다.


4.4 우회 성공

5. 조치 과정

5.1 조치 전 소스 코드

openSecret_ok.jsp



view.jsp


위 로직의 가장 큰 문제점(본인이 짰지만..)이라고 생각한 건 위에서 말한 것 처럼 인증 로직과 서비스로직이 분리되어 있기 때문에 이 같은 취약점이 발생했다고 생각했습니다.

openSecret_ok.jsp에서는 인증만을 수행하고 view.jsp에서는 글을 보여주는 서비스 로직만 있으므로, 생각해낸 방법은 openSecret_ok페이지를 삭제하여 인증 과정을 view.jsp페이지에 넣는 방법을 사용해보기로 하였습니다.

5.1 조치 후 소스 코드

먼저, openSecret.jsp의 소스에서 입력 내용을 openSeceret_ok.jsp로 전송하던 부분을 view.jsp로 전송하도록 수정하였습니다.


이후 view.jsp에서는 pw를 추가로 파라미터로 수신하며, 비밀글 여부 체크 후 비밀번호 인증하는 로직을 추가하여 조치하였습니다.


'Study > WEB' 카테고리의 다른 글

jspBoardProject#5(File Download)  (0) 2017.02.08
jspBoardProject#4(SQL Injection / Blind SQL Injection)  (0) 2017.02.07
jspBoardProject#2(XSS)  (0) 2017.02.06
jspBoardProject#1  (0) 2017.02.06

XSS

XSS(Cross-site Scripting)는 웹 상에서 가장 기초적인 취약점 공격 방법의 일종으로, 악의적인 사용자가 공격하려는 사이트에 스크립트를 넣는 기법을 말합니다.

스크립트가 삽입 가능할 때 쿠키 탈취, 악성코드 유포, 특정 사이트로 납치 등 많은 공격이 가능 합니다.


게시판으로 예시를 보도록 하겠습니다.

게시판에 글을 작성 하며 글 내용에 알림창을 띄우는 간단한 자바스크립트를 삽입하였습니다.



해당 글을 열람하기위해 제목을 누르는 순간 삽입한 javascript 코드가 실행 되는 것을 확인 할 수 있습니다.


게시판의 글 작성 로직을 살펴보면

1. write.jsp에서 작성자 / 제목 / pw 등의 입력을 받는다.

2. write.jsp에서 입력 값의 유효성을 검사한다.

3. wirte_ok.jsp에서 게시글을 DB에 등록한다.

위 과정을 통하여 글이 작성되는 것을 살펴 볼수 있습니다. 


아래의 자바스크립트 코드는 위 과정 중 2번에 해당하는 부분으로 클라이언트가 글을 작성 한 후 그 컨텐츠의 유효성을 체크하는 코드입니다. 

보이는 것처럼 글을 작성할 당시 각 필드의 값이 빈 값인지 여부만을 확인 하고 있습니다. 


이 코드만 보면.. 글 제목과 작성자 란에도 스크립트 삽입이 가능하며, 메인페이지만 열어도 스크립트가 실행되어 방문자 모두가 스크립트를 실행하게 될 수 도있 습니다.

이제 이 유효성 검사 부분을 수정하여 XSS를 방어하는 방법 중 입력 내용을 필터링 하도록 수정해보도록 하겠습니다.


각 필드의 공백 유효성 검사 한 후 공백이 아닌 경우 스크립트에 포함되는 문자열들을 빈문자열 혹은 다른 문자열로 대체하도록 필터링을 하는 코드를 추가하였습니다.


결과로 같은 스크립트를 삽입하였을 때 아래와 같이 게시글이 필터링되어 게시됩니다.


   



'Study > WEB' 카테고리의 다른 글

jspBoardProject#5(File Download)  (0) 2017.02.08
jspBoardProject#4(SQL Injection / Blind SQL Injection)  (0) 2017.02.07
jspBoardProject#3(파라미터 변조)  (0) 2017.02.06
jspBoardProject#1  (0) 2017.02.06

JSP를 사용하여 간단하게 게시판을 만들고 취약점을 찾아 진단, 조치까지 해보기로 하였습니다.

게시판을 만드는 과정은 소스코드를 첨부 : jspBoardProject.zip하는 것으로 생략하고

취약점을 진단하고 조치하는 과정에 초점을 맞추어 블로깅을 해보도록 하겠습니다.

급박하게 개발하느라 발로 짠부분도 있고, 후에 취약점 진단을 하기위해 일부러 취약하게 짠점도 있는데 

양해부탁드립니다 ㅠㅠ


개발 환경은 아래와 같습니다.

개발환경 

1. IDE : STS 3.8.3 / Dynamic Web Project

2. DB: mysql


간단하게 게시판의 형태를 살펴보도록 하겠습니다.

게시판의 메인화면입니다.



분석해볼 게시판의 기능은 크게 

1. 일반/비밀 게시글 작성

2. 파일첨부 기능


3. 게시글 정렬 기능


4. 게시글 검색 기능

5. 게시글 삭제 기능


6. 게시글 수정 기능

일반적으로 게시판이 가지는 기능을 가지고 있습니다.

블로깅은 취약점 진단/해당 취약점 조치 식으로 진행 해보도록하겠습니다.

'Study > WEB' 카테고리의 다른 글

jspBoardProject#5(File Download)  (0) 2017.02.08
jspBoardProject#4(SQL Injection / Blind SQL Injection)  (0) 2017.02.07
jspBoardProject#3(파라미터 변조)  (0) 2017.02.06
jspBoardProject#2(XSS)  (0) 2017.02.06

+ Recent posts