Wargame/webhacking.kr (old)

[Webhacking.kr] 51번 풀이

Grini 2019. 5. 8. 21:44


오른쪽 아래에 잘보면 Source가 있다.

클릭해서 소스를 보자.



id가 admin이면 풀리는 SQL Injection 문제이다.

SQL 쿼리문이 and로 되어 있기 때문에 pw부분을 주석 처리해 인증을 우회하기로 하였다.


id : admin'-- , pw : 1



Wrong이 뜬다. 이 방법으로는 인증우회가 안된다.

admin의 pw를 알아내거나, 다른 방법으로 인증을 우회해야한다.

pw가 md5 함수에의해 해시화되고있다. 그런데 의심스럽게 md5의 인자로 true가 전달된다.


md5(string \$str [, bool \$raw_output ])

RSA Data Security, Inc. MD5 Message-Digest Algorithm을 사용하여 str의 MD5 해시를 계산하여

반환하는 함수로 raw_output의 기본 값은 false이다.

raw_output를 true로 할 경우 binary 형식으로 반환한다.



binary 형식으로 반환할 경우 md5 raw hash 취약점이 발생할 수 있다.


MD5 Raw Hash 취약점

binary로 반환된 문자열에 = 또는 or이 포함된 경우에 인증을 우회할 수 있다.


이해를 위해 num_51 테이블을 생성하고 실습해보았다.



1. select* from num_51 where id='admin' and pw='astw'or'5adst';



id='admin' and pw='astw' 가 False 이지만 or 뒤의 문자열이 5로 시작하여 bool으로 사용될 때

int 형으로 캐스팅되어 5가된다. 따라서, '5adst' 는 True가 된다.

(연산자 우선순위 : and > or)

결과적으로 select* from num_51 where id='admin' and pw='astw' or 5와 같다.


2. select* from num_51 where id='admin' and pw='astw'='adst';



pw='astw'는 False이고, 'adst'는 int 형으로 캐스팅되어도 숫자가 없어 0이므로 False가 된다.

따라서, False=False가 되어 True가 된다.

결과적으로 select* from num_51 where id='admin' and True와 같다.


[ MD5 Raw  Hash 취약점 ] http://cvk.posthaven.com/sql-injection-with-raw-md5-hashes

[ MD5 Raw Hash 취약점 ] https://hyunmini.tistory.com/43


MD5 Raw Hash 취약점을 이용하여 인증을 우회하면 될 것 같다.

md5를 binary로 나타낸 값 중 'or'숫자 를 포함하거나 '='를 포함하는 값을 찾아보자. php를 이용하였다.

('or'숫자 는 시간이 너무 오래 걸려 '='를 찾는 소스를 짰다.)



php 실행 결과는 아래와 같다.



찾아낸 값인 1839431으로 로그인을 시도하니 문제가 풀렸다.


id : admin, pw : 1839431