본문 바로가기

WarGame/Web

[webhacking.kr 41번] - 파일업로드,copy()함수 취약점


[그림 1] 41번문제


문제개요

41번 문제는 파일 업로드를 통해 내부 함수의 취약점을 이용하는 것이 핵심이다.

본 문제를 풀고 특정 함수에서 발생하는 취약점 발견에 대한 캐치할 수 있는 시야를 가질 수 있는 기회가 될 것이라 본다.


문제풀이

문제의 메인 페이지를 보면 파일을 업로드 할 수 있는 기능만이 존재한다.

임의의 파일을 업로드 해보자.


[그림 2] tmp.txt 파일 업로드



[그림 3] 업로드 후 


다른 웹사이트의 파일업로드와 같이 정상적으로 파일을 업로드할 수 있다.




[그림 4] 소스코드


소소코드에 대해서 살펴보도록 하자.

대략적인 전체 구성 알고리즘은 업로드한 파일을 hidden_dir/(핊터링된)파일명으로 파일의 저장경로에 저장이 되며 해당 파일에 인증값을 저장한다.

필터링 조건중에 ".", "/", "\."는 파일경로를 사용자의도대로 조정하도록하는 것을 방지하는 것이다.예를 들어 흔히 다운로드 취약점에서 사용될때 ../../파일명와 같이 디렉토리를 임의로 조정하는 것처럼 말이다.

"htaccess"와 ".htaccess"는  기존에 시스템에서 생성할 수 있는 파일인데 이 파일을 이용해 일반 사용자권한으로 서버내 각 디렉토리들의 옵션을 변경할 수 있다. 더 자세한 내용은 구글에서 검색해보거나 아래 URL을 참고하길 바란다.

https://httpd.apache.org/docs/2.2/ko/howto/htaccess.html

 

중요한 설명은 이제부터다.

중간에 copy함수를 이용해 임시 파일에 업로드한 파일의 내용을 덮어쓰고 있다.

copy($cp, "$hidden_dir/$fn");

우리가 임의로 설정할 수 있는 부분은 $fn이다.

파일명을 무기명으로 입력하면 어떻게 될까????

이것이 이 문제의 핵심이다.

파일명이 빈칸일 시 copy함수는 에러를 일으켜 에러메세지가 그대로 웹브라우저에 노출이 된다.




[그림 5] file name : <


필터링 과정에서 "<" 이거나 ">" 일시 빈칸으로 대체한다.

즉 파일명을 [그림 5]처럼 변경 후 업로드 시 파일명은 빈칸이 되어 저장이 되는 것이다.


[그림 6] 노출된 hidden_dir


업로드되는 파일경로를 알아냈으니 이제 필터링 되지 않는 파일명으로 파일을 올려보자. 그리고 해당 경로로 들어가 파일의 내용을 살펴보자.



[그림 7] moongi 파일


[그림 8] 키값 출력



'WarGame > Web' 카테고리의 다른 글

[webhacking.kr 42번] -base64 & 다운로드 & 암호크랙  (0) 2016.02.12
[webhacking.kr 47번]  (0) 2016.02.11
[webhacking.kr 20번]  (0) 2016.02.11
[webhacking.kr 19번]  (0) 2016.02.05
[webhacking.kr 27번]  (0) 2016.01.19