Stage 1: 연습을 위해, 당신의 미션은 의도하지 않은 할인을 받는 쿠폰 코드를 찾아내는 것입니다.
풀이
할인 쿠폰을 찾아내는 문제입니다.
이것 저것 해봐서 추측해야 하지만, 이 글은 풀이니까…
Enter your coupon code 옆의 Input form 에서 우 클릭 -> 검사
입력 값을 isValidCoupon 함수의 파라미터(field1.value)로 넘기는 모습입니다.
다른 문제와 마찬가지로 위로 가보면 해당 함수가 있는 Javascript 파일이 보입니다.
http://<WebGoat접속 주소> :8080/WebGoat
/plugin_extracted/plugin/ClientSideValidation/js/clientSideValidation.js
이 파일을 보면 많은 함수들이 정의 되있지만, 필요한 몇 가지만 보겠습니다.
var coupons = ["nvojubmq", "emph", "sfwmjt", "faopsc", "fopttfsq", "pxuttfsq"]; function isValidCoupon(coupon) { coupon = coupon.toUpperCase(); for(var i=0; i<coupons.length; i++) { decrypted = decrypt(coupons[i]); if(coupon == decrypted){ ajaxFunction(coupon); return true; } } return false; } function decrypt(code){ code = code.toUpperCase(); alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; caesar = ''; for (i = code.length ;i >= 0;i--){ for (j = 0;j<alpha.length;j++){ if(code.charAt(i) == alpha.charAt(j)){ caesar = caesar + alpha.charAt((j+(alpha.length-1))%alpha.length); } } } return caesar; }
제일 처음에 coupons 배열이 보입니다. 직접 입력해보셔도 이걸로는 안 풀려요. ㅎㅎ
그 아래는 호출하는 isValidCoupon 함수가 보입니다. 입력한 값을 coupon 변수로 바꿔 사용하네요.
그 다음에는 isValidCoupon에서 호출하는 decrypt 함수가 있습니다.
isValidCoupon 함수에서 coupons 배열에 적힌 값들을 이 함수로 decrypt 하여 입력한 값과 일치하는 지 비교한 후 쿠폰을 검증하게 됩니다.
즉, decrypt 함수를 수행한 결과가 진짜 쿠폰 값이 됩니다.
마치, decrypt 함수를 분석해야 하는 것처럼 보이지만, 이 함수를 호출하면 쿠폰 값을 반환한다고 하잖아요. 그냥 실행시키면 됩니다.
방법 1: URL 입력 창 이용. URL 입력창에 다음과 같이 입력
javascript:decrypt(coupons[0]);
짠
방법 2: 개발자도구 이용. 문제 페이지에서 개발자도구 실행(F12/ 우클릭 -> 검사)
아래 console 창에 다음과 같이 입력
decrypt(coupons[0]);
짠
다른 쿠폰 값들을 써도 됩니다. 나온 글씨를 쿠폰 입력 창에 입력하면 문제는 풀립니다.