홈페이지 취약점 분석 이야기 파일 지도 사진 깨알






>> 목록보이기
#웹해킹 실습 #OWASP WebGoat #실습설명서 #계정인증 취약점 #취약한 회원정보 처리 #owasp-zap #HTTP 프록시 #A2-Broken Authentication and Session Management

WebGoat 계정인증 취약점: 다단계 로그인 2 실습설명서

이 문서는 WebGoat 7.0.1의 "Authentication Flaws" > "Multi Level Login 2"의 실습 설명서이다. 로그인 과정을 여러 단계로 나누었을 때에 발생할 수 있는 계정인증 취약점을 실습할 수 있다. 또한 HTTP 프록시를 이용하여 HTTP 통신을 조작하는 방법도 습득할 수 있다.

계정인증 취약점은 실제 웹취약점분석에서 자주 탐지되는 취약점 중의 하나이다. 비밀번호 변경, 비밀번호 찾기, 회원정보 변경 등에서 주로 발생한다. 이 과정에서 서버가 이미 알고 있는 값을 - 예를 들어 사용자 ID나 이메일 주소 - 웹브라우저로 전송한 후 이를 다시 받을 때 취약점이 발생한다. 웹 브라우저로 전송된 값은 정보유출일 뿐만 아니라 변수로 받을 때는 조작이 가능하기 때문이다. 이미 서버가 - 아마도 세션이나 DB 내에 - 파악(저장)하고 있는 값은 웹 브라우저로 전송해서는 안된다.

WH-WebGoat-7.0.1 웹해킹 훈련장을 구동한다. 구동에 관해서는 WH-WebGoat-7.0.1 라이브 ISO 문서를 참조한다. 여기서 WebGoat 훈련장의 IP주소는 192.168.189.238이다.

WebGoat 실행이 완료되면 파이어폭스(FireFox) 웹브라우저로 훈련장에 접속한다. 훈련장 URL은 http://192.168.189.238:8080/WebGoat/이다.

firefox http://192.168.189.238:8080/WebGoat/
owasp-zap 2&> /dev/null

OWASP ZAP을 실행한다. Firefox의 환경설정(Preferences > Advanced > Network > Settings > Manual proxy configuration)에서 HTTP Proxy를 127.0.0.1:8080으로 설정한다.

Authentication Flaws: Multi Level Login 2 공략

WebGoat 훈련장에 로그인하면 - 영문으로 - WebGoat 누리집을 사용법이 나온다. 왼쪽에 설명이나 기초적인 설명, 각종 취약점 실습 목차가 나온다. 오른쪽 중간 윗쪽에는 자바소스(Java Source), 답안지(Solution), 실습계획(Lesson Plan), 귀띔(Hints), 실습 재시작(Restart Lesson) 등의 단추가 있다. 이 단추들을 활용하면 문제풀이와 소스 수준의 취약점 조치방안 이해에 도움이 된다.

Authentication Flaws: Multi Level Login 2에 접속하면 로그인 화면이 보인다. 계정정보는 Joe:banana이며 숙제는 Jane으로 로그인하는 것이다.

WebGoat 계정인증 실습:
[ Authentication Flaws > Multi Level Login 2, Joe:banana 로그인 ]

OWASP ZAP의 상단에 있는 "멈춤" 단추(동그란 초록색 단추)를 눌러서 빨간 색으로 바꾼다. 이제 모든 HTTP 요청과 응답을 OWASP ZAP이 중간에서 잡는다. Joe:banana로 로그인을 시도한다. OWASP-ZAP의 멈춤단추 바로 옆의 이중 진행 단추를 하나씩 누르면 중간에 어떤 HTTP 통신이 이루어지는 지 확인할 수 있다.

WebGoat 계정인증 실습:
[ Authentication Flaws > Multi Level Login 2, TAN 숫자 입력 ]

1단계 로그인에 성공하면 TAN 값을 입력하라고 한다. TAN(Transaction Authenciation Number)은 미국의 은행에서 주로 사용하는 OTP(One Time Password)의 일종이라고 한다. 해당 TAN 값을 입력하고 계속 진행한다.

