Webhacking.kr 5번 문제 풀이

Stulta Amiko·2023년 8월 25일
0


웹 해킹 문제를 가끔씩 풀어보고 있다.
단순히 웹사이트만 만드는것 뿐만 아니라 가끔은 백준이라던지 이런문제를 풀어보는것도 두뇌회전에 도움이 되는것 같다.

먼저 이렇게 생긴 페이지가 나온다.

소스를 보면

먼저 encode 부분을 보면 id와 pw를 받아서 20번 base64로 encode 한다음에 1~8까지의 숫자를 특수문자로 바꾸고 쿠키로 아이디와 비밀번호를 적용하는게 encode 과정인것 같다.

그리고 끝의 코드를 보면 decode하는 과정도 있는데 encode의 역순으로 실행되는것을 알 수 있다.

그리고 decode된 id의 값이 admin이고 pw의 값이 nimda일때 문제는 해결이된다.

문제 자체는 내가 풀 수 있을정도면 초보자들도 쉽게 풀 수있을만큼 쉬운것 같다.

하지만 단순하게 풀 수 있는 문제는 아니고 코드를 짜서 하는게 정신건강에 이로울것같다.
물론 웹상에 존재하는 base 64 decode encode 페이지에 가서 20번씩 복사 붙여넣기를 하면서 encode 과정을 거친다음에 거기서 또 특수문자로 바꿀수 있는 자신이 있으면 그렇게 해도된다.

하지만 나는 그정도로 머리가 좋지않기때문에.. 몇번 하면 까먹을 것 같았고 그냥 프로그램을 짜기로한다.

var id = 'admin'
let password = 'nimda'
console.log('id : ', id)
console.log('password : ', password)

let i

let base64EncodedId = Buffer.from(id, 'utf8').toString('base64')
let base64EncodedPwd = Buffer.from(password, 'utf8').toString('base64')

for (i = 0; i < 19; i++) {
    base64EncodedId = Buffer.from(base64EncodedId, 'utf8').toString('base64')
    base64EncodedPwd = Buffer.from(base64EncodedPwd, 'utf8').toString('base64')
}
base64EncodedId = base64EncodedId
    .replace(/1/gi, '!')
    .replace(/2/gi, '@')
    .replace(/3/gi, '$')
    .replace(/4/gi, '^')
    .replace(/5/gi, '&')
    .replace(/6/gi, '*')
    .replace(/7/gi, '(')
    .replace(/8/gi, ')')

base64EncodedPwd = base64EncodedPwd
    .replace(/1/gi, '!')
    .replace(/2/gi, '@')
    .replace(/3/gi, '$')
    .replace(/4/gi, '^')
    .replace(/5/gi, '&')
    .replace(/6/gi, '*')
    .replace(/7/gi, '(')
    .replace(/8/gi, ')')

console.log('Base64 Encoded Id : ', base64EncodedId)
console.log('Base64 Encoded Pwd : ', base64EncodedPwd)

// Base64 Decoding
let base64DecodedId = base64EncodedId
let base64DecodedPwd = base64EncodedPwd

base64DecodedId = base64DecodedId
    .replace(/!/gi, '1')
    .replace(/@/gi, '2')
    .replace(/\$/gi, '3')
    .replace(/\^/gi, '4')
    .replace(/&/gi, '5')
    .replace(/\*/gi, '6')
    .replace(/\(/gi, '7')
    .replace(/\)/gi, '8')
base64DecodedPwd = base64DecodedPwd
    .replace(/!/gi, '1')
    .replace(/@/gi, '2')
    .replace(/\$/gi, '3')
    .replace(/\^/gi, '4')
    .replace(/&/gi, '5')
    .replace(/\*/gi, '6')
    .replace(/\(/gi, '7')
    .replace(/\)/gi, '8')

for (i = 0; i < 20; i++) {
    base64DecodedId = Buffer.from(base64DecodedId, 'base64').toString('utf8')
    base64DecodedPwd = Buffer.from(base64DecodedPwd, 'base64').toString('utf8')
}

console.log('Base64 Decoded Id : ', base64DecodedId)
console.log('Base64 Decoded pwd : ', base64DecodedPwd)

자바스크립트로 짠 코드이다.
코드는 정말 단순한 구조로 되어있다.

그냥 단순하게 base 64 encode를 20번 진행하고 1~8을 각 대응하는 특수문자로 바꿔준다 그게 답이다.

하지만 의심병이 많은 나는 decode도 진행해봤다. 혹시나 내가 틀렸을 수도 있으니..

결과는 잘 나온다.

실행결과

이런식으로 encode된 코드가 나오면 edit this cookie를 이용해서
해당하는 쿠키에 값을 넣어주면 문제가 해결된다.

0개의 댓글