웹해킹

php파일 분석

jiwonniii 2026. 2. 23. 15:27

웹해킹 문제를 풀다보면 php파일이 많이 나오는데 먼말인지 하나도 모르겟어서 한번 써봄

<html>
    <head></head>
    <link rel="stylesheet" href="/static/bulma.min.css" />
    <body>
        <div class="container card">
        <div class="card-content">
        <h1 class="title">Online Curl Request</h1>
    <?php
        if(isset($_GET['url'])){
            $url = $_GET['url'];
            if(strpos($url, 'http') !== 0 ){
                die('http only !');
            }else{
                $result = shell_exec('curl '. escapeshellcmd($_GET['url']));
                $cache_file = './cache/'.md5($url);
                file_put_contents($cache_file, $result);
                echo "<p>cache file: <a href='{$cache_file}'>{$cache_file}</a></p>";
                echo '<pre>'. htmlentities($result) .'</pre>';
                return;
            }
        }else{
        ?>
            <form>
                <div class="field">
                    <label class="label">URL</label>
                    <input class="input" type="text" placeholder="url" name="url" required>
                </div>
                <div class="control">
                    <input class="button is-success" type="submit" value="submit">
                </div>
            </form>
        <?php
        }
    ?>
        </div>
        </div>
    </body>
</html>

코드는 이거고요 

commandinjection advanced문제임

  • isset(): 변수가 존재하지만 null값이라면 true반환
  • $url = $_GET['url'];: URL 값을 $url 변수에 저장. $는 변수를 나타낸다
  • strpos(): 이 함수는 문자열에서 문자의 위치를 찾거나, 포함하는지 확인할 때 사용 여기서는 http로 시작하는지 검사함
  • shell_exec():  PHP에서 서버의 쉘(터미널) 명령어를 실행하는 함수=>서버에서 실제로 함수가 작동하기 때문에 위험하다
  • escapeshellcmd:  쉘 명령어 문자열에서 위험한 특수문자들을 이스케이프해서 명령어 인젝션 위험을 줄이는 역할 앞에다가 /를 붙임
  • echo: 파이썬의 print와 매우 유사하다

 

PHP 코드 전체 흐름 요약

  1. $_GET['url'] 파라미터가 있는지 확인한다.
  2. 있으면 $url에 저장하고, 문자열이 http로 시작하는지 검사한다.
  3. http로 시작하지 않으면 die('http only !')로 즉시 종료한다.
  4. 정상 URL이면 shell_exec('curl ...')로 요청 결과를 받아 $result에 저장한다.
  5. URL을 md5로 해시해 캐시 파일 경로 $cache_file을 만든다.
  6. file_put_contents($cache_file, $result)로 결과를 파일에 저장한다.
  7. 캐시 파일 링크와 결과 내용을 화면에 출력하고 return으로 종료한다.
  8. url 파라미터가 없으면 입력 폼을 화면에 보여준다.

md5로 해시하는 이유는 URL을 안전하고 일정한 길이의 파일명으로 바꾸기 위해서