2010-01-29 5 views

답변

3

예. 처음에는 과 같은 일종의 유효성 검사없이 GET 변수를 직접 사용하지 않아야합니다.

또한 포함 할 경로의 임의 지정을 허용해서는 안됩니다.

대신 동적으로 많이 필요하거나 직접 참조해야하는 토큰을 전달해야하는 경우 특정 경로 내의 포함 경로에 포함을 제한하고 (지정된 경로가 해당 디렉토리의 파일을 참조하는지 확인해야합니다.) (그리고 연관된 토큰이 참조하는 파일을보기 위해 연관 배열을 검색하는 것과 같은 일을한다).

$allowed_pages = array(
    "page1" => "pages/page1.php", 
    "page2" => "pages/page2.php", 
    "foobar" => "pages/page7.php", 
    "stuff" => "pages/blarg.php" 
); 

$page = $_GET['page']; 
if(array_key_exists($allowed_pages, $page)) { 
    include($allowed_pages[$page]); 
} 

(.이 경우, 지정된 키가 포함될 수 있습니다 무엇에 모두 검증 및 제한 등의 행위를 허용하고 있다는 사실)

:

후자의 예는 다음과 같이 될 것이다

+1

http://ha.ckers.org/blog/20100128/micro-php-lfi-backdoor/ 이러한 종류의 것들을 악용하는 방법에 대한 더 많은 예제가 있습니다. 주석에는 많은 것들이 있습니다. – Arkh

1

$_GET["page"]은 예외적 인 경로가 될 수 있으므로 위험합니다. 예를 들어 ../../settings.php 다른 것일 수 있습니다.

$allowedPages = array('news', 'contact', ...); 
if (in_array($_GET["page"], $allowedPages)) { 
    include "pages/".$_GET["page"].".php"; 
} else { 
    throw new Exception('Page is not valid !'); 
} 

좋은 일이 또한 파일이 존재하는지 확인하는 것입니다 :

이 같은 수행해야합니다.

1

당신은 본질적으로 시스템에 존재하는 모든 PHP를 실행할 수있는 능력을 부여합니다. 그것은 꽤 큰 미지의 것입니다.

현재 위험 할 수있는 코드가 없더라도 미래에는 위험 할 수 있으므로 위험합니다.

는 는
+3

PHP에서 include가 PHP 코드를 포함 할 필요가 없으므로 파일을 읽을 수 있습니다. 이 없으면 php는 파일 내용을 그냥 덤프합니다. – SoapBox

+0

물론 주목해야합니다! – cgp

1

뿐만 아니라 화이트리스트를 가진 것은,이

$include = $_GET['page']; 

if (! preg_match('/^[a-z-_]+$/i', $include)) { 
    throw new Exception('Access denied'); 
} 
1

같은 뭔가를 할 수는 "[페이지"] 페이지 GET /".$_ "를 포함 PHP를".. ";

당신이 접두사를 하드 코딩 한 사실이 같은 공격을 방지 :

페이지 = HTTP % 3A % 2F % 2Fwww.blackhat.com % 2Fbad.code % 3F

그러나 $ _GET [ 'page']에 '..'이 포함될 수 있기 때문에 누군가가 파일을 귀하의 시스템에서 PHP 확장자로 강제로 포함시킬 수 있습니다. 이 방법으로 보안 침해가 발생하지 않는다고 확신하십니까?

다른 사용자가 제안한 것처럼 허용 목록을 사용하는 것이 훨씬 안전하며 원격 포함 취약점을 피하기 위해 접두사를 앞에 붙이지 않아도됩니다.

c