wargame : https://webhacking.kr/
✔️ 문제
문제는 다음과 같다.
✔️ 풀이
우선 로그인 페이지는 다음처럼 나온다.
비밀번호가 틀리면 Wrong password라는 창이 뜬다.
join 버튼을 누르게 되면,
다음과 같이 뜬다.
해당 메인 페이지와 login.php가 존재하는데
혹시나 php의 directory를 확인할 수 있는가에 대해서
경로에 ..을 삽입해보았다.
다음과 같이 두 php 파일이 보이는데,
우리가 접근하지 못했던 join.php 소스코드를 한번 보도록 하자.
bye 라는 alert와 함께 검은 화면이 보이는데,
개발자 도구를 열어서 확인해보면 다음과 같은 문자들이 보인다.
복사해서 가독성있게 확인해보자.
l = "a";
ll = "b";
lll = "c";
llll = "d";
lllll = "e";
llllll = "f";
lllllll = "g";
llllllll = "h";
lllllllll = "i";
llllllllll = "j";
lllllllllll = "k";
llllllllllll = "l";
lllllllllllll = "m";
llllllllllllll = "n";
lllllllllllllll = "o";
llllllllllllllll = "p";
lllllllllllllllll = "q";
llllllllllllllllll = "r";
lllllllllllllllllll = "s";
llllllllllllllllllll = "t";
lllllllllllllllllllll = "u";
llllllllllllllllllllll = "v";
lllllllllllllllllllllll = "w";
llllllllllllllllllllllll = "x";
lllllllllllllllllllllllll = "y";
llllllllllllllllllllllllll = "z";
I = "1";
II = "2";
III = "3";
IIII = "4";
IIIII = "5";
IIIIII = "6";
IIIIIII = "7";
IIIIIIII = "8";
IIIIIIIII = "9";
IIIIIIIIII = "0";
li = ".";
ii = "<";
iii = ">";
lIllIllIllIllIllIllIllIllIllIl =
lllllllllllllll +
llllllllllll +
llll +
llllllllllllllllllllllllll +
lllllllllllllll +
lllllllllllll +
ll +
lllllllll +
lllll;
lIIIIIIIIIIIIIIIIIIl =
llll +
lllllllllllllll +
lll +
lllllllllllllllllllll +
lllllllllllll +
lllll +
llllllllllllll +
llllllllllllllllllll +
li +
lll +
lllllllllllllll +
lllllllllllllll +
lllllllllll +
lllllllll +
lllll;
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>"
);
}
vscode의 extension을 활용해서 깔끔하게 정리한 모습이다.
여기서 bye라는 alert를 띄운 문자는 eval(document.cookie) 함수에
indexOf(lIllIllIllIllIllIllIllIllIllIl)랑 일치하는 값이 없으면 실행된다.
해당 문자는 위에 정의되어 있는데 문자로 풀게 되면,
oldzombie 라는 문자열이 나온다.
access_denied 문자는
eval(document.url).indexOf(mode=1)에 해당하지 않으면
뜨게 되는데, 결국 힌트는 oldzombie와 mode=1이 된다.
쿠키에 oldzombie를 넣고 다시 새로고침해보자.
이번에는 그 밑에 if문이 실행되면서 해당 URL.indexOf(mode=1)==-1 이
실행된 모습이다. mode라는 파라미터를 1로 넘겨줘보자.
회원가입을 할 수 있는 페이지가 나오게 되고,
test, test로 가입해보자.
가입에 성공한 뒤, 해당 계정으로 로그인을 해보
admin으로 로그인할 수 있다는 것이 뜬다.
admin으로 회원가입을 시도해보게 되면,
이미 존재하는 계정이라고 나오는데,
(탭)admin으로 가입을 시도해보자.
정상적으로 가입에 성공했고 해당 패스워드로 로그인하게 되면,
문제 풀이에 성공한다!
해당 문제에 대한 php 코드는 따로 없지만, 해당 풀이가 통하는 이유는
join.php에서는 admin과 (탭)admin은 다르기 때문에 가입에 성공하지만,
login.php에서는 admin과 (탭)admin은 같게 보기 때문에 로그인에 성공한다고 생각했다.
아마도 select * from 테이블 where id='admin'과 같이 id에 admin이라는
문자열이 들어가면 solve 될 수 있게끔 설계된 것으로 보인다.
화이팅 💪
'보안 > wargame' 카테고리의 다른 글
[webhackingkr] old-07 (0) | 2023.01.07 |
---|---|
[webhackingkr] old-06 (0) | 2023.01.06 |
[webhackingkr] old-04 (0) | 2023.01.05 |
[webhackingkr] old-03 (0) | 2023.01.04 |
[webhacking.kr] old-02 (0) | 2023.01.03 |