webhacking.kr challenge 5
2개의 버튼이 나와있다. 먼저 로그인 버튼을 눌렀다.
그랬더니 로그인페이지가 나왔다. 내가 가입한 아이디와 패스워드로 로그인하니 아이디를 admin으로 로그인하라는 글이 떴다.
admin으로 로그인하되 패스워드는 아무거나 입력했더니 잘못된 패스워드라 뜬다.
join 버튼을 누루면 접근 거부라고 alert창이 뜬다. 결국 소스페이지를 확인했다.
봐도 모르겠다. 구글리을 해서 알아보니 여기서 directory listing 취약점을 통해 알아낼 수 있다고 한다.
directory listing이란 현재 브라우징 하는 웹 서버에서 디렉코리 인덱싱을 가능하게 만들어져 있서 하위 폴더나 파일을 볼 수 있는 것을 말한다. 여기서 단순히 폴더와 파일을 확인하는 것이 아닌 열람과 새로운 파일을 저장할 수 있을 경우 공격에 취약해진다.
코드를 보면 로그인 페이지의 위치가 mem/login.php라고 써 있는데 이걸 이용해서 mem파일로 이동하는 것이다.
그러면 파일 인덱스가 나온다. 여기서 join.php를 클릭했더니 아무것도 써있지 않은 검은 화면이 나와 소스 코드 확인했다.
어..... 난독화가 돼있어 읽기 힘들다..... 이걸 손으로 하나씩 확인하기도 힘들어서 난독화된 부분을 모두 복사한 후 alert창을 통해 나오도록 만들어 확인했다. (notepad++ 사용)
| 이 코드를 삽입했다. |
alert창을 통해 나왔다. 여기서 코드를 삽입할 때 주의할 점은 원래 코드에서 if 문이 시작되기 전에 넣어야 한다는 것이다. 위에서부터 하줄씩 실행되기 때문에 앞쪽에 넣어야 alert창이 정상적으로 뜰 수 있다.
나온 내용을 바탕으로 원래 코드에 넣었다. (말 그대로 복사+붙여넣기만 해서 문법오류 있을 수 있다. )
가입창을 정상적으로 띄우기 위해서는
1. cookie에 oldzombie라는 이름을 가진 쿠키가 있어야 한다.
2. URL에 mode=1 이라는 문자열이 있어야 한다.
먼저 조건1을 충족시키이 위해 EditThisCookie를 사용해 oldzombie라는 쿠키를 만들고 URL에 ?mode=1을 추가했더니 id와 password를 입력하는 칸이 나왔다.
일단 로그인할때 사용할 수 있는 id를 admin밖에 없기 때문에 admin으로 가입하려했으나 이미 존재하는 아이디라고 나왔다.
소스코드를 보면 id의 maxlength가 5라고 나와있는데 이걸 이용하면 된다. maxlength를 10으로 늘인 후 admin2라는 아이디와 1234라는 pw로 가입했다.
원래는 id의 최대 길이가 5인데 임의로 늘렸기 때문에 실제 DB에는 5만큼의 길이만 들어가는 것이 가능하다. 즉, admin2라는 id로 가입했지만 길이제한이 걸려 admin만 DB에 들어가 결국 가입한 id는 admin이 되는 것이다.
로그인창으로 이동해서 가입한 id(admin)과 패스워드(1234)를 입력하면
성공!!
참고:
http://raoooon.tistory.com/18
http://rityn.tistory.com/52
댓글
댓글 쓰기