: level 24 → level 25

http://natas25.natas.labs.overthewire.org

natas25 화면이다. 어떤 글귀와 language 선택 박스가 있다. 바로 소스코드를 확인해보자.

<html>
<head>
<!-- This stuff in the header has nothing to do with the level -->
<link rel="stylesheet" type="text/css" href="http://natas.labs.overthewire.org/css/level.css">
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/jquery-ui.css" />
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/wechall.css" />
<script src="http://natas.labs.overthewire.org/js/jquery-1.9.1.js"></script>
<script src="http://natas.labs.overthewire.org/js/jquery-ui.js"></script>
<script src="http://natas.labs.overthewire.org/js/wechall-data.js"></script><script src="http://natas.labs.overthewire.org/js/wechall.js"></script>
<script>var wechallinfo = { "level": "natas25", "pass": "<censored>" };</script></head>
<body>
<?php
    // cheers and <3 to malvina
    // - morla

    function setLanguage(){
        /* language setup */
        if(array_key_exists("lang",$_REQUEST))
            if(safeinclude("language/" . $_REQUEST["lang"] ))
                return 1;
        safeinclude("language/en"); 
    }
    
    function safeinclude($filename){
        // check for directory traversal
        if(strstr($filename,"../")){
            logRequest("Directory traversal attempt! fixing request.");
            $filename=str_replace("../","",$filename);
        }
        // dont let ppl steal our passwords
        if(strstr($filename,"natas_webpass")){
            logRequest("Illegal file access detected! Aborting!");
            exit(-1);
        }
        // add more checks...

        if (file_exists($filename)) { 
            include($filename);
            return 1;
        }
        return 0;
    }
    
    function listFiles($path){
        $listoffiles=array();
        if ($handle = opendir($path))
            while (false !== ($file = readdir($handle)))
                if ($file != "." && $file != "..")
                    $listoffiles[]=$file;
        
        closedir($handle);
        return $listoffiles;
    } 
    
    function logRequest($message){
        $log="[". date("d.m.Y H::i:s",time()) ."]";
        $log=$log . " " . $_SERVER['HTTP_USER_AGENT'];
        $log=$log . " \"" . $message ."\"\n"; 
        $fd=fopen("/var/www/natas/natas25/logs/natas25_" . session_id() .".log","a");
        fwrite($fd,$log);
        fclose($fd);
    }
?>

<h1>natas25</h1>
<div id="content">
<div align="right">
<form>
<select name='lang' onchange='this.form.submit()'>
<option>language</option>
<?php foreach(listFiles("language/") as $f) echo "<option>$f</option>"; ?>
</select>
</form>
</div>

<?php  
    session_start();
    setLanguage();
    
    echo "<h2>$__GREETING</h2>";
    echo "<p align=\"justify\">$__MSG";
    echo "<div align=\"right\"><h6>$__FOOTER</h6><div>";
?>
<p>
<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>

이번엔 소스코드가 좀 있는 편인데 필요한 부분을 천천히 훑어봤다.

먼저 아래쪽에서 호출되는 setLanguage 함수를 살펴봤다.

lang 파라미터를 safeinclude함수의 인자로 전달하고 있다. safeinclude 함수를 살펴보자.

 

해당 함수의 매개변수를 보니 lang의 값이 filename으로 사용되는 것 같다.

그리고 filename에 ../와 natas_webpass를 필터링하는 것을 확인할 수 있다.

하지만 ../같은 경우 ....// 와 같이 필터링을 우회할 수 있다. 필터링 이후에 filename이 존재한다면 해당 파일을 include한다.

 

만약 ../와 natas_webpass가 lang에 포함되는 경우 logRequest 함수가 실행된다. logRequest 함수를 살펴보자.

해당 함수는 $log에 날짜와 user agent 정보, $message를 담아서 /var/www/natas/natas25/logs/natas25_" . session_id() .".log에 출력한다.

 

 

 

 

 

natas_webpass/natas26에 있는 데이터를 불러와야 하는데 natas_webpass를 필터링하고 있으니 해당 path를 lang에 직접적으로 입력할 수 없다. 대신 burp suite를 이용해서 user agent를 변조하여 file 내용을 불러올 수 있다.

이때 파일의 내용은 /var/www/natas/natas25/logs/natas25_" . session_id() .".log에 출력되므로 해당 파일을 include시켜야 한다.

따라서 lang에 /var/www/natas/natas25/logs/natas25_" . session_id() .".log를 전달해서 include하고, user agent를 burp suite로 변조해서 natas_webpass/natas26의 데이터를 불러온다.

 

 

 

....//    =>    ../의 위치가 /var/www/natas/natas25인 것을 알아냈다.

 

 

 

log파일의 path를 붙여서 전달하고, burp suite로 패킷을 가로챘다.

중간에 User-Agent 부분을 php코드로 작성한 후 보내주면,

 

 

 

natas25 페이지에 다음 레벨의 password가 출력된다.

 

natas26 password: oGgWAJ7zcGT28vYazGo4rkhOPDhBu34T

 

 

 

 

'Study > Web Hacking' 카테고리의 다른 글

[natas] Level 25 -> Level 26  (0) 2021.08.22
[LOS] zombie assassin  (0) 2021.08.19
[LOS] succubus  (0) 2021.08.09
[LOS] assassin  (0) 2021.08.02
[natas] Level 23 -> Level 24  (0) 2021.08.02
복사했습니다!