Dreamhack/Dreamhack Wargame (Challenge)

[96] IT 비전공자 [dreamhack]simple-phparse문제 풀기

imaginefuture-1 2024. 12. 14. 10:09

simple하게 풀어봅시다

 

 

에에 홈페이지다

 

소스코다

<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
    <title>PHParse</title>
</head>
<body>


    <!-- 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> ";
    ?> 

<style type="text/css">
        body {
            margin: 1em;
        }
        div {
            margin: 0 5px 0 0;
            padding: 0.1em;
            border: 2px solid silver;
            border-radius: 7px;
        }

</style>
</body>
</html>

 

 

이 PHP와 HTML 코드의 구조를 분석해 보겠습니다.


1. 코드의 목적

  • 사용자가 요청한 URL을 분석하여 호스트(host), 경로(path), **쿼리(query)**를 추출하고 화면에 출력합니다.
  • 만약 경로(path)가 특정 문자열(flag.php)과 일치한다면, 특정 메시지를 출력하는 조건을 포함합니다.
  • HTML과 간단한 CSS 스타일링으로 출력 형식을 정리했습니다.

2. 주요 구성 요소 분석

HTML 및 CSS

  • Bootstrap CSS를 사용하여 기본적인 스타일링을 추가합니다.
<style type="text/css">
    body {
        margin: 1em;
    }
    div {
        margin: 0 5px 0 0;
        padding: 0.1em;
        border: 2px solid silver;
        border-radius: 7px;
    }
</style>
  • CSS:
    • body와 div 태그에 기본적인 스타일을 적용.
    • div에 테두리와 패딩, 둥근 모서리 적용.

PHP 코드 분석

$url = $_SERVER['REQUEST_URI'];
  • 현재 페이지에 대한 URL 경로를 가져옵니다(예: /example/path?name=value).
$host = parse_url($url, PHP_URL_HOST);
$path = parse_url($url, PHP_URL_PATH);
$query = parse_url($url, PHP_URL_QUERY);
  • parse_url 함수로 URL을 분석:
    • PHP_URL_HOST: 호스트명 추출(예: example.com).
    • PHP_URL_PATH: URL 경로 추출(예: /path/to/file).
    • PHP_URL_QUERY: URL 쿼리 추출(예: key=value).
echo "<div><h1> host: $host <br> path: $path <br> query: $query<br></h1></div>";
  • 추출한 데이터를 HTML로 출력.

조건문

if (preg_match("/flag.php/i", $path)) {
    echo "<div><h1>NO....</h1></div>";
} else {
    echo "<div><h1>Cannot access flag.php: $path </h1></div>";
}
  • preg_match 함수:
    • "/flag.php/i": flag.php 문자열을 대소문자 구분 없이 검사.
    • preg_match가 true를 반환하면 "NO...." 메시지를 출력.
    • 그렇지 않으면 "Cannot access flag.php" 메시지 출력.

3. 실행 흐름 요약

  1. 클라이언트가 페이지를 요청.
  2. PHP는 $_SERVER['REQUEST_URI']로 URL 경로를 가져와 분석.
  3. URL에서 호스트, 경로, 쿼리를 추출하여 HTML로 표시.
  4. URL 경로에 flag.php가 포함되었는지 조건문으로 검사.
    • 포함되었다면: NO.... 출력.
    • 포함되지 않았다면: "Cannot access flag.php" 출력.

4. 예상 동작

입력: http://example.com/flag.php?user=test

  • 호스트(host): 없음 (parse_url은 상대 경로에서 호스트를 반환하지 않음).
  • 경로(path): /flag.php.
  • 쿼리(query): user=test.
  • 출력:
    <div><h1> host: <br> path: /flag.php <br> query: user=test<br></h1></div>
    <div><h1>NO....</h1></div>
    

입력: http://example.com/home.php

  • 경로(path): /home.php.
  • 출력:
    <div><h1> host: <br> path: /home.php <br> query: <br></h1></div>
    <div><h1>Cannot access flag.php: /home.php </h1></div>
    

5. 잠재적인 문제

  1. PHP_URL_HOST와 상대 경로:
    • 상대 URL(REQUEST_URI에 호스트 미포함)이 제공되면 $host는 항상 빈값을 반환.
    • 이를 해결하려면 _SERVER['HTTP_HOST']를 사용하여 호스트를 보완할 수 있습니다:
      $host = $_SERVER['HTTP_HOST'];
      
  2. 보안 취약점:
    • URL 분석 결과를 그대로 출력하면 공격자가 XSS를 시도할 수 있습니다.
    • 해결: htmlspecialchars로 출력값 이스케이프:
      echo htmlspecialchars($host);
      
  3. 미사용된 변수:
    • day 변수는 정의만 되었으며 사용되지 않음.

6. 개선 사항

  • 보안 강화:
    echo "<div><h1> host: " . htmlspecialchars($host) . "<br> path: " . htmlspecialchars($path) . "<br> query: " . htmlspecialchars($query) . "<br></h1></div>";
    
  • 호스트 처리:
    $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'unknown';
    

이 코드는 주로 URL 분석 및 조건부 메시지 출력에 사용됩니다. 간단한 테스트 및 교육용으로 적합하지만, 보안과 실용성을 위해 위 개선 사항을 고려해야 합니다. 😊

 


 

노,.. ㅠㅠ


parse_url() 함수에 대한 정보는 참고 사이트를 보면 더 알 수 있다.
여기선 $path에 /flag.php/ 가 들어갔을 때의 조건을 피해야 되므로, 관련 취약점으로 간단하게 '/' 를 하나 더 붙여 host로 인식되게 하는 방법을 사용했다.

출처 ㅣ https://claude97.tistory.com/entry/Dreamhack-wargame-1-9

/text.txt 는 경로 인식
//test.txt는 호스트로 인식

 

그렇다면 //flag.php는 호스트로 인식하면,,? 짜자잔~

 

 

 

https://blog.naver.com/bomi3628/222430877392

 

PHP Parse_url 함수 분석 / 취약점 | 2017 블랙햇 SSRF 공격

parse_url의 최종 목적은 2017년 블랙햇에서 공개했던 SSRF 공격을 이해하는 것 언어별로 URL parse...

blog.naver.com

 


여기서 간단한 취약점이 하나 나오게되는데 그냥 간단하게 슬래쉬를 하나 추가해서
///path?arg=value 이런 URL를 보내주게 된다면 모두 NULL값을 반환한다.
///인 URL이 없기 때문 그렇다면 //path?arg=value 보내주게 된다면?
path를 host부분으로 인식하게 된다. // 다음은 보통 host가 나오기 때문에 그렇다.

++
#@ , ?@ 뒤에 있는 것을 호스트로 인식하는 경우
http://example.com:80#@google.com
http://example.com:80?@google.com
이 경우 google.com 으로 호스트를 인식하게 된다.

[출처] PHP Parse_url 함수 분석 / 취약점 | 2017 블랙햇 SSRF 공격|작성자 Algedi

 

https://codingeverybody.kr/php-parse_url-%ED%95%A8%EC%88%98/

 

PHP parse_url() 함수 – URL 구성 요소 분석 - 코딩에브리바디

parse_url() 함수는 주어진 URL 문자열을 구문 분석하여 scheme, host, port, user, pass, path, query, fragment와 같은 구성 요소를 반환합니다. 이때, URL에 포함된 구성 요소만 반환되고 구성 요소에 없으면 NULL을

codingeverybody.kr