2013-05-03 2 views
7

친구가 웹 사이트 용 모듈을 완성하도록 돕고 있습니다. 그의 모듈을 보는 첫인상에서 나는 아주 위험한 것을 발견했지만, 그는이 방법이 안전하다고 말한다. 코드의널 바이트 취약점 검사

부 :

session_start(); 

    if(isset($_POST['foo'])) 
    { 
    $_SESSION['foo'] = $_POST['foo']; 
    } 

    if(isset($_SESSION['foo'])) 
    { 
    $foo['foo'] = $_SESSION['foo']; 
    } 

    if(is_file("inc/". $foo['foo'] . "/bar.php")) { 
    // code 
    } 
    else { 
    // code 
    } 

주 : 파일 (INC/테스트/bar.php)의 존재;

나는 그의 코드를 테스트하고 싶어, 나는 다음과 같은 요청을 보내

POST :: foo는 => 시험/bar.php % 00

POST :: foo는 => 시험/bar.php \ 0

curl_setopt ($ ch, CURLOPT_POSTFIELDS, 'foo = test/bar.php'. chr (0x00));

그러나 이러한 방법 중 어느 것도 작동하지 않았습니다. 그 코드는 정말 안전합니까? 어떻게 보안을 무시하기 위해 null 바이트를 보낼 수 있습니까? 내 친구에게 코드가 안전하지 않다는 것을 보여주고 싶습니다.

내가 짧은에, this 솔루션을 발견했습니다
+0

저는 PHP 전문가가 아니므로 주석으로 남겨 두겠습니다. "../../"와 같이 전달할 수는 없습니다. ./../ "파일 시스템에 임의로 액세스 할 수 있습니까? –

+0

@ChrisThompson 끝에 "/bar.php"가 있으므로 모든 경우에 ../../../bar.php를 확인합니다. – John

+0

괜찮습니다. 잠재적으로 액세스하는 경우 위협이됩니다. _some other_' 바.php' 파일에 접근 할 수 없습니다. –

답변

5

, 당신의 코드 다소 취약 것, 그리고 살균 방법은 이것이다 :

내 독 널 바이트 주입을 방지하는 방법에는 여러 가지가 있습니다

PHP.

$foo['foo']= str_replace(chr(0), '', $foo['foo']); 

나는 또한 전문가의 아니에요 :이 백 슬래시와 NULL 바이트를 탈출 포함하지만, 그렇게 할 수있는 가장 권장되는 방법은 완전히 다음과 유사한 코드를 사용하여 바이트를 제거하는 것입니다 널 바이트 (null-byte) 공격이지만 이것이 합리적입니다. 더욱 자세한 내용 here.

+1

'$ _POST'의 값을 세션에 저장할 때 OP가 널 바이트 문자를 대체해야합니다! 이렇게하면 나중에 $ _SESSION [ 'foo']'를 나중에 다시 안전하지 않게 사용할 수 없게됩니다. – ComFreek

-3

PHP는 Null 바이트에 대해 매우 vurnable입니다. php는 c에서 빌드되기 때문입니다. cn Null 바이트는 문자열의 끝을 의미합니다.

사용하는 모든 문자열에서 Null 바이트를 제거해야합니다. 이것은 include en move_uploaded_file과 같은 IO 기반 함수에서 더욱 중요합니다. 그것은 널 바이트를 처리 할 수있는 1 개

PHP 함수를 int로 캐스팅 때문에

도 (INT) "1 \ 01"vurnable하더라도에

를 나 strlen

않는 str_replace strpos 예컨대 아르 데이터베이스 querys. Mysql은 char, varchar 및 text 열의 Null 바이트로 바꿀 수 있습니다.

+1

PHP 5.3.4 이상에서는 더 이상 true가 아닙니다. (현재의 모든 버전입니다.) – duskwuff

+0

실제로, 속행 자료는 여기 거짓말입니다. MySQL의 경우처럼 PHP의 문자열 처리 함수 ('strlen()'과 같은)는 null 바이트를 포함한 문자열에서 완벽하게 작동합니다. – duskwuff

+0

-1을 가져 주셔서 감사합니다 심지어 PHP 5.4에 포함 함수는 Null 바이트로 헤어질 것이고 SELECT "hello \ 0there"를 실행하면 볼 수 있습니다. –