5번 문제의 화면이다. 로그인 버튼을 누르면 아래와 같이 로그인 입력창이 나오고 join 버튼을 누르면 access denied가 alert 된다.
개발자 도구를 이용하여 소스코드를 확인하자
스크립트 구문을 확인하면 login을 클릭하면 mem/login.php로 이동된다.
문제접근
로그인 입력란에 아무 글자를 넣어보면 패스워드가 잘못되었다고 출력된다.
id 부분을 아무 문자로 계속 바꾸어도 똑같이 패스워드가 잘못됬다고 한다. sql injection 으로 접근해도 별다른게 없었다. 그래서 mem/login.php 경로에 php파일이 있으니 join과 관련된 php파일을 찾아보고자 'mem/' 경로로 이동해보았다.
실행
mem/ url경로로 들어가니 위와 같이 디렉토리가 노출되었다. join, login php가 있다.
join.php를 클릭하면 access denied라고 alert가 되면서 특정 페이지가 나온다.
검은색 배경이 나온다. 소스코드를 확인하자.
소스코드의 script 태그 부분을 보면 해석하기 힘들며 개행문자가 적용이 안된 문자들이 나온다. 해당 부분을 정렬시켜주는 사이트에 복사한다.
정렬시킨 문자들을 해석하기 위해 브라우저의 콘솔을 이용한다. 브라우저의 콘솔은 javascript를 처리한다.
if (eval(lIIIIIIIIIIIIIIIIIIl).indexOf(lIllIllIllIllIllIllIllIllIllIl) == -1) {
alert('bye');
throw "stop";
}
if (eval(llll + lllllllllllllll + lll + lllllllllllllllllllll + lllllllllllll + lllll + llllllllllllll + llllllllllllllllllll + li + 'U' + 'R' + 'L').indexOf(lllllllllllll + lllllllllllllll + llll + lllll + '=' + I) == -1) {
alert('access_denied');
throw "stop";
} else {
document.write('<font size=2 color=white>Join</font><p>');
document.write('.<p>.<p>.<p>.<p>.<p>');
document.write('<form method=post action=' + llllllllll + lllllllllllllll + lllllllll + llllllllllllll + li + llllllllllllllll + llllllll + llllllllllllllll +
'>');
document.write('<table border=1><tr><td><font color=gray>id</font></td><td><input type=text name=' + lllllllll + llll + ' maxlength=20></td></tr>');
document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name=' + llllllllllllllll + lllllllllllllllllllllll + '></td></tr>');
document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');
}
브라우저 콘솔을 이용하여 위의 구문을 해석하면 다음과 같다. / 해석하고자 하는 문자를 콘솔에 복붙하여 확인하면 된다/
if (eval('document.cookie').indexOf('oldzombie') == -1) {
alert('bye');
throw "stop";
}
if (eval('document.URL').indexOf('mode=1') == -1) {
alert('access_denied');
throw "stop";
} else {
document.write('<font size=2 color=white>Join</font><p>');
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=' + lllllllll + llll + ' maxlength=20></td></tr>');
document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name=' + llllllllllllllll + lllllllllllllllllllllll + '></td></tr>');
document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');
}
eval() 함수는 인자 값으로 받은 문자열을 실행시키는 함수로 .indexof()와 결합되어 현재 문서의 쿠키에 oldzombie가 없으면 bye 가 alert 되고 throw로 예외처리가 되어 다음 구문을 실행안한다. 즉 쿠키에 oldzombie가 있어야 한다.
그리고 url 부분에 mode=1이 없으면 마찬가지로 중단이 된다. 따라서 이 2가지를 만족시키면 계정을 등록할 수 있는 form 태그가 나온다.
쿠키를 추가하기 위해서는 edit cookie 를 이용해도 되고 개발자도구를 이용하여 추가해도 된다.
쿠키에 oldzombie를 추가한다. 값은 아무거나 상관없다.
url에도 위와 같이 mode=1을 추가한다.
조건을 만족시키고 enter를 누르면 위와 같이 form태그가 출력된다. 이제 계정을 등록하자
계정을 추가했으면 login 경로에 가서 계정을 입력한다.
내 id가 출력되며 admin으로 로그인하라고 한다.
id를 admin으로 등록해보자
id를 admin으로 입력하면 이미 존재한다고 alert 된다. sql 상으로 데이터를 등록할때 'admin' 와 '(공백)admin' 은 동일한 문자열로 인식된다. 이 점을 이용하여 '(공백)admin' 으로 id를 등록하여 로그인을 시도해보자
계정이 등록이 되었으며 admin 계정을 로그인하면 문제가 풀린다.
문제핵심
1. url을 통한 디렉토리 조회
2. sql 상에서의 공백을 통한 우회
'웹 > 웹 해킹 문제 풀이' 카테고리의 다른 글
bwapp 실습 (WebDAV 취약점) (0) | 2023.02.08 |
---|---|
webhacking.kr 7번 문제풀이 (0) | 2023.02.07 |
webhacking.kr 4번 문제풀이 (0) | 2023.02.02 |
webhacking.kr 56번 문제풀이 (0) | 2023.01.19 |
webhacking.kr 43번 문제풀이 (0) | 2023.01.07 |