첨부터 깃헙링크를 준다.

 

코드 오디팅을 해보자.

 

 

대충 코드해석 해보면

1. 내 공인ip md5해서 내 고유 디렉터리 생성

2. 거기에 빈 파일인 index.php 생성 ( /upoad/{md5(myip)}/index.php )

3. 확장자에 ph 나 htacess 가 들어가면 ban

4. 파일 내용에 <? 가 들어가면 ban

5. exif_imagetype이 false이면 ban

6. 유효성 검증이 끝나면 내가 올린 파일명으로 파일 생성

 

 

굳이 index.php를 만드는게 힌트라면 힌트인것 같다.

 

어떻게 업로드하지 고민고민하던중 preg_match에 'htacess'가 들어가면 ban이라는걸 보았다.

 

어라.. .htaccess 인데 htacess... c가 하나 빠졌다

 

아! 필터링 실수를 의도하고 낸 문제구나 하고 .htaccess로 익스하기위해 열과 성을 쏟아부었지만.. 왜인지 안되었다.

 

내 서버에도 똑같이 세팅하고 올려봤는데 내서버에선 웹쉘이 잘 동작하는데 문제서버에선 안되었다,,,

 

 

일단 다른 문제에서도 .htaccess를 업로드하여 문제를 풀어야 할 경우를 대비해 팁을 적어보자면 

 

위 상황에서 필터링을 우회하기 위해선

 

3. 확장자에 ph 나 htacess 가 들어가면 ban

 - .php가 아닌 다른 확장자의 파일을 실행파일로 인식하도록 함

  -> AddType application/x-httpd-php .png

 - htacess라고 잘못 필터링 되어있으므로 .htaccess를 업로드하는데에 아무 문제가 되지 않음

  

4. 파일 내용에 <? 가 들어가면 ban

 - .htaccess 설정을 제어하여 멀티바이트 캐릭터로 인식하도록 할 수 있다.

  -> php_value zend.multibyte 1

  -> php_value zend.detect_unicode 1

  -> 실제 업로드 파일을 <\x00?\x00p\x00h\x00p\x00 ... 중략 ... 이런식으로 멀티바이트 캐릭터로 구성

 

5. exif_imagetype이 false이면 ban

 - exif_imagetype에서 바라보는 image extension들이다.

https://www.php.net/manual/en/function.exif-imagetype.php

 

 - 해당 이미지 타입에 대하여 헤더를 검사하는 방식으로 이미지인지 아닌지를 판단한다.

 - 각 이미지 타입별로 어디까지 이미지 헤더를 검사하는지 (몇 바이트를 검사하는지)는 이미지 타입마다 다르다. 관심있는 분은 직접 해당 소스코드를 찾아봐도 괜찮을 것이다.

 - 찾아보니 쓸만한 이미지헤더론 'GIF89a'와 '\x00\x00\x89'가 있었다

 - 나는 후자인 '\x00\x00\x89' 를 이용하여

 

\x00\x00\x89\x0d\x0a<\x00?\x00p\x00h\x00p\x00 ... 중략 ...

 

이와같은 식으로 멀티바이트 웹쉘을 만들 수 있었다.

 

이를 실제로 내 서버에 htaccess를 적용하였을 때 위와같은 웹쉘 파일을 .png로 실행시키는것이 가능하였다.

 

그래서 다 풀었다고 생각하고 문제서버에 적용했는데 왠걸? 안되는것이다.

 

내가 놓친것이 있을까 하였는데 모르겠어서 라업을 찾아봤따.

 

 

아.. 문제 서버가 nginx로 운영중인것이 힌트였던 것 같다.

 

nginx 서버가 fastcgi 설정이 켜져있을 경우 .htaccess를 통해 서버 설정을 바꾸어 웹쉘을 업로드하는것과 비슷하게 .user.ini 파일을 업로드하여 내 마음대로 동작하게 할 수 있다고 한다.

 

이때 이용하는 설정으론 auto_prepend_file={file} 으로, 해당 옵션이 있으면 include('./header.php')와 비슷한 효과를 낸다.

 

모든 페이지에서 auto_prepend_file로 설정된 파일을 include 하게 되는데, 여기에 웹쉘을 작성하면 되고, 웹쉘은 <script language='php'>system('ls -al /;');</script> 와 같이 실행시킬 수 있다고 한다(신기..)

 

.user.ini

GIF89a=1

auto_prepend_file=a.png

 

a.png

GIF89a=1

<script language="php">system('ls -al');</script>

 

+ Recent posts