CTF/웹

DIMICTF 2019 : exec me

parktest0325 2019. 12. 11. 21:28
<?php  
    if(isset($_GET['source'])){ 
        highlight_file(__FILE__); 
        exit; 
    } 

    $filter = ['system', 'exec', '`', '_', '\'', '"', 'file', 'open', 'read', 'eval', 'pass', 'include', 'require', '=', 'glob', 'dir', '/']; 
    $exec = $_GET['exec'];
 
    for($i = 0; $i < count($filter); $i++){ 
        if(stristr($exec, $filter[$i])){ 
            die("Filtered"); 
        } 
    } 

    eval($exec); 

?> 

<a href="?source"> View Source </a> 

 

소스코드를 살펴보면 filter라는 변수에 값을 넣고 이 값들이 포함되어있다면 Filtered라는 메시지를 출력하고 포함되지 않으면 eval을 통해 exec파라미터로 받은 값(문자열)을 php 코드로 인식하여 실행시켜준다는 의미이다.

 

ls 명령을 입력하려면 eval(system("ls");); 이런 형태가 되어야 할 것이다. 

 

URL?exec=$filter[0](chr(108).chr(115));

이렇게 입력하게되면 'system'("l"."s"); 와 똑같이 인식하게 되는데

php에서는 "system"("ls"); 이렇게 함수명이 문자열이여도 실행되는 특징을 가지고있다. 

또한 "abc"."def" 처럼 .으로 문자열을 연결시킬 수 있기 때문에 위와 같이 입력한다면 ls 명령어를 실행시킬 수 있다.

 

물론 $filter에서 system을 꺼내왔던것처럼 ls도 $filter[6][2].$filter[0][0] 으로 꺼내올 수 있다.

 

현재 디렉터리를 확인하게 되면 플래그파일이 현재 디렉터리에 index.php 파일과 함께 있는것을 볼 수 있는데 

소스코드에서 실행한 ls 명령은 system함수가 실행되는 위치인 소스코드의 현재디렉터리를 확인하게 된다.

-> index.php는 ViewSource로 확인하고 있는 exec 파라미터를 입력받는 파일이다.

 

system 함수를 이용해 cat * 등을 통해 flag를 읽어올 수 있으며 플래그가 웹루트 상위에 있기 때문에 

직접 접근을 통해 읽어올 수도 있다. 

 

1.

 

2.