문제 정보
문제 이름 : Legal Snacks
카테고리 : Web
포인트 : 100

문제 설명
웹 페이지와 서버의 코드가 모두 주어진 문제입니다.
해당 페이지에 접속해보면 쇼핑 사이트를 컨셉으로, 다양한 가상의 음식을 팔고 있습니다.

그 중 Elite hacker Snack이라는 항목을 읽어보면, 해당 항목을 구매했을 때 flag를 준다는 설명을 볼 수 있었습니다

해서 위 품목을 선택하여 카트에 담고 결제하려고 봤더니..

당연하게도 금액이 부족하여 구매할 수 없었습니다.
문제의 핵심은 서버의 허점을 이용하여 Elite Hacker Snack을 구매해야한다 였습니다.
문제 해결 과정
처음에는 사이트에서 가입한 제 계정의 Balance를 조작하여 구매해보자 라는 아이디어로 시작했습니다.
허나 사이트를 계속 찾아봐도, 코드를 읽어봐도 Balance를 조작할 수 있는 곳은 없었습니다.
기본으로 주어진 $100.00 으로 해결해 나가야 하는 듯 하여 첫 번째 아이디어는 폐기했습니다.
일단 단서을 얻기 위해 열심히 코드를 보며 끙끙대던 중 조금 이상해 보이는 코드를 발견했습니다.
@app.route('/cart/add', methods=['POST'])
def add_to_cart():
product_id = request.form.get('product_id', type=int)
quantity = request.form.get('quantity', 1, type=int)
cart = session.get('cart', {})
cart[str(product_id)] = cart.get(str(product_id), 0) + quantity
session['cart'] = cart
return redirect(url_for('cart'))
서버 코드 중 cart에 품목을 담는 함수입니다.
quantity = request.form.get('quantity', 1, type=int)
이때 수량을 결정하는 quantity 변수에 값을 넣을 때 특별한 필터링 없이 값을 그대로 넣고 있었습니다.
이를 통해 음수로 값을 넣어서 역으로 balance를 불릴 수 있지 않을까? 라는 아이디어가 떠올랐습니다.
구체적인 전략은 가장 가격이 낮은 항목인 Overflow Oreos를 음수로 카트에 넣어 최종적으로 요구되는 balance를 100 이하로 만드는 것 이었습니다.

Elite Hacker Snack의 가격이 99999.99이기에 이 값을 3.14로 나누면 대략 31847.13 ..... 이 나옵니다.
때문에 -31848개를 cart에 담아보려했더니...

음수 값이 입력이 안되는 상황이 발생하였습니다.
분명히 코드에서는 특별히 음수를 필터링 하지 않는다는 것을 확인하여 클라이언트 단에서만 값을 막고 있구나 라고 생각하였습니다.

해당 페이지의 코드를 살펴보면 위처럼 min과 max로 최소값과 최대값이 정해져있었습니다.
때문에 해당 변수를 지워주고 값을 입력해보았더니...!

정말 다행히도 성공하였습니다. 이제 체크아웃만 하면 되겠네요.

실제 결제창 처럼 다양한 정보를 물어보았습니다.
물론 당연히 실제정보를 넣을 필요는 없었기에 해당 칸에 맞는 형식으로만 값을 넣어주었습니다.
허나 입력을 완료하고 확인을 눌렀더니 ....

최종값이 음수라면 안된다네요.
다행히 전략 자체가 실패했다는 것은 아니라 안도했습니다.
양수를 맞춰주기 위해 Overflow Oreos를 하나 더 카트에 담아 주었습니다.

다시 Proceed to Checkout을 눌러 이래저래 값을 넣어주고 확인을 누르자

플래그를 획득 할 수 있었습니다!
마무리와 느낀점
다시 한 번 인증과 필터링의 중요성에 대해 생각하게 된 문제였습니다.
클라이언트 단에서 이루어지는 제한들은 언제나 취약한 듯 합니다.
필요한 지식이 많은 문제는 아닌것 같지만 이 인증에 관한 아이디어를 잊고 있어서 시간이 좀 걸린 것 같네요.
비록 이번 CTF에서는 한 문제 밖에 풀지 못 했지만, 앞으로 공부를 이어나가면서 점차 많은 문제를 풀 수 있도록 연습하겠습니다.
'보안 > CTF' 카테고리의 다른 글
| [0xFUN CTF 2026] Web write-up (0) | 2026.02.15 |
|---|---|
| [V1t CTF 2025] Web write-up (0) | 2025.11.06 |