Problem-7
문제의 내용을 보면 일반 게시글과 비밀 게시글이 존재한다. 비밀글에 관련해서 보안 이슈 발생으로 인하여 개발자는 긴급히 이를 조치하였다. 라는 내용이 있다.
문제 페이지의 Board 카테고리로 이동하면 아래 페이지를 볼 수 있다.
비밀글을 읽어서 인증키를 획득하여라. 라고 적혀있다.
게시글을 확인하려 하면 암호 입력이 필요하다.
임의로 입력을 시도해보면 암호가 일치하지 않는다는 문구가 나온다.
패킷을 확인해보면 스크립트의 내용을 볼 수 있다.
게시글이 없다면, "게시글 번호 값이 존재하지 않습니다.”,
입력값이 없다면, "게시글 암호를 입력 하세요.”,
입력값이 있는 경우, "게시글에 대한 암호가 일치하지 않습니다.”를 출력한다.
이때 코드 중 자세하게 볼 부분은 아래와 같다.
사용자가 입력한 값이 “iRAJHaTRiRAJHaLLFBOwrXoLF6j2rSXC” 로 출력될 경우 submit() 함수를 호출시킨다. 그렇지 않은 경우 암호가 일치하지 않는다고 경고창이 뜬다.
InputEncKey = UserPasswordEncryptFunc(document.PasswordTrans.password.value);
if (InputEncKey == EncryptReadKey) {
document.PasswordTrans.submit();
} else {
alert("게시글에 대한 암호가 일치하지 않습니다.");
}
InputEncKey = UserPasswordEncryptFunc(document.PasswordTrans.password.value);
if (InputEncKey == iRAJHaTRiRAJHaLLFBOwrXoLF6j2rSXC) {
document.PasswordTrans.submit();
} else {
alert("게시글에 대한 암호가 일치하지 않습니다.");
}
문제에서 사용하는 Utill.js 파일의 내용은 아래와 같다.
var PasswordEncrypt = {
_keyStr : "DUYZabcVWdQefGghijklmAnEFopqrHstKLuvXwRSxyz0IO12M34JN5B6789+PT/=C",
encode : function (input) {
var output = "";
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;
while (i < input.length) {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
}
return output;
}
}
function UserPasswordEncryptFunc(PlainText) {
EncText = PasswordEncrypt.encode(PlainText);
return EncText;
}
패킷을 잡아보면 헤당 게시글 클릭 링크 자체에 권한에 관한 경고창이 뜨도록 되어있다.
권한이 없어도 열람 가능한 게시물에서 게시글 번호 값만 바꾸어주었더니 오류창이 뜬다.
다른 게시글들은 ?idx=게시글번호 로 지정이 되어 있어 패킷을 잡고 비밀글 번호인 2001을 넣어도 위와 같은 오류가 뜬다.
이번에는 비공개 글이 아닌 게시글의 idx 값을 2001로 바꿔주었다.
플래그를 얻었다!