Dreamhack/Dreamhack Wargame (Challenge)

[95] IT 비전공자 [dreamhack]Broken Buffalo Wings문제 풀기

imaginefuture-1 2024. 12. 13. 09:01

 

 

 

배고프다

 

 

 

index.php 소스코드 파일이다

 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Buffalo Wings</title>

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
</head>

<body>
    <div class="container my-5">
        <figure class="text-center">
            <blockquote class="blockquote">
                <h2>Food Post</h2>
            </blockquote>
            <figcaption class="blockquote-footer">
                Descriptions from <cite title="Source Title">ChatGPT</cite>
            </figcaption>
        </figure>
        <div class="row">
            <div class="col-md-6 offset-md-3">
                <div class="card">
                    <img class="card-img-top" src="./img/bw.jpeg" alt="Buffalo-Wing">
                    <div class="card-body">
                        <h4 class="card-title">Buffalo Wings</h4>
                        <p class="card-text">Buffalo wings, also known as hot wings or chicken wings, are a popular
                            American dish. They are named after their city of origin, Buffalo, New York, where they were
                            first served at a local restaurant called the Anchor Bar in 1964.

                            Buffalo wings are typically deep-fried without any breading and then coated in a
                            vinegar-based cayenne pepper hot sauce and melted butter. They are traditionally served with
                            celery sticks and blue cheese or ranch dressing for dipping.

                            Buffalo wings are often spicy with varying levels of heat based on the hot sauce used, but
                            they can also be prepared with other flavors like barbecue, honey mustard, or teriyaki.

                            Buffalo wings are a popular dish in bars and restaurants, especially during sporting events.
                            They are also a common appetizer and party food, and many places have wing eating contests
                            or "all you can eat" wings specials.</p>
                    </div>
                </div>
            </div>
        </div>
        <div class="text-center">
        <?php   

                if (strlen($_GET['comment'])>500){
                    echo 'Too Long';
                    die();

                }
                if (isset($_GET['comment'])) {
                    $comment = $_GET['comment'];

                    if (strpos($comment, 'lol') !== false){
                        $prefix = 'Dreame : Looks delicious ~~ But I like pizza more ';
                        echo $prefix . $comment;
                    }

                    if (strpos($comment, 'script') !== false){
                        $untrusted_comment = $_GET['comment'];

                        while (strpos($untrusted_comment, 'script') !== false) {
                            $alert = 'Malicious string Detected !!!!!';
                            $untrusted_comment = str_replace('script', '', $untrusted_comment);
                            echo $alert;
                            echo $untrusted_comment;
                            
                        }
                    }
                } 


                $nonce = base64_encode(random_bytes(20));
                $csp_header = "Content-Security-Policy: default-src 'self'; script-src *.bootstrapcdn.com 'nonce-" . $nonce . "'; style-src-elem *.bootstrapcdn.com;";
                header($csp_header);
        ?>
        </div>
        <form>
            <div class="form-group">
                <label for="commentContent">Comment</label>
                <textarea class="form-control" name="comment" id="comment" rows="3"
                    placeholder="Enter your comment"></textarea>
            </div>
            <button type="submit" class="btn btn-outline-primary">Submit</button>
        </form>
    </div>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
</body>

</html>

 

report.php소스코드 파일이다

<?php

$path = $_POST["path"] ?? "haha";
if(isset($_POST["path"])){
    $arg = escapeshellarg($path);
    $result = shell_exec("python3 ./bot/bot.py {$arg}");
}

?>

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>

<body>
    <div class="container mt-5">
        <h2>Report</h2>
        <form method="post" action="/report.php">
            <div class="form-group">
                <label for="reportTitle">Admin will check your request</label>
                <input type="text" class="form-control" name="path" id="path" placeholder="/?key=value">
            </div>
            <button type="submit" class="btn btn-outline-primary">Report</button>
        </form>
    </div>


    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.bundle.min.js"></script>
</body>

</html>

 

 

홈페이지 들어가니 진짜 버팔로윙 사진이 있다..배고프다,...ㅠㅠ

 

 

 

커멘트 제출을 눌러도 아무 반응이 없다. 뭐지?

 

딱히 개발자 도구로 봐도 아무 문제가 없어보임


 

소스 코드를 분석하고, flag를 얻기 위한 잠재적 취약점을 살펴보겠습니다.


1. 주요 코드 분석

