동적 포함은 디렉터리 이름이나 파일 이름의 일부가 변수에 저장되는 여러 상황에서 사용됩니다. 예를 들어, 일부 동적 페이지를 캐시하여 데이터베이스 서버의 로드를 줄일 수 있습니다.
아아앙
이 취약점을 더욱 명확하게 하기 위해 예제에서는 $_GET가 사용되었습니다. 이 취약점은 오염된 데이터를 사용하는 경우에도 존재합니다. $_GET['username']을 사용하는 것은 문제를 더 명확하게 볼 수 있는 극단적인 예입니다.
위의 흐름에는 장점이 있지만 공격자에게 페이지 캐시를 자유롭게 선택할 수 있는 기회도 제공합니다. 예를 들어, 사용자는 URL의 사용자 이름 값을 편집하여 다른 사용자의 캐시 파일을 쉽게 볼 수 있습니다. 실제로 공격자는 단순히 사용자 이름 값을 해당 파일 이름(확장자 제외)으로 변경하여 /cache 디렉터리에서 .html 확장자를 가진 모든 파일을 볼 수 있습니다.
http://www.php.cn/
프로그램은 공격자가 조작할 수 있는 디렉터리와 파일 이름을 제한하지만 파일 이름을 변경하는 것만이 가능한 유일한 방법은 아닙니다. 공격자는 파일 시스템을 통해 창의적으로 접근하고 다른 디렉터리에 있는 .html 파일을 보고 중요한 정보를 발견할 수 있습니다. 이는 문자열의 상위 디렉토리를 사용하여 디렉토리 확장을 수행할 수 있기 때문입니다.
http://www.php.cn/
위 URL의 실행 결과는 다음과 같습니다.
아아앙
이때 ,...는 루트 디렉터리인 /cache의 상위 디렉터리를 의미합니다. 따라서 위의 예는 다음과 같습니다.
<?php include "/cache/{$_GET['username']}.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['filename'] is filtered and stored in $clean['filename']. */ include "/path/to/{$clean['filename']}"; ?>
위의 프로그램 처리 결과 ($filename)을 사용하여 /path/to 디렉토리에 있는지 확인할 수 있습니다:
<?php $clean = array(); if (basename($_GET['filename'] == $_GET['filename']) { $clean['filename'] = $_GET['filename']; } include "/path/to/{$clean['filename']}"; ?>
탐지에 실패하면 나중에 조사할 수 있도록 공격 로그에 요청을 기록해야 합니다. 다른 보안 조치가 실패하는 이유를 확인하려고 하므로 이 프로세스를 심층 방어 수단으로 사용할 때 특히 중요합니다.
위는 PHP 보안 파일명 조작 내용입니다. 자세한 내용은 PHP 중국어 홈페이지(www. php.cn)!