>  기사  >  백엔드 개발  >  PHP 보안 - 파일 이름 조작

PHP 보안 - 파일 이름 조작

黄舟
黄舟원래의
2017-02-21 09:17:371159검색



파일명 조작

동적 포함은 디렉터리 이름이나 파일 이름의 일부가 변수에 저장되는 여러 상황에서 사용됩니다. 예를 들어, 일부 동적 페이지를 캐시하여 데이터베이스 서버의 로드를 줄일 수 있습니다.

아아앙


이 취약점을 더욱 명확하게 하기 위해 예제에서는 $_GET가 사용되었습니다. 이 취약점은 오염된 데이터를 사용하는 경우에도 존재합니다. $_GET['username']을 사용하는 것은 문제를 더 명확하게 볼 수 있는 극단적인 예입니다.

위의 흐름에는 장점이 있지만 공격자에게 페이지 캐시를 자유롭게 선택할 수 있는 기회도 제공합니다. 예를 들어, 사용자는 URL의 사용자 이름 값을 편집하여 다른 사용자의 캐시 파일을 쉽게 볼 수 있습니다. 실제로 공격자는 단순히 사용자 이름 값을 해당 파일 이름(확장자 제외)으로 변경하여 /cache 디렉터리에서 .html 확장자를 가진 모든 파일을 볼 수 있습니다.

http://www.php.cn/

프로그램은 공격자가 조작할 수 있는 디렉터리와 파일 이름을 제한하지만 파일 이름을 변경하는 것만이 가능한 유일한 방법은 아닙니다. 공격자는 파일 시스템을 통해 창의적으로 접근하고 다른 디렉터리에 있는 .html 파일을 보고 중요한 정보를 발견할 수 있습니다. 이는 문자열의 상위 디렉토리를 사용하여 디렉토리 확장을 수행할 수 있기 때문입니다.

http://www.php.cn/

위 URL의 실행 결과는 다음과 같습니다.

아아앙


이때 ,...는 루트 디렉터리인 /cache의 상위 디렉터리를 의미합니다. 따라서 위의 예는 다음과 같습니다.

 <?php
 
  include "/cache/{$_GET[&#39;username&#39;]}.html";
 
  ?>


모든 파일은 파일 시스템의 루트 디렉터리에 있으므로 이 프로세스를 통해 공격자는 서버의 모든 .html 파일에 액세스할 수 있습니다.

일부 플랫폼에서는 공격자가 NULL을 사용하여 문자열을 종료할 수도 있습니다. 예:

http://www.php.cn/

이는 .html 파일 확장자 제한을 성공적으로 우회합니다.

물론, 공격자의 악의적인 공격 방법을 모두 무작정 추측하는 것은 불가능합니다. 파일에 아무리 많은 컨트롤을 추가하더라도 위험을 제거할 수는 없습니다. 동적으로 포함할 때 오염된 데이터를 사용하지 않는 것이 중요합니다. 공격 수단은 고정되어 있지 않지만 취약점은 변하지 않습니다. 이 취약점은 간단히 데이터를 필터링하여 해결할 수 있습니다(1장 참조):

 <?php
 
  include "/cache/../admin/users.html";
 
  ?>


매개변수에 파일 이름 부분만 있고 경로 정보가 없는 것을 확인한 경우 또 다른 효과적인 트릭은 basename( ) 데이터 필터링:

<?php
 
  include "/admin/users.html";
 
  ?>


경로 정보를 허용하지만 감지하기 전에 단순화하려는 경우 realpath() 함수를 사용할 수 있습니다:

  <?php
 
  $clean = array();
 
  /* $_GET[&#39;filename&#39;] is filtered and stored in
$clean[&#39;filename&#39;]. */
 
  include "/path/to/{$clean[&#39;filename&#39;]}";
 
  ?>


위의 프로그램 처리 결과 ($filename)을 사용하여 /path/to 디렉토리에 있는지 확인할 수 있습니다:

<?php
 
  $clean = array();
 
  if (basename($_GET[&#39;filename&#39;] ==
$_GET[&#39;filename&#39;])
  {
    $clean[&#39;filename&#39;] = $_GET[&#39;filename&#39;];
  }
 
  include "/path/to/{$clean[&#39;filename&#39;]}";
 
  ?>

탐지에 실패하면 나중에 조사할 수 있도록 공격 로그에 요청을 기록해야 합니다. 다른 보안 조치가 실패하는 이유를 확인하려고 하므로 이 프로세스를 심층 방어 수단으로 사용할 때 특히 중요합니다.

위는 PHP 보안 파일명 조작 내용입니다. 자세한 내용은 PHP 중국어 홈페이지(www. php.cn)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:PHP 보안 코드 삽입다음 기사:PHP 보안 코드 삽입