
test.txt 파일과 flag.docx 파일의 다운로드 링크가 있는 페이지가 나옵니다. flag.docx의 다운로드 링크를 누르면 Access Denied라는 alert가 나오고 test.txt는 다운로드가 됩니다.
코드를 확인해 보겠습니다.
<table border=1 align=center width=300>
<tr><td width=50>no</td><td>subject</td><td>file</td></tr>
<tr><td>2</td><td>test</td><td>test.txt [<a href=?down=dGVzdC50eHQ=>download</a>]</tr>
<tr><td>1</td><td>read me</td><td>flag.docx [<a href=javascript:alert("Access%20Denied")>download</a>]</td></tr>
</table>
test 부분 download의 하이퍼링크를 보면 ?down=dGVzdC50eHQ= 로 연결되고, flag.docx 부분의 download는 alert를 띄우는 걸 볼 수 있습니다.
여기서 GET으로 down에 dGVzdC50eHQ= 라는 값을 주면 test.txt를 다운받을 수 있습니다. 암호화된 값인 것 같아서 드림핵에서 제공하는 cyberchef 에서 이것저것 값을 넣어서 확인해봤습니다.

plaintext는 아마 test 또는 test.txt일 것 같아서 두 값에 여러 연산을 하던 중 test.txt를 base64 인코딩 한 결과가 아까 down의 값과 동일한 것을 발견하였습니다.

저희가 필요한 파일은 flag.docx 이므로 동일하게 base64 인코딩을 해준 후 GET으로 전달하면 플래그를 다운받을 수 있습니다.
정리를 하면서 생각해보니 인코딩한 값일 경우 디코딩을 하는데 자원이 거의 소모되지 않으므로 여러 방법으로 디코딩을 먼저 해보는게 효율적인 것 같습니다. 그리고 해시 함수의 경우 출력 문자열의 길이가 고정이므로 여기서는 시도를 해 볼 필요가 없었던 것 같습니다.

검색하면서 알게 된 기능인데 Magic 이라는 기능에 미지의 문자열을 넣으면, 자체적으로 문자열의 패턴과 엔트로피를 분석하여 어떤 인코딩이나 암호화가 수행되었는지 자동으로 추천해준다고 합니다.
다만 단방향 해시 함수나 개발자의 커스텀 로직이 존재하는 경우 풀어줄 수 없기 때문에 처음에 간단하게 인코딩된 값인지 알아보는데 사용하는게 좋을 것 같습니다.