파일을 어떻게 사용하든 파일 이름을 어딘가에 지정해야 합니다. 대부분의 경우 파일 이름은 fopen() 함수의 매개 변수로 사용되며 다른 함수에서는 이 함수가 반환하는 핸들을 호출합니다.
<?php $handle = fopen('/path/to/myfile.txt', 'r'); ?>
파일 이름의 일부로 오염된 데이터를 포함할 때 취약점이 발생합니다:
아아아앙
이 경우 경로와 파일 이름의 앞뒤 부분은 공격자가 조작할 수 없으므로 공격 가능성이 제한됩니다. 그러나 일부 공격은 NULL(URL에서 %00으로 표시됨)을 사용하여 문자열을 종료하므로 파일 확장자 제한을 우회한다는 점에 유의하십시오. 이 경우 가장 위험한 공격 방법은 다중 ../을 사용하여 상위 디렉터리에 액세스하여 파일 시스템 확장을 달성하는 것입니다. 예를 들어, filename 값이
http://www.php.cn/ .. . 없음/경로/대상/파일
많은 공격의 경우와 마찬가지로, 문자열을 구성할 때 오염된 데이터를 사용하면 공격자가 문자열을 변경할 수 있는 기회를 얻게 되어 응용 프로그램이 의도하지 않은 방식으로 작동하게 됩니다. 필터링된 데이터만 사용하여 동적 문자열을 생성하는 습관을 들이면 익숙하지 않은 많은 취약점을 포함하여 다양한 유형의 취약점을 예방할 수 있습니다.
fopen()에 의해 호출되는 파일 이름의 주요 정적 부분이 /path/to이므로 위의 공격에는 필요한 것보다 더 많은 상향 디렉토리 교차가 포함됩니다. 공격자는 공격을 시작하기 전에 소스 코드를 볼 수 없기 때문에 일반적인 전략은 ../ 문자열을 너무 많이 반복하는 것입니다. ../ 문자열을 너무 많이 사용해도 위의 공격 효과가 파괴되지 않으므로 공격자가 디렉터리의 깊이를 추측할 필요가 없습니다.
위 공격에서는 fopen() 호출이 원하지 않는 방식으로 동작하도록 만들어졌습니다.
<?php $handle = fopen("/path/to/{$_GET['filename']}.txt", 'r'); ?>
문제를 인지하거나 공격을 경험한 후 많은 개발자는 잠재적으로 악의적인 데이터를 수정하려고 시도하는 실수를 저지르는데, 때로는 데이터를 먼저 확인하지 않는 경우도 있습니다. 1장에서 언급했듯이 가장 좋은 접근 방식은 필터링을 확인 프로세스로 생각하고 사용자가 설정한 규칙을 따르도록 하는 것입니다. 예를 들어, 합법적인 파일 이름에 문자만 포함된 경우 다음 코드는 이 제한을 적용합니다.
<?php $handle = fopen('/another/path/to/file.txt', 'r'); ?>
이 데이터는 PHP 함수에서만 사용되며 원격 시스템으로 전송되지 않으므로 파일 이름 값을 이스케이프할 필요가 없습니다.
basename() 함수는 불필요한 경로가 있는지 확인할 때 매우 유용합니다.
<?php $clean = array(); if (ctype_alpha($_GET['filename'])) { $clean['filename'] = $_GET['filename']; } else { /* ... */ } $handle = fopen("/path/to/{$clean['filename']}.txt", 'r'); ?>
이 프로세스는 파일 이름에 문자만 허용하는 것보다 덜 안전하지만 그다지 엄격하지는 않습니다. 더 나은 심층 예방 프로세스는 위의 두 가지 방법을 결합하는 것입니다. 특히 ctype_alpha( 함수를 사용하는 대신 정규식을 사용하여 코드의 적법성을 확인하는 경우)는 더욱 그렇습니다. )).
파일 이름 전체가 필터링되지 않은 데이터로 구성된 경우 심각도가 높은 취약점이 발생합니다:
<?php $clean = array(); if (basename($_GET['filename']) == $_GET['filename']) { $clean['filename'] = $_GET['filename']; } else { /* ... */ } $handle = fopen("/path/to/{$clean['filename']}.txt", 'r'); ?>
공격자에게 더 많은 유연성을 제공한다는 것은 더 많은 취약점을 의미합니다. 이 예에서 파일 확장자는 $_GET['filename']의 일부이기 때문에 공격자는 경로 및 파일 확장자에 관계없이 파일 시스템의 모든 파일을 가리키도록 filename 매개 변수를 조작할 수 있습니다. 웹 서버가 파일을 읽을 수 있는 권한을 갖게 되면 공격자가 지정한 파일로 처리가 이루어집니다.
경로의 선두 부분이 오염된 데이터를 사용한다면 이런 취약점은 더욱 커질 것입니다. 이는 다음 섹션의 주제이기도 합니다.
위 내용은 PHP 보안 파일 시스템 스패닝 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!