WebGoat 계정인증 실습:
[ Authentication Flaws > Multi Level Login 2, OWASP-ZAP의 HTTP 통신 확인 ]

OWASP-ZAP의 요청에서 hidden_user라는 변수에 Joe가 지정되어 있는 것을 확인할 수 있다. 2단계 인증에서는 서버가 이 값을 이용할 것으로 추정할 수 있다.

GET http://192.168.189.238:8080/WebGoat/attack?Screen=491&menu=500&hidden_user=Joe&tan2=4894&Submit=Submit HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: */*
Accept-Language: en-US,en;q=0.5
X-Requested-With: XMLHttpRequest
Referer: http://192.168.189.238:8080/WebGoat/start.mvc
Cookie: JSESSIONID=53826CF1BAB29BFD2F569BA78F718755
Connection: keep-alive
Content-Length: 0
Host: 192.168.189.238:8080

해당 HTTP 통신 내용은 위와 같았다. OWASP-ZAP에서 서버로 전송되는 값을 조작해보자.

WebGoat 계정인증 실습:
[ Authentication Flaws > Multi Level Login 2, OWASP-ZAP의 HTTP 통신 조작 ]

GET http://192.168.189.238:8080/WebGoat/attack?Screen=491&menu=500&hidden_user=Jane&tan2=4894&Submit=Submit HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: */*
Accept-Language: en-US,en;q=0.5
X-Requested-With: XMLHttpRequest
Referer: http://192.168.189.238:8080/WebGoat/start.mvc
Cookie: JSESSIONID=53826CF1BAB29BFD2F569BA78F718755
Connection: keep-alive
Content-Length: 0
Host: 192.168.189.238:8080

OWASP-ZAP에서 hidden_user 변수의 값을 Jane으로 변경하여 보내는 장면이다. 이후의 HTTP 통신을 계속 진행하면,

WebGoat 계정인증 실습:
[ Authentication Flaws > Multi Level Login 2, Jane으로 로그인 성공 ]

위와 같이 Joe 대신 Jane이라는 사용자로 로그인에 성공하는 것을 볼 수 있다.

계정인증 취약점은 대부분의 경우에 있어서 인증 과정에서 사용자의 입력값을 서버가 사용할 때 발생한다. 인증과정에서는 이미 인증된 데이터는 웹브라우저로부터 재입력 받아서는 안된다. 이 경우에는 hidden_user 대신 서버의 세션 내에 저장된 계정이름인 Joe를 사용한다면 취약점이 발생하지 않을 것이다.

[처음 작성한 날: 2016.12.09]    [마지막으로 고친 날: 2016.12.10] 


< 이전 글 : WebGoat, LAB: DOM-Based cross-site scripting (2016.12.08)

> 다음 글 : WebGoat, Code Quality: Discover Clues in the HTML (2016.12.10)


크리에이티브 커먼즈 라이선스 이 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 이용할 수 있습니다.
잘못된 내용, 오탈자 및 기타 문의사항은 j1n5uk{at}daum.net으로 연락주시기 바랍니다.
문서의 시작으로 컴퓨터 깨알지식 웹핵 누리집 대문
 __
( 2038년 1월 19일 오전 3시 14분 07초, – Unix  )
( 세상의 끝  )
(  )
( (1970년 1월 1일 이후 2의 32승이 되는  )
( 때이기 때문에)  )
 --
     o
      o
          oO)-.                       .-(Oo
         /__  _\                     /_  __\
         \  \(  |     ()~()         |  )/  /
          \__|\ |    (-___-)        | /|__/
          '  '--'    ==`-'==        '--'  '
.. -- -- | - .. .... | ... / .. .../ ... {] . .. .. .. ..| ...... .../ .../ .. ...... ... ... ] .. [ .../ ..../ ......./ .. ./// ../ ... .. ... .. -- -- | - .. .... | ... / .. .../ ... {] . .. .. .. ..| ...... .../ .../ .. ./// ../ ... .. ... ...| ..../ ./ ... / ..| ....| ........ / ... / .... ...... ... ... ] .. [ .../ ..../ ......./ .....| ..../ ./ ... / ..| ....| ........ / ... / .... ...| ..../ ./ ... / ..| ....| ........ / ... / .... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .