webhacking.kr 51번 풀이(PHP md5함수 취약점)
wrong이라고 뜨네요 아마도 PW가 틀렸을 거라 생각됩니다.
오른쪽 밑을 보면 소스를 볼 수 있습니다. 소스를 한번 볼까요?
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

파이썬을 돌려서 직접 '='나 'or'가 들어간 숫자를 찾으셔도 되고, 인터넷에서도 쉽게 찾으실 수 있습니다.
'='포함: 9235566
'or'포함: 129581926211651571912466741651878684928
위 둘 중 아무거나 pw에 넣고, id에는 admin을 넣어서 로그인하면 문제해결!