[WARGAME][webhacking.kr] old-5

jckim22·2022년 11월 15일
0

[WEBHACKING] STUDY (WARGAME)

목록 보기
69/114

아래는 메인화면이다 login과 join이 보인다.
join으로 들어가보았다.

join은 누르면 위처럼 access denied가 뜨길래 login으로 들어가 보았다.


login창에서는 그냥 말 그대로 login하는 곳이었다.

아래처럼 login페이지에서 post요청을 보내고 패킷도 잡아봤지만 별로 할 수 있는 것이 없었다.

아직 뭘해야하는지는 감이 안잡히고 join페이지에 들어가는 것이 관건일 거 같다.

삽질을 하다가 url에 mem/login.php이길래 /mem까지만 해서 들어가보았더니 아래와같이 Directory 목록이 나왔다.

join.php에 들어갈 수 있었는데 그냥 url에 /mem/join.php만 해도 들어갈 수 있었다.

join.php로 들어가니 바로 아래와 같은 알림이 뜨면서 아무것도 나오지 않는 것을 알 수 있었다.

소스코드를 확인해보았다.
지저분하게 되어있길래 정리하는 사이트에서 코드를 정리했다.

<
html >
    <
    title > Challenge 5 < /title></head > < body bgcolor = black > < center >
    <
    script >
    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>');
} <
/script> <
/body> <

막대기 개수를 세서 하는건 아닌 거 같고 다른 방법이 있는지 모르겠지만 나는 컨트롤 + f로 문자열들을 찾아갔다.
결국 중요한 것은 문자열을 함수로 인식시켜주는 eval과 그 안에서 문자열이 있는지 검사하는 indexOf였다.

찾아본결과 eval("document.cookie")였고 indexOf("oldzombie") 였다 쿠키안에 oldzombie라는 문자열이 있는지 검사하고 없으면 bye를 출력하고 stop해버리는 것이었다.

그 밑 조건문은 url에 mode=1이라는 문자열이 있는지 검사하는 내용이었다.

자 그럼 알아낸 것을 토대로 바로 밑처럼 해보았다.


조건문을 다 무시하면서 아래와 같이 폼이 나왔다.

내가 바보같았던 것은 이게 로그인폼이라고 착각해서 sql인젝션을 시도하는 행동들을 했다.

그리고 아래처럼 나의 계정으로도 로그인 해보았지만 별 소용이 없었다.

그래서 혹시 admin계정으로 로그인하는 건가 하고 아래와 같은 쿼리도 써보았다.

역시나 되지 않았고 아래처럼 admin을 해보았다.
비밀번호도 아무 숫자나 채워서 쿼리 전송을 해보았는데

id가 이미 존재한다고 아래처럼 떴다.
이 때 아 이곳이 join.php이구나 를 깨달았다.

회원가입을 하는 곳이었다.

그래서 이전에 코드를 유심히 살펴보았다.

그 전에 아래와 같은 인젝션도 시도했다 ..

무튼 코드에서 아주 중요한 부분을 발견했다.
max_length가 20인 것이다.
예전에 어디선가 공백으로 오버플로우를 내서 우회를 할 수 있다는 걸 들은 적이 있었다.

그래서 아래와 같이 패킷을 잡아 admin뒤에 공백으로 채웠다.

허나 실패했다.
왜 실패했나 했더니 admin뒤에 공백이었기 때문에 여전히 admin으로 서버는 인식했다.
맨 뒤에 아무 문자나 넣어줘야 admin~ 으로 인식하고 브라우저에서 max_length=20이기 때문에 ~를 잘라서 admin으로 회원가입 성공을 시켜주는 것이었다.

그래서 아래와 같이 공백을 약 30자 채우고 맨 뒤에 1을 붙여줬다.

그랬더니 아래처럼 성공적으로 sign up이 된 것을 볼 수 있었다.

다시 login.php로 가서 만든 아이디 비번으로 login 해보았는데

성공적으로 로그인이 되어 클리어 할 수 있었다.
하지만 깜빡하고 그 부분을 캡처하지는 못했다.
아무튼 해결되었다.

profile
개발/보안

0개의 댓글