WarGame/Web

[webhacking.kr 19번]

선문기 2016. 2. 5. 19:31

[필히 본인이 풀어보시고 정말 안되겠다면 다음의 풀이를 확인하시길 바랍니다.]



[그림 1] Prob 19


19번 문제는 SQL injection 문제이다.

사용자로 부터 ID를 입력 받아 제출버튼을 클릭하면 그 아이디로 로그인이 된다.



[그림 2]id = guest 입력



[그림 3] id = admin 입력


admin계정을 빼곤 임의로 생각해낸 문자열을 입력시 모두 그 문자열로 로그인은 가능 하다. 하지만 admin계정으로 로그인을 해야 이 문제는 클리어가 된다.


처음에 이문제를 접했을 때 패스워드를 입력받지 않아 단순 세션을 비교해서 로그인가능여부를 판단하는지 알았다.

(패스워드를 입력받아 검증작업을 진행하였다면 sql injection을 이용해 패스워드 비교부분을 무력화하는게 일반적이니깐!!)

다시 생각해보니 id비교구문 뒤에 굳이 패스워드가 아니더라도 하드코딩으로 세션값을 비교할 수도 있고 어떤값을 입력하더라도 admin으로 로그인을 할 수 없게 만들어 놓을 수 도 있다는 생각을 해보았다.

그래서 id값을 "admin/*"으로 해보았다.(id 비교구문 뒤를 주석처리한 것이다.)



[그림 4] 인증 완료


사실 이문제는 sql injection문제를 의도한 것은 아닌 것 같다.

두번 째 풀이가 존재한다.

첫번째 풀이에서 생각했던 세션관련 방법으로 풀어보겠다.

일단 아무계정으로 로그인을 시도해 쿠키값을 확인해보자.



[그림 5] guest계정의 쿠키값 확인



YjJmNWZmNDc0MzY2NzFiNmU1MzNkOGRjMzYxNDg0NWQ3Yjc3NGVmZmU0YTM0OWM2ZGQ4MmFkNGY0ZjIxZDM0

Y2UxNjcxNzk3YzUyZTE1Zjc2MzM4MGI0NWU4NDFlYzMyMDNjN2MwYWNlMzk1ZDgwMTgyZGIwN2FlMmMzMGYwMzR

lMzU4ZWZhNDg5ZjU4MDYyZjEwZGQ3MzE2YjY1NjQ5ZQ%3D%3D

[표 1] 쿠키값에 적용된 URL 인코딩 된 값


1차적으로는 URL 인코딩으로 값이 적용되어 있다.

이 값을 디코딩하면 아래와 같이 나온다.


YjJmNWZmNDc0MzY2NzFiNmU1MzNkOGRjMzYxNDg0NWQ3Yjc3NGVmZmU0YTM0OWM2ZGQ4MmFkNGY0ZjIxZDM0Y2UxNjcxNzk3YzUyZTE1Zjc2MzM4MGI0NWU4NDFlYzMyMDNjN2MwYWNlMzk1ZDgwMTgyZGIwN2FlMmMzMGYwMzRlMzU4ZWZhNDg5ZjU4MDYyZjEwZGQ3MzE2YjY1NjQ5ZQ==


base64로 인코딩 된 값이다.


다시 base64로 디코딩을 해보자.


b2f5ff47436671b6e533d8dc3614845d7b774effe4a349c6dd82ad4f4f21d34ce1671797c52e15f763380b45e841ec3203c7c0ace395d80182db07ae2c30f034e358efa489f58062f10dd7316b65649e

MD5로 인코딩 된 값이다.

MD5는 32자리씩 끊어서 디코딩을 진행하면 된다.

b2f5ff47436671b6e533d8dc3614845d  => 'g'

7b774effe4a349c6dd82ad4f4f21d34c => 'u'

e1671797c52e15f763380b45e841ec32 => 'e'

03c7c0ace395d80182db07ae2c30f034 => 's'

e358efa489f58062f10dd7316b65649e => 't'

이제부턴 쉽다. 우리가 원하는 것은 admin의 세션이다. 위의 디코딩 방식을 거꾸로 적용하여  admin의 세션값을 생성해서 적용해 보자. 


0cc175b9c0f1b6a831c399e2697726618277e0910d750195b448797616e091ad6f8f57715090da2632453

988d9a1501b865c0c0b4ab0e063e5caa3387c1a87417b8b965ad4bca0e41ab51de7b31363a1


[표 2] admin문자열을 md5로 인코딩



MGNjMTc1YjljMGYxYjZhODMxYzM5OWUyNjk3NzI2NjE4Mjc3ZTA5MTBkNzUwMTk1YjQ0ODc5NzYxNmUwOTFhZDZmOG

Y1NzcxNTA5MGRhMjYzMjQ1Mzk4OGQ5YTE1MDFiODY1YzBjMGI0YWIwZTA2M2U1Y2FhMzM4N2MxYTg3NDE3YjhiOT

Y1YWQ0YmNhMGU0MWFiNTFkZTdiMzEzNjNhMQ==

[표 3] md5 인코딩 값을 base64로 변환




MGNjMTc1YjljMGYxYjZhODMxYzM5OWUyNjk3NzI2NjE4Mjc3ZTA5MTBkNzUwMTk1YjQ0ODc5NzYxNmUwOTFhZDZmOG

Y1NzcxNTA5MGRhMjYzMjQ1Mzk4OGQ5YTE1MDFiODY1YzBjMGI0YWIwZTA2M2U1Y2FhMzM4N2MxYTg3NDE3YjhiOTY

1YWQ0YmNhMGU0MWFiNTFkZTdiMzEzNjNhMQ%3D%3D

[표 4] base64 인코딩 값을 URL 인코딩


이제 [표 4]의 값을 세션의 값으로 설정해보자.



[그림 6] 인증 완료