보안 공부/webhacking.kr

webhacking.kr 51번 풀이(PHP md5함수 취약점)

sh1256 2022. 1. 5. 18:19
728x90

첫화면
일단 admin으로 시도해봅니다. 
wrong

wrong이라고 뜨네요 아마도 PW가 틀렸을 거라 생각됩니다. 

view-source

오른쪽 밑을 보면 소스를 볼 수 있습니다. 소스를 한번 볼까요?

소스코드

1. 먼저 post 방식으로 id와 pw를 입력받습니다. 

2. id에 addslashes 함수를 적용하여 특수문자 앞에 역슬래시'/'를 붙여줍니다. 

3. pw를 md5로 암호화합니다. 

4. id='input_id', pw='md5('pw',true')'인 값이 테이블에 있으면 문제는 풀리게 됩니다. 

 

일단 눈에 띄는게 있네요 바로 md5($_POST['pw'],true); 부분의 true 입니다. 

이게 뭔가 싶어 검색을 해 봤더니 

취약점이 검색어 자동 완성으로 바로 뜨네요 ㅋㅋㅋㅋ

md5를 true와 같이 쓰면 취약점이 있나 봅니다.

자 그럼 취약점을 자세히 알아볼까요?

 

 

md5 의 옵션중 raw_output 옵션이 있는데, 이 옵션엔 취약성이 있습니다. 

raw_output 옵션은 기본적으로 false로 되있는데 false일 때는 hex값이 나오고, 

raw_output 옵션이 True일때는 md5 의 값이 binary 값으로 출력이 됩니다. 

 

만약 md5 값이 binary 값으로 출력이 되면 문자가 출력이 됩니다. 

그래서 pw에 특정한 숫자를 넣어 md5로 암호화했을 때 그 결과에 '='나 'or'가 포함되면 문제는 풀리게 되는거죠

더보기

select id from chall51 where id='{$input_id}' and pw='{$input_pw}'

 1. or 사용

  -> pw=' ' or ' ' 

  -> False or True

  -> True

2. = 사용

  -> pw='?????' = '******' 

  -> pw='1' = '1'

  -> True

출처: https://hyunmini.tistory.com/43

 

파이썬을 돌려서 직접 '='나 'or'가 들어간 숫자를 찾으셔도 되고, 인터넷에서도 쉽게 찾으실 수 있습니다. 

'='포함: 9235566

'or'포함: 129581926211651571912466741651878684928

위 둘 중 아무거나 pw에 넣고, id에는 admin을 넣어서 로그인하면 문제해결!

성공