본문 바로가기

Computer/Linux

PHP 보안(조별발표자료)

PHP 보안1. 설치만약 apache,mysql, php 기본 설치 라면 아래로 하면 됩니다. FTP함수와 XML 지원되도록 설정 하는 것이구요. 최적화 되도록 설정 하는 것입니다. trans-id 옵션은 세션값이 따라 다니게 만드는 것으로 보안 최적화 입니다.아래 2개 부분이 PHP 를 좀더 빠르게 해줍니다. ^^   --enable-inline-optimization      --disable-debug      ./configure       --with-apache=/usr/local/apache       --with-mysql=/usr/local/mysql               --with-xml          --with-config-file-path=/usr/local/apache/conf       --enable-versioning       --enable-url-includes       --enable-trans-id             --enable-ftp       --enable-sockets       --enable-ctype       --enable-calendar       --enable-bcmath       --enable-sysvshm=yes       --enable-sysvsem=yes       --enable-inline-optimization           --disable-debug 2. register-globals offPHP 설정 옵션 "register_globals" 를 off 로 설정하고 PHP 4.1.0 이상 버전을 사용해라. PHP 4.1.0 에는 몇몇 특별한 배열이 추가되어 있는데, 특히 $_REQUEST 는 "register_globals" 가 off 로 설정되어 있을 때 PHP 로 소프트웨어를 개발하는 것을 더욱 간단하게 한다. register_globals 를 설정함으로써 대부분의 일반적인 PHP 공격을 완전히 제거할 수 있는데 이러한 설정이 신규 설치시의 디폴트가 될 때까지 이에 대비해라. register_globals 가 off 로 설정되어 있다고 가정하더라도 이를 우선적으로 검사해야 하며 그렇지 않은 경우는 중지해야 한다 - 이렇게 함으로써 프로그램을 설치한 사람들은 문제가 있음을 재빨리 알아차릴 것이다. 이러한 설정시 작동하는 제삼자 (third-party) 의 PHP 애플리케이션은 거의 없음을 주목해라. 따라서 현재 전체 웹 사이트에 대해 이를 off 로 유지하기는 힘들다. 또한 "register_globals" 를 금지하는 것이 제삼자에 의해 호스트되고 있을 때는 더욱더 어렵다.단지 몇몇 프로그램에 대해서만 register_globals 를 off 로 설정하는 것이 가능한데 예를 들어 아파치의 경우 PHP 디렉토리내의 .htaccess 파일에 다음을 삽입할 수 있다 (또는 이를 더욱 제어하기 위해 Directory 지시를 사용해라).  php_flag register_globals Off php_flag track_vars On 3. PHP 에서 form 문이나 session 의 변수를 $name 등으로 사용하지 말라.  브라우져 주소 표시줄 에서 http://localhost/tood=net&userid=3  등으로나 여러 방법으로 쉽게 뚫릴 수 있다.  반드시 HTTP_POST_VARS 나 HTTP_SESSION_VARS로 체크.  4. Error-messagephp.ini의 Error_Handling 부분에서 display_errors = Off 로 설정.   --> 오류가 보여지면, apache 디렉토리 위치 나 htdocs 디렉토리 위치가 보이게 된다.5. 파일관련특히 원격 파일 접근을 예방하기 위해 파일 이름 생성에 사용되는 모든 사용자 정보를 필터링해라. PHP 는 다른 언어에서 로컬 파일만을 단지 오픈할 수 있는 fopen() 과 같은 파일-오프닝 명령이 다른 사이트로부터의 웹 또는 ftp 요청을 수행하는데 사용될 수 있음을 의미하는 "remote filew" 기능성이 디폴트로 설정되어 있다. 예전 스타일의 파일 업로드를 사용하지 마라; HTTP_POST_FILES 배열과 관련된 함수를 사용해라. PHP 는 특별한 이름을 갖는 어떤 임시디렉토리에 파일을 업로드함으로써 파일 업로드를 지원한다. PHP 는 그 파일 이름이 존재했던 곳을 가리키기 위해 원래 많은 변수들을 설정한다. 그러나 공격자가 변수 이름 및 그 값을 제어할 수 있기 때문에 이들을 사용해 커다란 악영향을 야기할 수 있다. 대신 업로드된 파일에 접근하기 위해서는 언제나 HTTP_POST_FILES 및 관련된 함수를 사용해라. 이 경우라도 PHP 는 공격자가 임의의 내용을 갖는 파일을 업로드할 수 있게 하며 이는 그 자체로 위험함을 주목해라. 가. php,inc,html,htm,phtml,php3 등의 확장자는 절대로 올릴 수 없게 한다.   나. 업로드 디렉토리는 무조건 htdocs 아래 말고 다른 디렉토리 에 올린다.  /updir 이나 c:updir 등 htdocs 와 관련이 없는 디렉토리에 올리게 한다.   다. COPY명령을 사용시에 exec(copy $file , 처럼 exec() 를 절대로 사용하지 말아야 한다.      copy()만을 사용하라. 라. REQUEST_METHOD!="POST" 로 체크 해서 올리기  POST 가 아닐 경우 올리지 못하게하고 form 에서 method=get 으로 절대 절대 하지 말것.   마. 파일명이 pass 나 shadow 나 리눅스 시스템 파일일 경우는 올리지 못하게 하라. 그러니까 upload.php 파일을 이용하여 주소표시줄에서  upload.php?file_name=/etc/passwd&file_type=text&file_size=30  등으로 해서 해킹할 시스템의 passwd 파일을 자료실에 올리고 다운 받을 수 있다. 바. 또는 file_exists($file_name) 를 사용하여 체크 합니다. 로컬시스템에 파일이 있으면 절대 못올리게 한다. /etc/passwd 파일의 업로딩을 방지. 6. 단지 보호된 시작 파일 (entry point) 들만 문서 트리내에 놓아라; 모든 다른 코드 (대부분의 코드일 것이다) 는 문서 트리 외부에 놓아라. PHP 는 이 주제에 일련의 잘못된 충고를 하였다. 원래 PHP 사용자는 ``포함 (included)"파일에 ``.inc" (include) 확장자를 사용한다고 가정되었다. 그러나 이러한 포함 파일은 대개 패스워드와 다른 정보를 갖고 있으며 아파치는 ``.inc" 파일이 문서 트리내에 있을 때요청된 경우 요청자에게 이 파일의 내용을 제공할 것이다. 따라서 개발자들은 모든 파일의확장자를 ``.php" 로 하였다 - 이는 파일 내용이 보여지지 않지만 entry point 가 전혀 아닌 파일이 entry point 가 되어 악용될 수 있음을 의미한다. 초기에 언급했듯이 보통의 보안 충고가 최선이다: 단지 보호된 entry points 만 문서 트리내에 놓고 라이브러리 등의다른 코드는 문서 트리 외부에 놓아라. 문서 트리내에 어떠한 ".inc" 파일도 있어서는 안된다. AddType application/x-httpd-php  .php .php3 .inc .html .htm .phtmlAddType application/x-httpd-php-source .phps  PHP 스크립트 파일의 확장자를 등록하는 부분이다.  반드시 모든 php 스크립트 확장자를 등록해야 한다.  일반적으로 하나의 스크립트 파일에 포함되는 인클루드 파일의 확장자를 .inc 로 쓰는 경우가 많은데 반드시 이 인클루드 파일의 확장자도 등록을 해야 한다.바로 브라우져에서 보일 수 있으며 간단한작동 만으로 데이터베이스 패스를 볼 수 있다.  파일명을 저장 하시려거든 , *.inc.php 로 하세요.  PHP 파일이 업로드 될시에, phps 확장자로 변경이 되도록 자료실 소스 수정 그러나 상당수의 이러한 스크립이 php 확장자 뒤에 . 을 붙임으로서 피해 갈수가 있었다. 파일 이름 변경 스크립이 자바 스크립으로 짜여 있을 경우 자바스크립을 지움으로서 무력화 시킬수 있었다. 업로드 자체를 금지 파일 이름 변경 7. 쿠키, 세션, Auth 인증쿠키는 해킹위험성이 높으니 세션을 사용.  session_set_save_handler() 를 사용하여 세션을 md5() 로 암호화 하고  저장.   세션 메카니즘은 영구적인 데이타를 저장하는데 유용하지만 현재 구현은 많은 문제를 갖고 있다. 우선 디폴트로 세션은 임시 파일에 정보를 저장한다. 따라서 multi-hosted 시스템에 있다면 많은 공격자에 노출될 수 있으며 비밀이 누설될 수 있다.  이러한 정보를 파일시스템 대신 데이타베이스에 연결시킬 수 있지만 multi-hosted 데이타베이스의 다른 사람들이 동일한 허가권을 갖고 그 데이타베이스에 접근할 수 있다면 문제는 동일하다. 세션을 사용할때 /tmp 폴더에 저장 하지 말고, 반드시 mysql 에 저장.  지금 현 시점에서 가장 좋은 방법으로 꼽히고 있는 것은 쿠키와 세션의 적절한 배합이다.가. 쿠키와 세션을 모두 사용하되, 클라이언트의 고유정보를 활용하고,니. 각각의 중요한 부분을 md5() 나 crypt() 같은 암호화를 이용해 전달하고,다. 비밀번호등 중요한 정보를 파일이나 DB에 저장할때는 암호화 후라. 외부에서 접근하기 어려운 곳에 저장하는 방법이다.8. 보안상 필요한 함수와 제거해야할 함수   md5  : 문자열의 md5 hash 값을 계산한다. crypt  : 문자열을 DES encryption방법으로 변환(encrypt)한다. base64_encode  : base64 방식으로 encode한다. base64_decode  : base64로 encode된 문자열을 decode 한다. session_is_registered  : 해당 변수가 session에 등록되어 있는가 isset  : 변수에 값이 있는가 검사한다. magic_quotes_gpc() : magic quotes gpc의 현재 설정 상태를 얻는다. - 이는 많은 종류의 공격을 제거한다.  system()  : 외부 program을 실행하고 그 결과를 출력한다. exec()  : 외부 program을 실행한다. passthru()  : 외부 프로그램을 실행하고 그 결과를 직접 (지체없이) 출력한다.opendir()  : directory handle을 연다.escapeshellcmd() : escapeshellcmd -- shell의 metacharacter들을 escape한다."backticks" 연산자  : 설정 : disable_functions = phpinfo() 등....9. PHP 설정 : php.ini  open_basedir : php 에 의해 해석될 스크립트 파일 위치 지정, 초기값은 모든 파일을 해석include_path   require(), include() 등의 함수에 의해 사용되는 인클루드 파일의 디렉토리 위치를 지정하는 부분이다. unix 계열의 운영체계는 : (콜론) 을, 윈도우 계열의 운영체계는 ;(세미콜론)으로 복수의 디렉토리 지정 가능하다.   gpc_order  GET/POST/COOKIE 변수의 우선 순위를 지정한다. 초기값은 GPC이다. 예를 들어, GP 로 설정되어 있다면 쿠키값은 무시되고 동일한 이름의 post 변수는 get 변수로 덮어쓰게 된다.   open_basedir   PHP 엔진에 의해 사용될 스크립트 파일의 위치 지정할 수 있다. 이경우 해당 디렉토리 이외의 스크립트 파일들은 해석(실행)되지 않게 된다.  그러나 심볼릭 링크의 사용은 가능하며 초기값은 모든 파일을 실행 가능하도록 되어 있다.   safe_mode On 안전모드로 php를 실행한다.  안전모드로 실행 될 경우 웹서버와 UID가 다른 스크립트는 실행되지 않으며, 디렉토리 퍼미션을 변경하지 않을 경우 파일 업로드 역시 사용할 수 가 없다.   safe_mode_exec_dir =doc_root만일, safe_mode 가 on 으로 설정되면 여기서 지정해준 디렉토리 밖의 모든 파일이 실행이 되지 않는다.   upload_max_filesize  업로드 할 수 있는 최대 파일 크기를 설정하는 부분이다. 대용량의 파일을 업로드하기 위해서는 이 값을 충분히 크게 지정해 주어야 한다.   upload_tmp_dir   파일이 업로드 될 디렉토리로 기본적으로 /tmp 로 정의 되어 있다.   max_execution_time  스크립트 실행 시간을 초단위로 설정한다. 많은 사람에게 메일을 발송하는 스크립트와 같이 시간이 많이 소요되는 스크립트를 사용할 경우 충분히 크게 잡아 주어야 한다.   memory_limit  스크립트 실행시 사용가능한 메모리 크기를 byte 단위로 적어 준다. display_errors=Off php 에서 오류 발생시 디렉토리 경로의 내용을 좌악 보여주면 이 정보를 악용할 소지가 있습니다.   10. PHP는 인터프리터 언어 입니다. 컴파일하지 않기 때문에 소스가 보일 수 가 있습니다.   들여 쓰기를 사용하지 않고, 변수명도 어렵게 하는 것 입니다.  11. html tag 막기   HTML과 자바스크립은 뚫립니다. 쿠키 까지 알아 낼 수 도 있습니다.  콤포넌트를 사용한 방식이 라도 안됩니다.  무조건 태그는 막는것이 좋습니다.  그러나 대부분의 사용자는 모르고 있죠. 그래서 보통 허용하는 것이 일반적 입니다.  그러나 허용을 하더라도 

'Computer > Linux' 카테고리의 다른 글

Apache 설치후 보안(조별발표자료)  (0) 2005.06.10
Sendmail 보안(조별발표자료)  (0) 2005.06.10
Apache 설치시 보안(조별발표자료)  (0) 2005.06.10
Network  (0) 2005.06.10
MySQL  (0) 2005.06.10