webhacking.kr 19번

이번엔 문제를 풀기전에 인코딩에 대해 공부한 것을 정리하겠다.

 

인코딩이란?

  • 정보를 다른 형태나 형식으로 변환하는 처리 혹은 그 처리 방식
  • 컴퓨터가 이해할 수 있는 형식으로 바꿔주는 것
  • 표준화, 보안, 처리 속도 향상, 저장 공간 절약 등을 위해서

 

ASCII 인코딩

아스키 코드는 너무 익숙한 것이라 따로 설명을 쓰지 않겠다.

 

URL 인코딩

  • 아스키 코드에 없는 영어를 제외한 외국어, 특수문자를 표현할때 사용
  • 코드 앞에 %가 붙는 것이 특징

 

HTML 인코딩

  • HTML문서 안에는 스크립트와 같이 특수 기능을 하는 문자들이 포함
  • 악의적인 특수 기능을 막기 위해 HTML인코딩을 사용한다.
  • UTF-8, euc-kr 등
  • 코드 앞에 %#문자가 붙는 것이 특징
  • 아스키 코드를 기준으로 인코딩된다.

 

base64 인코딩

  • 해당값을 2진수로 표현하면 8bit가 나오는데 앞의 6bit만 취해 base64 변환표를 이용해서 인코딩
  • 만들어진 사이트를 이용하면 편리하다
  • 코드 마지막에 = 또는 ==이 붙는 것이 특징

 

md5 암호화

  • 임의의 길이의 값을 입력받아 128비트(32자리) 길이의 해시값으로 출력
  • 단방향 암호화로 원래의 데이터 값을 찾기 불가능하다

 


19번 문제를 풀어보도록 하겠다.

 

위와 같은 화면이 나오는데 일단 제출을 눌러보도록 한다.

나는 admin이 아니라고 한다. admin으로 접속하는 것을 목표로 잡고 시작한다.

 

admin이 아닌 임의의 값을 입력한다면 어떻게 될까?

정상적으로 로그인 되는 모습을 확인할 수 있다.

 

확인 해볼 수 있는 부분이 여러가지인데 첫번째 소스를 먼저 살펴보도록 하겠다.

우선 소스를 보면 알겠찌만 소스로 해결할 수 있는 힌트가 보이지 않는다.

그렇다면 저번 1번 문제를 풀때처럼 쿠키값을 확인해보겠다.

userid라는 이름의 쿠키값이 존재한다.

값을 살펴보면 %가 보인다. 위에서 알아본것과 같이 %가 붙어있다면 url인코딩이 사용됐다고 생각할 수 있다.

 

검색하면 url디코더들이 많이 나오기 때문에 이를 활용해 저 값을 디코딩해보겠다.

MGNjMTc1YjljMGYxYjZhODMxYzM5OWUyNjk3NzI2NjE=

디코딩한 값은 위와 같은데 끝에=이 보인다.

 

=이 붙어있다면 base64인코딩의 값임을 생각해볼 수 있다.

마찬가지로 base64디코더를 이용해 값을 돌려본다.

 

0cc175b9c0f1b6a831c399e269772661

 

이러한 값이 나오는데 띠용 이게 무엇일까?

위 값의 자리수를 세어보면 총 32자이다.

32자리 암호화? md5암호화다.

 

md5복호화를 생각했으나? 앞서 공부한대로 md5는 단방향 암호화이기 때문에 복호화가 불가능하다고 한다.

그렇다면 어떻게 해결해야할까?

 

이번엔 a대신 aa를 입력해 로그인 해보겠다.

 

그리고 같은 방식으로 md5암호값이 나올때까지 반복하면

0cc175b9c0f1b6a831c399e2697726610cc175b9c0f1b6a831c399e269772661

이라는 값이 나온다.

즉 a = 0cc175b9c0f1b6a831c399e269772661임을 알 수 있다.

 

그렇다면 반대로 admin이라는 값을 각각

md5암호화 -> base64 인코딩 -> url인코딩을 거친 후

나온 값을 쿠키값으로 입력해보겠다.

 

error가 발생한다ㅠㅠ

 

1.

나는 일단 md5암호화 해주는 곳에 admin이라는 글자를 그대로 치고 그 값을 그대로 인코딩을 거쳤는데 error가 발생했다.

 

2.

동아리에서 진행했던 방식은 한 글자씩 한 후에 합치는 것이었다.

a 따로 md5암호화 d 따로 암호화 .... 이렇게 진행해서 나온 암호를 모두 합쳐서

base64인코딩 -> url인코딩을 한다.

 

그렇게 풀면 풀린다.

3.

한가지 더 추가해서 진행한 부분을 적어보려고 한다.

2에서 base64인코딩을 합치지 않고 a d m i n 각 글자를 따로 url 인코딩까지 거치고 난 값을 쿠키에 입력해보았다.

error가 아닌 hello a 라고 등장한다.

이거에 대한 의문점을 풀지 못했다.

 


의문점 정리

  • md5암호화를 할때는 반드시 한 글자씩 해야하는지?
  • 3번에서 내가 진행한 방식으로 하면 왜 admin으로 인식하지 않고 a만 인식되는 건지?

 

원래 그런건지 이 문제에서만 그런건지 궁금해서 일단 여러군데에 질문을 해둔 상태이니 답을 알게되면 추가하겠음.

 

 

(+2021.01.20 내용 추가)

 

먼저 두번째 의문에 대한 정리

 

내가 URL인코딩에 대해 정확하게 이해하지 못 한 부분이 있었다.

코드 앞에 %가 붙는다고 이해한 부분인데

URL인코딩에서 %의 의미는 base64인코딩에서 끝 부분에 =이 붙는것과 같은 의미를 가진다고 한다.

즉 %어쩌구 가 나오게 되면 컴퓨터는 이 코드가 끝이 난다고 인식하게 되는 것이다.

a d m i n을 따로따로 인코딩들을 거치게 되면 최종 값은 ~~~%3D~~~~%3D~~~%3D...  이런 모습을 하게 되는데

첫 부분에 등장한 %3D때문에 컴퓨터는 이 값이 끝났다고 인식하게 되고 맨 앞 글자인 a만 입력되게 된다.

 

 

 

첫번째 의문에 대한 정리는 정확한 자료를 찾지는 못 했지만 내 생각을 적어보겠다.

(누군가 검색하다가 발견하면 틀렸는지 어떤지 알려주시면 감사하겠습니다...)

 

값을 aa로 넣었을때의 경우를 생각해보자

디코딩을 진행했을때 md5의 값이 0cc175b9c0f1b6a831c399e2697726610cc175b9c0f1b6a831c399e269772661이었다.

즉, aa라는 문자열 자체가 md5암호화가 진행된게 아니라 a따로 a따로 암호화를 했음을 알 수 있는 부분이기 때문에

admin도 따로따로 암호화를 진행해야 하는 부분인 것 같다.

'문제풀이 > 보안 writeup' 카테고리의 다른 글

webhacking.kr 14번  (0) 2021.01.20
webhacking.kr 24번  (0) 2021.01.20
webhacking.kr 1번  (0) 2021.01.19
webhacking.kr 17번  (0) 2021.01.08
webhacking.kr 10번  (0) 2021.01.08
myoskin