이번 문제는 javascript를 해석하는 문제였다.
먼저 웹페이지를 보자
아래처럼 말 그대로 success라는 Phrase를 제출하게 되면 성공이다.
하지만 ChangeMe라는 단어는 결코 바뀌지 않고 제출된다.
이유를 개발자도구에서 살펴보았다.
아래는 소스를 찾아본 것인데 javascript에서 phrase를 rot13으로 인코딩하고 md5로 인크립션하여 토큰에 담아주는 것을 볼 수 있다.
그리고 그 아래 form을 살펴보면 hidden으로 token이 가고 있다.
비어있지만 저건 서버측 소스코드일 뿐이고 자바스크립트가 실행되어 저 value를 채워줄 것이다.
우리가 봤던 ChangeMe는 그저 라벨에 불과하고 진짜 바꿔줘야 하는 것은 저 토큰이었다.
아래는 Elememts를 통해서 브라우저의 코드를 본 것이다.
보면 token이 고정값으로 되어있다.
저 토큰은 rot13으로 인코딩되고 md5로 인크립션 되었을 것이므로 역순으로 md5로 디크립션하고 rot13으로 디코딩 해보겠다.
'아래처럼 디크립션해서 얻은 PunatrZr이라는 문자열을
ROT13으로 디코딩하면 원래의 문자열 ChangeMe가 나오게 된다.
이 ChangeMe가 자바스크립트로 매번 채워졌고 히든으로 보내졌기 때문에 우리는 브라우저에서 제출되는 값을 변경할 수 없었던 것이다.
그러면 success라는 단어를 보내야하는 것이기 때문에 똑같이 rot13으로 인코딩 후 md5로 인크립션을 해보자.
success를 인코딩한 결과 fhprff라는 문자열이 나오게 되었다.
이 문자열을 md5로 인크립션 했더니 아래 hash값이 나오게 되었다.
저 hash를 토큰의 값으로 개발자 도구를 통해 입력하게 되면 Well done!이라는 문자열이 뜨면서 성공하게 된다.