[문제]
[풀이]
문제에 주어진 대로 admin으로 접속해보면 다음과 같은 메시지가 출력된다.
이 때 cookie 값을 확인해보면 phpsessid를 확인할 수 있다.
admin외에 다른 값(1)을 넣어보면 hello 1과 같은 메시지를 출력한다.
그리고 admin을 넣었을 때와 달랐던 점은 userid가 생성된다는 것이다.
1을 넣었을 때 id가 YzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWI%3D로 표현되었다.
이 외에도 다른 값을 넣어 보았는데, 마찬가지로 userid가 생성되는 것을 볼 수 있었다.
MDNjN2MwYWNlMzk1ZDgwMTgyZGIwN2FlMmMzMGYwMzQ4NjVjMGMwYjRhYjBlMDYzZTVjYWEzMzg3YzFhODc0MThjZTRiMTZiMjJiNTg4OTRhYTg2YzQyMWU4NzU5ZGYz
여기서 알 수 있는 점은 이전 레벨에서는 userid가 1을 입력했다면 그대로 1이라고 표현 되었는데, 해당 문제에서는 입력한 값에 대해 어떠한 암호화나 인코딩을 진행한 값을 넣고 있다는 것이다.
첫 번째로 입력했던 1을 예로 인코딩과 암호화 방식을 찾아보면, %3D를 통해 =이 URL 인코딩 되었음을 알 수 있다.
=을 마지막으로 끝내는 인코딩은 base64를 생각해볼 수 있는데, 온라인 디코더 사이트에서 디코딩했을 때 여전히 1이 아님을 알 수 있다.
여기까지 과정을 직접 돌려보면,
YzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWI%3D
-> URL decoding YzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWI=
-> base64 decoding c4ca4238a0b923820dcc509a6f75849b
이 된다. 계속해서 base64 decoding을 하면 더이상 문자열을 변환할 수 없다고 출력되기 때문에 다른 어떠한 방식이 적용된 것을 추측해볼 수 있다.
이 때 base64 decoding 결과에 대한 byte 수를 세어 보면 32byte임을 알 수 있다. 이는 md5 적용 시 32byte를 출력하기 때문에 이를 예상해볼 수 있다.
md5 decoding을 해보면 1이 출력됨을 알 수 있다.
즉, 입력 값에 대해 md5 암호화 -> base64 encoding -> URL encoding 과정을 수행하는 것을 알 수 있다.
그런데 sik이라고 넣었을 때는 이 공식에 맞지 않는 결과를 보인다.
MDNjN2MwYWNlMzk1ZDgwMTgyZGIwN2FlMmMzMGYwMzQ4NjVjMGMwYjRhYjBlMDYzZTVjYWEzMzg3YzFhODc0MThjZTRiMTZiMjJiNTg4OTRhYTg2YzQyMWU4NzU5ZGYz 라는 userid에 대해 url decoding과 base64 decoding을 진행하면 03c7c0ace395d80182db07ae2c30f034865c0c0b4ab0e063e5caa3387c1a87418ce4b16b22b58894aa86c421e8759df3 값이 출력되는데 md5 복호화를 위한 32byte라는 조건을 만족하지 않는다.
해당 바이트 수를 세기 위해 간단한 소스코드를 작성하였다.
#include <stdio.h>
main(){
char a[100] = "03c7c0ace395d80182db07ae2c30f034865c0c0b4ab0e063e5caa3387c1a87418ce4b16b22b58894aa86c421e8759df3";
int num = 0;
for (int i=0; i<100; i++){
if(a[i] != 0){
num += 1;
}
else break;
}
printf("num == %d", num);
}
코드를 돌려본 결과 96바이트 즉, 32*3으로 sik이라는 각각의 글자에 대해 암호화를 진행하여 연결한 것을 알 수 있다.
그렇다면 문제 해결을 위한 admin도 각각 글자에 대한 암호화를 진행해야 한다.
문제 입력 란에 admi까지 입력하면 이에 대한 결과를 획득할 수 있으므로 n에 대한 것만 진행하여 연결하면 다음과 같다.
MGNjMTc1YjljMGYxYjZhODMxYzM5OWUyNjk3NzI2NjE4Mjc3ZTA5MTBkNzUwMTk1YjQ0ODc5NzYxNmUwOTFhZDZmOGY1NzcxNTA5MGRhMjYzMjQ1Mzk4OGQ5YTE1MDFiODY1YzBjMGI0YWIwZTA2M2U1Y2FhMzM4N2MxYTg3NDE3YjhiOTY1YWQ0YmNhMGU0MWFiNTFkZTdiMzEzNjNhMQ==
이 값을 userid란에 입력해주면 문제가 해결된다.
'Wargame > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr - Old 25] (0) | 2021.08.19 |
---|---|
[Webhacking.kr] Old - 27 (0) | 2021.08.19 |
[Webhacking.kr] Old-54 (0) | 2021.08.11 |
[Webhacking.kr] Old-39 (0) | 2021.08.11 |
[Webhacking.kr] Old 26 (0) | 2021.08.04 |