[DreamHack] [web] [Level 1] out of money 풀이

2024. 12. 24. 19:22Information Security 정보보안/DreamHack

728x90

배울내용 

dreamhack,

web hacking,

개발자도구,

dreamhack 풀이,

dreamhack out of money 문제,

dreamhack web 풀이 ,

out of money ,

 

 

 

문제

 

 

 

 

화면을 들어가면 조잡하게 3개의 화면이 나온다 

 

 

1번 화면

산타 사설 거래소, 드림 유동성 풀 둘중한개로 이동가능하고 3개의 코인을 확인가능하다 

 

2번화면

무담보 대출이라 최대 10000 까지하는이고 10001 부터는 안된다 

그리고 Flag 구매시 대출을 갚아야지 구매가 가능하다 

 

 

 

 

 

3번화면 

담보내기, 예금하기 빌리기 이렇게 3개가 있으며

2번화면과 3번화면을 잘이용해서 2번화면의 Flag 를 구매하면 성공하는 문제인것같다 

 

 

 

 

이것저것 노가다하는것보단 코드를 한번 살펴서 힌트를 보도록 하자 

 

 

코드를 살펴보면 

@app.route("/santa/lend", methods=['POST'])
def santa_lend():
    value = float(request.form['value'])

    if session['debt_DHH'] + value >= 10000.0:
        return render_template("santa.html", session=session, message="그만 빌려욧!")
    if session['DHH'] + value < 0.0:
        return render_template("santa.html", session=session, message="더 갚으시게요...?")

    session['DHH'] += value
    session['debt_DHH'] += value
    return render_template("santa.html", session=session, message="대출완료!")

/santa/flag 경로에서 Flag를 구매하기 위한 조건은 session['DHH']가 1000.0 이상이어야 하고, session['debt_DHH']가 0.0이어야 합니다. 즉, DHH에 1000.0 이상의 금액이 있어야 하고, 그 금액에 대해 빚이 없어야 Flag를 받을 수 있는걸 알수있다. 

 

현재 DHH의 값이 1000.0 이상이라면, 빚이 없는 상태일 때만 Flag를 받을 수 있고

그러므로 session['DHH']가 1000.0 이상이고, session['debt_DHH']가 0.0일 때 /santa/flag 경로에 접근하면 Flag가 제공된다.

 

 

 

 

1.  우선 DHH 를 2000 을 DHH 빌리기에서 빌린후 DHH --> DHC 로 2000바꾸고 3번화면으로 이동한다.

 

 

 

 

2. 그리고 DHC 예금하기로 2000 한뒤에 담보를 2000 DHC 채워주고 DHD 빌리기 1000을 3번 하면 담보가 2000에서 3000으로 된다

 

이게 가능한 이유는 아래의 코드에 있다  

문제의 핵심은 max_lend 값 계산인데 max_lend는 다음과 같이 계산된다

max_lend = session['col_DHC'] * dhc_price / dhd_price * 0.8

 

1000씩 3번 가능하다는 현상이 발생하는 이유는 DHD의 대출 금액(value)을 담보(col_DHC)와 비교할 때, max_lend 계산이 제대로 이루어지지 않아서 발생한 문제다. 이는 대출 금액을 요청할 때 담보가 얼마나 남아있는지에 대한 추적이 제대로 되지 않기 때문이다.

문제의 원인:

  1. 담보 금액의 증가: dream_col에서 col_DHC (담보로 제공한 DHC 금액)가 증가. 이 때 col_DHC는 실제로 사용자가 담보로 제공한 금액이지만, 이 값을 기준으로 대출 가능한 금액을 계산하려면 담보 금액을 대출 금액(DHD)에 맞춰서 조정해야 한다.
  2. 대출 가능 금액(max_lend) 계산 방식: max_lend는 담보(col_DHC)와 대출 금액(DHD)의 비율을 사용하여 계산. 이 계산에서 col_DHC의 값이 커지면, 대출 가능 금액도 증가하는데, 이 부분에서 문제가 발생할 수 있다. 즉, 담보가 증가하므로 대출 가능 금액도 증가하게 되어 1000씩 3번 가능하게 된다.

 

 

 

그러면 아까 2번화면으로 돌아온뒤에 다시 환전해주고

빌린 2000을 갚아주고 남은 1000 으로 FLAG를 구매하면 플레그를 뛰울수있게 된다 

 

 

 

 

728x90