2016-09-30 4 views
2

나는 이 PHP 코드에는 어디에 취약점이 있습니까?

<?php 
    include("./config.php"); 

    $foo = $_GET['______foo_adm1nkyj______']; 
    $check = urldecode($_SERVER['QUERY_STRING']); 

    if(preg_match("/_| /i", $check)) 
    { 
     die("no hack ~_~"); 
    } 
    if($foo == "adm1nkyj") 
    { 
     echo $flag; 
    } 

    echo "<br/>"; 
    highlight_file(__FILE__); 
    ?> 

나는 $flag를 얻기 위해 무엇을해야 codeshell.kr

의 문제를 해결하는거야? 그리고 그 코드의 취약점은 무엇입니까? $_GET에 있습니까? 또는 preg_match()? Google에서 검색하는 동안 찾을 수 없습니다.

+1

문제는 'preg_match()'가 URL에서'_ ______ foo_ad1nkyj ____ = someValue' 행을 확인하고'die()'메소드를 실행한다는 것입니다. alt 코드는?이 질문에 대한 사이트가 정확히 아닙니다, 프로그래밍 가능한 질문이 아니므로 하향 투표합니다. – KDOT

답변

4

해결책은 이것이다 :

그냥이 URL을 호출

PHP는 요청 데이터 배열 ( $_GET의 키에 밑줄 점과 공백을 대체하기 때문에 작동
http://123.111.158.161/codeshell/prob2/?......foo.adm1nkyj......=adm1nkyj 

, $_POST , $_REQUEST, $_COOKIE). PHP docs에서

:

참고 : 점 및 변수 이름에 공백은 밑줄로 변환됩니다. 예를 들어 <input name="a.b" />$_REQUEST["a_b"]이됩니다.

이것은 아마도 등록 글로벌이 여전히 중요한 경우의 유물 일 것입니다.

+1

고맙습니다 !!! 천재 여야합니다 !! –

2

PHP는 한 가지 사실을 알고있을 때 실제로 매우 간단합니다. php는 GET 변수 이름의 밑줄로 대체합니다.

스크립트는 GET 변수에 밑줄이 있는지 검사하고 그럴 경우 죽습니다. 따라서 GET 변수 값을 검사하는 지점에 도달 할 수 없습니다. 그러나 밑줄을 점으로 바꾸면 끝이납니다.

123.111.158.161/codeshell/prob2/?......foo.adm1nkyj......=adm1nkyj 
관련 문제