두 번째 취약점인 Http Splitting입니다.
이 공격의 핵심은 CR/LF 즉, 줄바꿈 문자열입니다.
CR(Carriage Return)은 %0d로 커서의 위치를 Line가장 앞으로 이동하는 문자열입니다.
LF(Line Feed)는 %0a로 커서의 위치를 다음으로 이동하는 문자열입니다.
이 문자열들은 URI인코딩 된 문자열로서, Http패킷 내 포함될 경우 줄 바꿈이 가능합니다.
Dos/Window계열에서는 %0d%0a
Unix/Linux계열에서는 %0a
로 사용방법이 상이합니다.
제 실습환경은 Windows7이므로 CR + LF기호를 사용하였습니다.
Stage 1) URI Ecoding 유효성 검사여부 확인
1. 우선 서버 측에서 URI인코딩된 문자열을 필터링하는지 확인하기 위해 간단한 CR/LF구문을 입력하여 서버로 요청을 합니다.
2. 응답패킷 확인결과 URL의 파라미터 부분의 language매개변수에 en%0D%0A값이 필터링 되지 않고 그대로 삽입된 것을 볼 수 있습니다.
서버 측에서 CR/LF문자열을 필터링하지 않는다는 것을 알 수 있습니다.
HTTP패킷의 헤더부분에 이러한 CR/LF기호를 필터링하지 않을 경우 앞에서 포스팅했던 HTTP헤더속성들을 변조할 수 있게 됩니다.
1. 우선 공격코드를 정합니다. 저는 HTTP Body부분에 포함되어 서버로부터 응답받을 페이지의 문자열 길이를 의미하는 Content-Length라는 속성을 0으로 바꾸고자 합니다.
2. 줄 바꿈이 필요한 부분에 CR/LF기호를 삽입합니다.
3. 응답패킷을 확인하여 원하는 위치에 공격코드가 삽입되었는지 확인합니다.
4. 실제 클라이언트 즉, 브라우저가 해석하여 사용자에게 화면을 보여줄 때 정상적인 페이지 코드가 존재하지만 그 길이를 0으로 인식하여 사용자는 공백화면밖에 볼 수 없게 됩니다.
Stage 2) Cache Poisoning
이번 공격은 Cahce내의 페이지정보를 최신화하지 못하게 감염시키는 공격입니다.
브라우저 내 캐시의 작동원리는 이렇습니다.
1) 브라우저가 서버 측에 특정 페이지 요청을 한다.
2) 서버는 응답패킷에 Last-Modified속성에 해당 페이지의 최종수정날짜를 담아 전송한다.
3) 브라우저는 사용자에게 페이지를 보여줌과 동시에 캐시에 최종수정날짜를 저장한다.
4) 추후 브라우저가 동일한 페이지를 요청할 때 서버에게 If-Modified-Since라는 속성에 이전에 받은 최종수정날짜를 포함시켜 전송한다.
5) 서버는 해당 페이지의 수정날짜와 If-Modified-Since속성의 날짜를 비교하여
해당날짜 이후에 수정된 최신페이지가 존재하면 응답메세지에 페이지를 포함하여 전송,
해당날짜와 동일한 페이지가 존재하면 변경되지 않았다고만 응답을 하고 불필요한 페이지데이터는 전송하지 않는다.
아래는 Cache Poisoning공격 과정입니다.
1. 우리가 공격할 검색 Form입니다.
2. Last-Modified속성은 브라우저내의 캐시가 받아들이는 정보입니다.
위와 같이 Last-Modified라는 속성 값을 먼 미래의 시간으로 설정할 것입니다.
해당 속성문자열을 URI인코딩 하여 전송합니다.
3. 응답패킷에는 파라미터 내 URI인코딩된 값이 헤더의 속성으로 삽입된 것을 확인할 수 있습니다.
4. 성공문구가 뜨면서 해당 Lesson이 종료됩니다.
'Web Security > War_Game' 카테고리의 다른 글
[War_Game : WebGoat] 2. 접근제어 취약점 (Access Control Flaws) - 1 (0) | 2014.10.24 |
---|---|
[War_Game : WebGoat] 1. General(일반 취약점) - 1 (0) | 2014.09.24 |
[War_Game : WebGoat] 0. 개요 및 설치 (0) | 2014.09.22 |