KWONKYU

PHP 시큐어 코딩 #7

May 15th, 2019
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.01 KB | None | 0 0
  1. #1.소스코드 누출
  2. 여러 웹사이트가 하나의 웹 서버를 공유하는 공유 호스팅 환경에서는 다른 사용자가 소스 코드를 읽을 수 있기 때문에 주의해야 한다. 물론 경로를 알아야 읽을 수 있겠지만 만약 소스코드가 누출되어 데이터베이스 인증 정보가 누출된다면 문제가 될 것이다. 가장 좋은 해결책은 root만 읽을 수 있는 파일에 SetEnv(아파치 설정 지시문)를 이용하여 아파치에 데이터베이스 사용자 이름과 비밀번호에 대한 환경변수를 생성하는 것이다. 이는 $_SERVER['DB_USER'], $_SERVER['DB_PASS'] 처럼 참조할 수 있어 소스 코드가 누출되더라도 데이터베이스 액세스 인증 정보는 누출되지 않는다.
  3.  
  4. #2.세션 데이터 유출
  5. PHP에서는 기본적으로 /tmp에 세션 데이터가 저장되는데 이는 편의성에 목적이 있다. 다른 사용자들은 쉘에서 이를 직접 읽을 수는 없으나 간단한 스크립트 작성을 통해 간접적으로 읽을 수 있다.
  6. <?php
  7. header('Content-Type: text/plain');
  8. session_start();
  9.  
  10. $path = ini_get('session.save_path');
  11. $handle = dir($path);
  12.  
  13. while($filename = $handle->read()){
  14. if(substr($filename, 0, 5) == 'sess_'){
  15. $data = file_get_contents("$path/$filename");
  16.  
  17. if(!empty($data)){
  18. session_decode($data);
  19. $session = $_SESSION;
  20. $_SESSION = array();
  21. echo "Session [".substr($filename, 5)."]\n";
  22. print_r($session);
  23. echo "\n--\n\n";
  24. }
  25. }
  26. }
  27. ?>
  28. 위 스크립트는 'sess_'로 시작하는 파일들을 검색하여 세션 데이터를 해석하여 print_r()로 화면에 출력한다.
  29. 이에 대한 가장 좋은 해결책은 사용자 이름과 비밀번호로 보호되는 데이터베이스에 세션 데이터를 보관하는 것인데 당연히 이는 데이터베이스의 보안에 더 비중이 주어져야 할 것이다. 또한 session_set_save_handler() 함수를 이용하여 PHP 고유의 세션 처리 방식 변경이 필요할 것이다.(세션 데이터 저장소 열기, 닫기, 세션 데이터 읽기, 쓰기, 파괴, 오래된 세션 정리 등 6개의 기능을 각각 함수로 구현하여 적용)
  30.  
  31. #3.세션 삽입
  32. 이는 웹 서버가 세션 데이터 저장소에 대한 읽기 뿐 아니라 쓰기 권한도 있다는 사실을 이용, 스크립트에서 다른 사용자의 세션을 추가, 수정, 삭제할 수 있다는 문제이다. 이는 세션 데이터 수정을 통해 액세스 제한이나 보호 수단들을 무력화 할 수 있기 때문에 하이재킹보다 더 강력한 공격이며 마찬가지로 데이터베이스에 세션 데이터를 저장함으로써 예방할 수 있다.
  33.  
  34. #4.파일 시스템 브라우징
  35. 공유 호스팅에서는 이전에 얘기했던 웹서버 밖에 인클루드를 둠으로써 회피하는 방법이 통하지 않는다. 다른 사용자가 /etc/passwd나 홈 디렉토리를 긁어서 사용자의 이름을 파악하고 웹서버 아래에 있는 소스 코드를 읽어서 DB인증 정보가 담긴 인클루드 구문을 발견했다고 할 때, 기껏해야 '../inc/db.inc' 같은 경우로 저장되는데 이는 어쨌든 전체 시스템 내부에 존재하기 때문에 웹 서버 바깥에 인클루드를 저장하는 것은 충분한 보호를 제공하지 못한다. 그렇기 때문에 공유 서버에 저장된 모든 데이터는 공개된 것으로 생각하고 데이터베이스에 저장하는 것이 좋다.
  36.  
  37. #5.안전 모드
  38. PHP의 safe_mode 지시문은 읽어들인 파일이 실행되는 스크립트의 소유자와 동일한지 비교하는 검사를 추가로 수행하는데 이는 Bash등 다른 언어로 쓰인 언어에는 적용되지 않기 때문에 심층 방어 전략으로는 권장될지라도 다른 보호수단을 대체할 수는 없다. 또한 이는 웹 서버가 작성한 파일에 대해서는 액세스에 영향을 주지 않기 때문에 스크립트가 작성한 스크립트(소유자는 웹 서버가 될 것이다)로 보호 수단을 우회하는 경우도 발생한다.
Advertisement
Add Comment
Please, Sign In to add comment