보안 공부하는 꼬깔이

Webhacking.kr 5번 문제 풀이

 

 

 

5번문제를 페이지를 보면 Login과 Join 폼이 있다.

 

join 을 클릭해보자

 

 

Access_Denied alert창이 뜨면서 거부되었다 ㅠㅠ

 

 

 

이번에는 login 폼에 들어가서 임의의 아이디와 비밀번호를 넣어보자

 

 

결과는 위와 같다. 아무래도 id 값이 admin이 아니면 거부 되는것 같다

 

 

id에 admin 을 입력하고 password에 1234를 넣었더니 password가 틀렸다는 구문이 출력된다.

 

아무래도 join을 어떠한 방법으로 우회하여 admin계정을 생성후 로그인해야 되는것 같다.

 

 

5번 문제의 메인 페이지 소스를 확인해봤는데 Login 버튼을 클릭하면 스크립트 태그의 function move를 호출하고 move 함수에 login 이라는 값을 넣어 page가 login 이라면 mem/login.php 페이지로 로케이션 되게 되있다. 또한 join을 누를시 function no 함수가 호출되어 무조건 access_Denied alert 창이 출력되게 되있다.

 

여러가지 시도를 하던도중 mem/ 디렉토리 밑에 login.php가 존재한다는 전재하에 디렉토리 리스팅 취약점이 존재하지는 않을까 하고 시도해봤다.

 

 

디렉토리 리스팅 취약점이 존재했고 그 결과 mem 디렉토리에 있는 join.php 파일을 확인하게 되었다.

 

join.php 로 들어가보자

 

들어가게 되면 검은 배경이외에는 아무것도 존재하지 않았다.

 

 

 

 

크롬의 검사 기능을 통해 페이지를 확인해보니 엄청 빡시게 난독화된 스크립트를 볼 수 있었다....

 

이 빡시게 난독화된 스크립트가 도대체 뭘 의미하는지 알아보기 위해 복호화 해보도록 하자...

 

크롬의 console 기능을 이용해 하나하나 유추해 볼것이다. 

 

 

 

 

 

우선 첫번째 if문 전까지는 전부 난독화를 위한 변수에 문자를 넣는 과정이다.

 

 

 

 

 

 

여기서부터가 난독화의 시작이다. 먼저 첫번쨰 if문을 보면 문자열로 넘어온 자바스크립트 구문을 실행시켜 주는 함수인 eval을 이용해 난독화된

 변수를 실행시켰다. 그렇다면 하나하나 난독화된 변수를 실행시켜 복호화 해보자

 

 

 

 

 

 

이런식으로 난독화된 변수 실행시켜 출력된 값을 코드에 넣어보도록 하자.

 

 

 

난독화된 코드를 성공적으로 복호화 시켰다 ㅠㅠ 이제 코드를 해석해보자!

 

 

 

 

if(document.cookie.indexOf(oldzombie)==-1)  # oldzombie 라는 쿠키가 없으면 코드 실행 종료

{
bye;
}

if(document.URL.indexOf(mode=1)==-1)  #URL에 mode=1 을 GET방식으로 넘기지 않으면 alert창 출력후 전 페이지로 이동
{
alert('access_denied');history.go(-1);
}
else           #URL에 mode=1이 있으면 else문 수행 
{
document.write('<font size=2 color=white>Join</font><p>');      #여기서부터는 document.write로 html 구문을 쓰는 부분
document.write('.<p>.<p>.<p>.<p>.<p>');
document.write('<form method=post action='join.php>');
document.write('<table border=1><tr><td><font color=gray>id</font></td><td><input type=text name='id' maxlength=5></td></tr>');
document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name='pw' maxlength=10></td></tr>');
document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');
}

 

코드 해석을 보면 cookie 값에 oldzombie 문자가 포함되어 있어야 되며 URL 에는 mode=1 문자가 있어야 된다.

 

 

 

 

 

쿠키에 oldzombie 장착!

 

 

URL에 mode=1 장착!

 

 

어렵게 회원가입 페이지를 찾아냈으니.. 이제 가입해보자

 

 

id 'admin' 이 이미 존재한다고 한다... 하 ...

 

admin이면서 admin이 아닌 값을 어떻게 전달할까 고민 끝에 DB에서 #은 주석을 의미하는데 주석은 insert 되지 않는다. 그러면 최종적으로 admin이 insert 될것이다. 

 

 

 

id 부분의 maxlenth 가 5로 되어있어 딱 admin 하면 끝이난다. 크롬의 검사 기능으로 maxlenth를 6으로 바꿔 #넣을 자리를 마련하자

 

 

#을 추가해서 로그인해보자

 

 

드디어!!!!!!!!!!!!! 회원가입에 성공했다. 이제 로그인해보자

 

 

추카!

 

 

300 point Get :D

 

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

Webhacking.kr 10번 문제 풀이  (0) 2017.07.06
webhacking.kr 6번 문제 풀이  (0) 2017.06.29
webhacking.kr 4번 문제 풀이  (0) 2017.06.29
webhacking.kr 3번 문제 풀이  (1) 2017.06.29
webhacking.kr 1번 문제 풀이  (0) 2017.06.29