(a) GET 요청의 comment 처리

  • 사용자가 제출한 comment 값은 $_GET['comment']로 읽습니다.
  • 주요 검증 로직:
    1. 댓글의 길이가 500자를 초과하면 "Too Long" 메시지를 출력하고 종료합니다.
    2. 댓글이 "lol"이라는 문자열을 포함하면, 특정 메시지를 추가하여 출력합니다.
    3. 댓글에 "script" 문자열이 포함되면 이를 제거하고 "Malicious string Detected !!!!!"를 출력합니다.
      • str_replace() 함수로 "script" 문자열을 삭제하지만, 완전히 제거되기 전까지 반복적으로 검증 및 삭제를 실행합니다.

(b) Content-Security-Policy (CSP) 헤더

  • 코드에서 생성된 CSP 헤더는 다음과 같은 정책을 설정합니다:
    Content-Security-Policy: 
    default-src 'self'; 
    script-src *.bootstrapcdn.com 'nonce-<nonce>'; 
    style-src-elem *.bootstrapcdn.com;
    
    • script-src에 부트스트랩 CDN에서만 스크립트를 로드할 수 있도록 설정하며, nonce 기반 검증을 적용합니다.
    • 이는 임의의 스크립트 실행을 제한하기 위한 방어책으로 보입니다.

2. 잠재적 취약점 분석

(a) XSS (Cross-Site Scripting)

  1. Malicious Input:
    • 댓글 처리 로직에서 str_replace()로 "script"를 제거하지만, 다른 방식으로 JavaScript를 주입할 수 있습니다.
      • 예: HTML 엔티티를 활용한 우회 시도 (<scr<script>ipt>).
      • 브라우저는 HTML 엔티티를 디코딩하기 때문에 우회 가능성이 있습니다.
    • 또한, alert 메시지가 반복적으로 출력되는 부분에서 XSS 공격을 트리거할 수 있습니다.
  2. 우회 가능성:
    • 단순히 "script" 문자열을 제거한다고 XSS를 완벽히 방어할 수 없습니다.
    • 예:
      <img src="x" onerror="alert('XSS')">
      
      • 이런 식의 JavaScript 코드 실행이 가능할 수 있습니다.

(b) CSP 우회

  • CSP 정책이 설정되어 있으나, script-src에 'nonce'가 설정된 부분에서 모든 스크립트를 완전히 차단하지 못할 가능성이 있습니다.
    • 특히, 서버에서 생성된 nonce 값이 잘못 관리되거나 예상 가능한 경우 문제가 발생할 수 있습니다.

3. Flag를 찾는 방법

  1. Step 1: "script" 제거 우회
    • str_replace()는 단순 문자열 치환입니다. 이를 우회하기 위해 "script"를 다양한 방식으로 변형하여 입력합니다.
      <scr<script>ipt>alert('Flag')</scr<script>ipt>
      
  2. Step 2: CSP 헤더 우회
    • script-src 정책에서 inline JavaScript는 차단되어 있을 가능성이 크므로, 이미지 태그나 이벤트 속성을 활용합니다.
      <img src="x" onerror="alert('Flag')">
      
  3. Step 3: 길이 제한을 고려한 공격
    • 500자 제한이 있으므로, 짧은 페이로드로 공격합니다.
      • 예: <svg/onload=alert('Flag')>.
  4. Step 4: 서버 응답 조작
    • 댓글을 통해 서버에서 처리된 응답에 출력된 데이터가 의도치 않게 브라우저에서 실행될 수 있는지 확인합니다.

4. 추가 방어책

  • 모든 사용자 입력을 htmlspecialchars()로 이스케이프하여 HTML 인젝션을 방지해야 합니다.
  • 정규식을 통해 JavaScript 관련 태그나 이벤트를 제거하거나, 화이트리스트 기반으로 안전한 입력만 허용해야 합니다.

이런 분석을 기반으로 취약점이 있다면 flag를 출력하거나 의도된 동작이 발생할 가능성이 있으니, 댓글 입력 필드에 위의 우회 페이로드를 시도해 보세요.

 

 

 

 

 

 

 

 

script 넣으니 malicious string detected!!!라고 뜬다
한번 gpt 글전부 복붙해서 넣으니 너무 많다고 초과됨 오류 떴다
http://host3.dreamhack.games:15765/report.php로 이동해보자

 

 

 

 

https://chulmin.tistory.com/318

 

Broken Buffalo Wings

• 이 문제를 풀기 위해 알고 있어야 할 것 - PHP Output Buffer 말그대로 출력할 때 버퍼에 담아놓았다가 일정 이상이 차게 되면 한 번에 출력하게 끔 해준다. 버퍼를 초과하는 문자열을 넘겨준다면

chulmin.tistory.com

 

 

헤엥 페이로드가 작동하긴하는데.. 광기가.. $alert가 띄어지는것을 유도해 output_buffer를 채우게해야한다는데..흐으으으므 뭐지