오늘은 Lv.3 문제를 푸는데 여기서 부터는 풀이가 사이트 아니면 풀이가 거의 없길래 이렇게 올린다
먼저 사이트부터 보자

사이트가 있고

SHOP과 MYPAGE가 있으며

MYPAGE에는 쿠폰을 발급 받을 수 있는 곳과 쿠폰을 사용하는 곳이 있다

SHOP 페이지는 FLAG와 PEPERO를 살 수 있는 곳이 있다

쿠폰을 발급 받고 사용하면 충전 할 수 있는데

쿠폰을 재발급이나 재사용이 불가능 하다 또한 쿠폰을 발급 받은지 45초가 지나면 사용이 불가하다
이제 2000원을 모아서 FLAG를 사야 된다
하지만 걱정하지 말아라 손은 눈보다 빠르니까 이미 문제가 정답을 알려주고 있다

검사하는 로직이 취약하다고 한다 굳이 말 안해도 이미 취약한거 안다

이 코드는 쿠폰을 사용할 때 실행되는 코드로

45초가 지났는지 확인하는 코드와

이미 사용했는지, 발급한 유저와 사용하는 유저가 같은지 확인하는 코드가 있다
이제 여기서 취약한 곳을 한번 찾아봐라
풀어보지 않고 풀이와 정답을 보는 것은 학습에 전혀 도움이 안되니 꼭 여기서라도 분석을 해 보길 바란다

쿠폰을 발급 받을때 세션의 값의 쿠폰 발급 여부를 따지는 값도 따로 있기 때문에 재발급은 불가능하며
COUPON_EXPIRATION_DELTA의 값은 45다
이 문제의 취약한 코드는

결론적으로는 이 코드가 취약하다
이것은 단순 이 코드만 보면 이해가 안된다 모든 코드를 분석해야 이해가 된다

쿠폰을 사용할 때 실행되는 코드로 이 빨간 부분은 쿠폰의 세션을 (쿠폰 유효 시간-현재 시간)후 삭제를 하도록 되어 있다
쿠폰을 12시 30분에 발급 하고 10초 후에 사용 했다면 이 쿠폰의 세션은 (12시 30분 45초-12시 30분 10초) 35초 후에 삭제 되도록 코드가 짜여 있다 즉 발급 받은지 45초 뒤에 자동으로 삭제되는 쿠폰이다 하지만

이 쿠폰은 발급 시간+45초와 현재 시간을 비교하여 시간 초과를 계산 하는 코드인데 int(time())의 함수가 문제다
원래 time()함수는 현재시간을 소수점 까지 float 형태로 반환해 준다 하지만 int()함수는 무조건 내림차순이므로
쿠폰의 정확한 유효 시간은 45.999999...(약 46초) 라는 소리다 뭔가 이상하지 않은가
자동으로 45초 뒤에 삭제 되는 쿠폰과 46초의 유효 기간은 약 1초의 시간이 있다 여기서 다시 한번 쿠폰을 사용하려 한다면 사용이 가능해 지지 않을까 싶어서 공격코드를 짜 봤다

세션을 받아 그 세션으로 유저 정보를 갖고 와 쿠폰을 발급 받고 쿠폰을 사용하여, 자동으로 플래그를 구입하는 코드다.
킹받게 복붙하지 말라고 사진으로 찍었다 집적 이해시키기 위해서다 :)
하지만 인터넷 속도에 따라 될 수도 있고 안될 수도 있어서 실행 해 보면서 45초 time.sleep()의 인자값을 바꿔주면 된다.

야미
'CTF 풀이' 카테고리의 다른 글
| [NOOBHACK] Mster Canary 배울때 보기 좋은거 (0) | 2023.02.02 |
|---|---|
| [NOOBHACK] webhacking.kr 8번 (0) | 2022.12.20 |
| [NOOBHACK] DefCoN#21 #1 풀이 (0) | 2022.09.26 |
| [NOOBHACK] Webhacking.kr 5번 (4) | 2022.09.21 |