[DreamHack] [web] [LEVEL 1] simple-phparse 풀이

2024. 11. 17. 13:43Information Security 정보보안/DreamHack

728x90

배울내용 

dreamhack,

web hacking,

개발자도구,

dreamhack 풀이,

dreamhack simple-phparse 문제,

dreamhack web 풀이 ,

Postman

 

 

문제

 

 

 

문제는 위와같이 나와있고 아래에는 문제를 열었을때 가장 먼저 보여지는 화면이다. host , path, query 가 나와있고 cannot access flag.php 로 나와있는걸 볼수있다 

 

우선 코드를 확인해보자

 

    <!-- php code -->
    <?php
     $url = $_SERVER['REQUEST_URI'];
     $host = parse_url($url,PHP_URL_HOST);
     $path = parse_url($url,PHP_URL_PATH);
     $query = parse_url($url,PHP_URL_QUERY);
     echo "<div><h1> host: $host <br> path: $path <br> query: $query<br></h1></div>";

     if(preg_match("/flag.php/i", $path)){
        echo "<div><h1>NO....</h1></div>";
     }
     else echo "<div><h1>Cannot access flag.php: $path </h1></div> ";
    ?>

 

이중에서 host , path, query 전부다 url 에서 나오는걸 볼수있고 아래의 조건문을  preg_match("/flag.php/i", $path)은 대소문자를 무시하며 /flag.php 문자열이 $path에 포함되어 있는지 확인합니다. 따라서 $path에 "flag.php"가 포함되면 "NO...."라는 메시지가 출력된다고한다.

if(preg_match("/flag.php/i", $path)){
    echo "<div><h1>NO....</h1></div>";
}

 

그래서 URL 에 있는걸 parsing 하는과정중에 대소문자에 구분없이 flag.php 를 보내는 법을 알아야하는데 아래처럼 우선 값이 제대로 들어가는지 확인해준다 

 

 

처음에는 제대로 안들어갔지만 가운데 스페이스(%20) 을 넣으니 값이 제대로 들어가는걸 볼수있었다 

그러면 flag.php 를 검사를 못하게 url 인코딩을이용하면 된다

 

 

 

 

 

URL 인코딩 활용
PHP의 parse_url 함수는 URL을 파싱할 때 URL 인코딩된 문자열을 해석하는데 이 점을 이용하여 우회할 수 있다. 

예를들어서 flag 에 소문자 "L" 대신에 써서 f l(%6c) ag 이렇게, 또는 다른 문자열을 바꿔보면 된다 

예: 
/fl%61g.php
/f%6cag.php

 

 

 

 

 

 

그리고 아까처럼 URL 에다가 집어넣어주면 아래와 같이 성공플레그를 뛰울수있게된다. 

 

728x90