본문 바로가기
프로그램 (PHP,Python)

안전한 PHP 프로그래밍 (첨부파일 다운 & include 함수)

by 날으는물고기 2009. 12. 8.

안전한 PHP 프로그래밍 (첨부파일 다운 & include 함수)

1. 게시판 첨부파일 다운로드 개발시 주의점

국내 대형 IDC 운영사 사이트의 한 게시판에서 첨부파일 다운로드할 때, 내부 파일까지 다운로드할 수 있는 취약점이 있었다.
즉, /etc/ 이하의 파일이나 웹서버 설정 파일, 로그 등을 원하면 쉽게 받아볼 수 있는 취약점이었다.

이를테면 이런식이다. URL/download.html?path=/etc&file=resolv.conf&savename=resolv.txt
(물론 위처럼 직접적으로 URL을 표시하지 않았지만, 눈치만 있으면 쉽게 알 수 있음)
/etc/resolv.conf 를 받아서 PC에 resolv.txt 이름으로 저장하라는 예이다.
'어서오세요. 저희는 개방적인 마인드로 서버의 모든 것을 네티즌에게 원하는대로 다 드립니다.'라고 얘기하는 꼴이다.

이런 취약점을 통해

1) 시스템 사양 파악
  - 퍼미션에 둔감한 SE들이 상당히 많다.
  - 설정 파일 등 OS가 제공하는 기본 퍼미션을 그대로 사용하는 경우가 많다. 그러나 일반 user가 읽지 않아도 되는 파일이 상당히 많고, 실행하지 할 필요가 없는 파일도 매우 많다. 서비스 전에 미리 이런 파일들의 퍼미션을 강화하는게 좋다.
2) 내부 정보의 유출 (서버에 내부 정보 파일이 있다면)
3) 서버의 사양과 설정 파악으로, 시스템의 또다른 취약점까지 발견할 수 있는 위험도 있다.

첨부파일 다운로드시 다음과 같이 프로그래밍을 한다. (개인적으로 정리한 것)

1) 다운로드시 서버내 다운로드 경로를 URL로 지정하는 부분은 없앤다. 다운로드 로드 경로는 웹프로그램 내부 설정을 통해 처리해야.
2) /, \ 이나 .. 등 의 디렉토리 이동과 관련된 것은 사용하지 못하도록 한다. (필터링)
3) 파일명을 지정하지 않도록 하거나, (no=1 이면 게시물 1번의 파일 정보를 DB에서 읽어 다운로드시켜주면 된다.)
4) 암호화 처리하여 지정하게 한다.


2. php프로그래밍에서 include 취약

php에서 include() 함수를 사용할 때 주의하지 않아서, 내부 파일(local inclusion)이나 원격지 파일(remote file inclusion)을 include할 수 있는 취약한 사이트들이 있다.

의도적으로 URL을 통해 값을 넘겨받아 처럼) include하도록 개발하는 경우도 있다.
이를테면 왼쪽 메뉴는 고정인데, 오른쪽 내용만 바뀌는 페이지의 경우 include(page/$inc); 처럼 아주 단순하게 만들어 놓고, URL에는 사이트주소?inc=page1과 같이 처리하는 곳도 있다는 것이다. 유저를 너무나 신뢰하는, 믿음이 강한 개발자다.

1) include되면 원하는 서버 설정 파일을 볼 수 있는 것은 기본이다.

2) local include가 될 때 command를 실행할 수 있는 방법도 있다.
(원격지 파일을 include할 수 없더라도 command를 실행할 수 있음)

웹서버의 웹로그를 이용하는 방법이다. 특정한 방식으로 웹요청을 하여 웹로그에 <? ?> 등의 php tag가 저장되도록 하고, 이 웹로그 파일을 include되도록 하면 된다.
URL에 <? phpinfo(); ?> 를 요청하면 이게 %NN 처럼 인코딩되어 로그에 남기 때문에, 효과가 없다. 따라서 User Agent, Referer, 아파치 인증부분을 통해서 요청한다.

-
XAS(Cross Agent Scripting), XRS 취약점에 대해 (2009.3, 글 좋은진호)

위 XAS, XRS 취약점을 이용하듯이 웹요청을 하면, 웹로그에 <? phpinfo(); ?> 를 남길 수 있다. 위 글대로 요청할 때 웹로그에는 다음과 같이 남는다. 이해되는가? 이제 include에 이 로그파일만 지정해주면 php 명령을 실행할 수 있다. 물론 log파일을 읽을 수 있도록 퍼미션이 된 경우.
코드:

# 공개가 불필요한 부분은 ???로 변경해서 표시했다.

???.???.???.??? - - [??/???/2009:11:47:01 +0900] "GET / HTTP/1.1" 200 3901 "<script>alert('hello')</script>" "Mozilla/5.0 (X11; U; Linux i686; ko; rv:1.9.0.4) Gecko/200??????? Firefox/3.?.?"

-
Local File Inclusion - Tricks of the Trade (글 xeraph)

위의 글은 apache의 인증 부분을 필드에 <? .. ?> 와 같은 명령을 남기는 트릭입니다. 대단한 트릭이다. 어떻게 저런 생각을...

include 취약점을 없애기 위해 다음과 같이 프로그래밍을 한다. (개인적으로 정리한 것)

1) allow_url_include = off. php 5.2.x에서는 allow_url_include가 off로 되어 있다. 그 이전 버전 사용할 때, allow_url_fopen 로 설정하는데, 원격지 파일을 include나 fopen하는 경우가 없다면 off로 한다.
2) include() 함수에 사용되는 변수는 유저가 직접적으로(URL로) 설정할 수 없도록 한다.
3) include() 함수에 사용되는 변수값은 http :// , ftp :// 나 /, \, .. 등 을 필터링 처리한다.
4) 가능하면 register_globals = off


3. 안전한 php 프로그래밍에 관한 글들

-
PHP Security (Error reporting, SQL injections, XSS, file inclusion, XSRF 등)
-
PHP Security: Fortifying Your Website- Power Tips, Tools & How to’s
  ( Register_Globals, Error Reporting, XSS, File Inclusion, PHP Security Tools(PhpSecInfo, PHP Security Scanner, Spike PHP Security Audit Tool) 등)
-
PHP Security (PHP_SELF, Email Header Injection, Including Files, Error Reporting 등)
-
Remote File Inclusion


※ 참여자 : RedBaron, 범냉이, 티니, 좋은진호
※ 11.2(월)에 했던 커피닉스 이야기 중 비중 있는 부분을 별도로 정리했다.

출처 : http://coffeenix.net
728x90

댓글