Wargame/Webhacking.kr

[Webhacking.kr] Old-19

핏디 2021. 8. 12. 14:53
SMALL

[문제]


[풀이]

문제에 주어진 대로 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란에 입력해주면 문제가 해결된다.

 

 

LIST

'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