Webhacking.kr 51번 문제 풀이!
많이 왔다
어서 다 풀고 다시 풀어봐야징
51번 문제 클릭!
Admin page 라고 나오고
ID와 PW를 입력하는 창이 나온다
그리고 오른쪽 밑에 보면 source 가 보인다
눌러보자
전에 index.phps 페이지의 버튼을 만들어 둔거 같다 ㅎㅎ
소스를 한번 보자
id와 pw를 받아서 pw는 md5로 해시화 하여 쿼리를 날려 비교하는거 같다
결국 id=admin 이 참이 되도록 해야한다
전 문제 처럼 /**/ 이런 주석으로 우회할 수 없도록 md5가 위에 빠져있다
그렇다면 어떤 방법으로 우회해야 할까..!?
md5 부분에 md5(pw,true); 라고 되어있는데
true가 왜 들어가있나해서
md5 를 검색해보았다
구글에서 md5 취약점 이라고 검색해보니
아래 블로그에서 좋은 정보를 얻을 수 있었다
http://hyunmini.tistory.com/43
그냥 md5(pw) 를 사용하면 결과 값이 16진수로 결과가 나오는데
md5(pw,true) 이런식으로 사용하면 binary 의 형태로 결과 값이 나오게 된다
근데 이 binary 값 중에 '=' 이런 문자가 포함되어 있다면
!@$!@$ '=' #$^@^
이런식의 결과 값이 나올 수가 있다
어떤 결과가 나올지 알기 위해 mysql에 test용 DB를 만들고 테스트 해봤다
mysql -u root -p
create database test;
use test;
create table Tb (id varchar(20), pw varchar(20));
show tables;
test 라는 Database에 Tb라는 테이블을 만들고
id, pw 칼럼을 넣었다
그리고 id pw에 aaa/AAA , bbb/BBB, ccc/CCC 라는 값을 추가해주었다
insert into Tb values('aaa', 'AAA');
insert into Tb values('bbb', 'BBB');
insert into Tb values('ccc', 'CCC');
select * from Tb;
이제 위의 소스와 비슷한 쿼리문을 만들어 테스트 해보자
일반적인 쿼리
select id,pw from Tb where id='aaa';
'='AAA 가 추가된 쿼리
select id,pw from Tb where id='aaa'='AAA';
'=true 가 추가된 쿼리
select id,pw from Tb where id='aaa'=true;
'=false 가 추가된 쿼리
select id,pw from Tb where id='aaa'=false;
결과를 보면 'aaa'=true 일 때를 제외하고는 모두
aaa 를 제외한 나머지 결과가 출력되었다
'aaa'=(거짓값) 이면 id가 aaa 인걸 제외한 모든 값이 나온다는 사실을 알았으니
이제 md5(pw,true) 의 결과에 '='이 들어가는 pw를 찾아서 넣어줘보자
원래의 쿼리를
select id from challenge_51_admin where id='$input_id' and pw='$input_pw'
md5(pw,true)를 이용하여 아래와 같은 쿼리로 만들면
select id from challenge_51_admin where id='admin' and pw='@#%! '=' !#$@%'
pw 부분에서 '@#%!' 의 값을 제외한 모든 값을 의미하게 되고
앞 부분에 id='admin' 의 결과가 쿼리의 결과로 나오게 될 것이다
md5(pw,true) 의 결과 중 '=' 이 포함되어 있는 pw 찾아내는건
로컬 웹 서버를 이용하여 간단히 php를 이용하여 알아 내였다
(찾아낸 pw 값은 모자이크처리했다)
이제 값을 입력해 보면..
Congratulation!
51번 문제 클리어당