[그림 1]

로그인 창과 가입 창이 보인다. 나는 계정이 없으니 가입 부터 눌러보자

[그림 2]

접근이 거부되었다. 로그인 부터 들어가보자

로그인 창에는 들어가진다.

혹시나 해서 admin/admin을 입력해봤다.

[그림 2]

역시나 안된다. guest/guest는? 마찬가지다.

다시 메인 화면으로 와서 코드를 확인해보자

[그림 3]

mem/lognin.php 주소로 로그인 페이지로 이동되는 반면 가입 페이지는 스크립트로 막혀있다.

로그인 페이지가 mem/login.php인걸로 미루어 보아 mem/join.php는 가입 페이지라고 추측해보았다.

이를 url에 입력해보자

[그림 4]

들어오자마자 가란다 그래도 입뺀은 면했다.

가입 페이지의 코드를 한번 확인해보자

[그림 5]

코드를 잘라서 올렸지만 딱 보기에도 더럽다 스크립트 언어를 정리해 주는 방법을 찾아보자

http://jsbeautifier.org/ 이 사이트를 참고해서 정리해보았다.(구글링 하세요 왠만한거 다나옵니다.)

더보기

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)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('Join

');
    document.write('.

.

.

.

.

');
    document.write('

');
    document.write('');     document.write('');     document.write('
id
pass

');
}

음 난잡한 코드를 돌려보았더니 이런식으로 정리가 되었다. | 개수별로 단어를 나타내는 것 이었다.

코드를 해석해보면(python으로 코드짜서 돌려보시길 추천합니다)

[그림 6]

Cookie값으로 oldzombie가 없으면 bye가 출력되고

URL에 mode=1이 들어 있지 않으면 access_denied가 뜬다.

1번 문제 풀때 썼던 editthiscookie로 쿠키값을 만들어주자

[그림 7]

/mem/join.php?mode=1이라고 주소를 입력하고 들어가면

[그림 8]

문제가 또나온다. 

admin/admin, guest/guest를 넣어보자

[그림 9]

admin은 있다고 나오고 guest는

[그림 10]

가입 성공이란다.

로그인 해보자

[그림 11]

admin 접근하여야 flag가 나오는 것으로 보인다.

admin으로 로그인하라는 것으로 보아 admin이라는 문자열을 온전하게 넣는 방법을 찾아봐야 될것 같다.

 

몇 시간 동안 다양한 시도와 고민 끝에 whitespace, 즉 공백을 떠올렸다 넣어보자

여러 시도 끝에 '    admin        ' 공백을 넣은 온전한 admin으로 가입을 성공 시켰다.

[그림 12]

성공했다

 

온전한 admin을 받는다는 사실을 알아내느라 여러 시행착오를, 어떻게 admin을 온전하게 받게 할것인지 고민 하는라 많은 시간을 들였다.

'Challenge > webhacking.kr' 카테고리의 다른 글

Webhacking 7번 문제 풀이  (0) 2020.02.03
Webhacking 6번 문제 풀이  (1) 2020.01.30
Webhacking 4번 문제풀이  (0) 2020.01.29
Webhacking 3번 문제풀이  (0) 2020.01.29
Webhacking 1번 문제풀이  (0) 2020.01.28

4번 문제다 renewal 전에 300점 이하는 다 풀었었는데 어째 요즘에는 300점 중에서도 어려운 게 좀 있는 거 같다.

이번 문제는 푸는데 시간이 좀 걸렸다.(설명 들으면 왜 걸리는 줄 아십니다)

[그림 1]

음 정감 가는 페이지 디자인이다. 난해한 글자들이 적혀 있고 패스워드를 입력해야 되고 소스코드를 볼 수 있다.

느낌상으로는 저 값에 연관된 것을 제출하면 될 거 같다.(바로 넣어봤는데 역시 아니더라...)

[그림 2]

보자 보자... sleep(1); 무작위 대입 공격을 예방하기 위해 넣어뒀다고 주석으로 적어놨다.

밑에 구문들을 해석해보면

chall4의 값을 key값과 비해서 같으면 문제가 풀린단다.

chall4는 1000만부터 9999만 사이 랜덤값과 salt_for_you 값을 sha1으로 500번 암호화 한 값이다.

ex) 12345678salt_for_you --md5 * 50 --> asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf

지금 이 asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf에 해당하는 값이 우리 눈에 표기되는 것이다.

(참고로 세션 종료될 때마다 값이 바뀐다.)

 

md5를 복호화하는 법 아는 사람? 백날 검색해봐라 나오나 절대 안 나온다.

(나오시면 댓글 주세요 저가 배우러 달려갑니다)

 

md5에 대한 것은 직접 찾아서 공부하길 바란다.(참고로 md5로 암호화시키면 40글자 나온다)

 

복호화가 안 되는 암호화일 경우 어떻게 해야 하나? 레인보우 테이블을 만들어야 된다.

레인보우 테이블이란? 해시 함수를 사용하여 만들어 낼 수 있는 값들을 저장한 표이다.

 

코드를 짜서 1000만부터 9999만까지의 평문을 저장해 놓자(세션 종료돼도 저장해두면 만사 OK)

from hashlib import sha1

t=90000001
print("Web hacking cahllenge 4 solution module")
f = open("C:\\Users\Ravidus\Desktop\\webhacking4-9.txt", "w")
while(t <= 99999999):
                testhash = str(t)+"salt_for_you"
                temp = testhash
                for i in range(0, 500):
                    testhash = sha1(testhash.encode('utf-8')).hexdigest()


                result = temp+' '+testhash+'\n'
                f.write(result)
                t += 1
f.close()                
print('finish')

 

이 코드를 사용하여 레인보우 테이블을 만들었다.

한 번에 1000만부터 9999만 까지 돌리면 시간이 오래 걸리기 때문에 나눠서 돌리는 편을 추천한다.

[그림 3]


몇 달 전에 푼 건데 이렇게 정리해뒀다 언제 보고서 쓸지 몰라서...

 

암호문이 보고서 작성 사이 또 바뀌었다...

bbb2e3b3bea48e4afb395ba64b9ff62bd44053bd

1-9까지 표를 보고 평문을 찾아서 값을 넣어주면 문제가 풀린다.(아 이번에도 4-9 맨뒤에서 나왔다...ㅎ....)

[그림 4]

 

레인보우 테이블과 md5에 관한 지식 그리고 코드 작성 능력이 필요한 문제인 거 같다.

'Challenge > webhacking.kr' 카테고리의 다른 글

Webhacking 7번 문제 풀이  (0) 2020.02.03
Webhacking 6번 문제 풀이  (1) 2020.01.30
Webhacking 5번 문제 풀이  (0) 2020.01.30
Webhacking 3번 문제풀이  (0) 2020.01.29
Webhacking 1번 문제풀이  (0) 2020.01.28

자 웹 해킹 3번 문제를 풀어보자

[그림 1]

음 난해한 화면이다..... 빈칸을 클릭해보니 검은색으로 색칠이 된다.

어릴 때 심심하면 풀어본 스도쿠(?) 같은 느낌이 들어 한번 풀어봤다.

[그림 2]

위와 좌측에 적힌 숫자를 참고하여 체크해보니 저런 식으로 표시가 된다. 버튼을 클릭하면 다음 화면으로 넘어간다.

[그림 3]

아무생각 없이 이름을 넣어 보았다..

그럼 안풀릴꺼다 본인도 그랬다.

몇 번을 시도 해도 똑같았다.

name은 입력한 대로 잘 출력되고  value(앞에서 풀었던 스도쿠) 값과 ip주소 값이 변함 없이 같은 값으로 출력된다.

바로 F12를 눌러 코드를 살펴 보았다.

[그림 4]

name에 어떤 값을 넣든 그대로 출력된다 그렇다면 value를 건드려 보자

value에 sql injection을 사용하여 값이 참이 되게끔 만들자

'or 1=1을 넣어 보았다

[그림 5]
[그림 6]

query error가 나온다.

음 거의 다온 거 같다!

 

1010100000011100101011111이 값을 참이 되게 만드는 문제인 거 같다.

혹시나 해서 주석 처리 문도 시도해봤다.

[그림 7]
[그림 8]

마찬가지로 query error가 나왔다.

 

다시 한번 싱글 쿼터를 이용해 1010100000011100101011111이 참이 되게 만들어보자

1.value='1010100000011100101011111'

2.value='1010100000011100101011111' or '1' ='1'

2번처럼 되려면? ' or '1' ='1 이 값을 넣어주면 된다 넣어보자!!

 

[그림 9]

입력값은 내 이름으로 아! 주목해야 될 것은 Element의 value 값이다.

보내주면 submit 하면?

[그림 10]

풀린다!

 

음 이 문제 덕에 sql injection이 text영역에 한정된 것이 아닌 다양한 iput태그에  쓰일 가능성이 있다는 사실을 알 수 있었다.

'Challenge > webhacking.kr' 카테고리의 다른 글

Webhacking 7번 문제 풀이  (0) 2020.02.03
Webhacking 6번 문제 풀이  (1) 2020.01.30
Webhacking 5번 문제 풀이  (0) 2020.01.30
Webhacking 4번 문제풀이  (0) 2020.01.29
Webhacking 1번 문제풀이  (0) 2020.01.28

[그림 1]

 

level표시와 view-source라는 부분이 눈에 띄인다.

view-source를 눌러 소스코드를 확인해 보자.

 

[그림 2]

소스코드가 보이는데 phphtml로 작성되어져 있다.
검은색 글씨로 된 html 코드는 [그림 1]에 보이는 화면을 나타내는 것이기에 신경을 쓰지 않아도 될거 같다.

<?php> php구문을 한번 살펴 보자 ‘../../’ 2개 위에 위치해 있는 ‘config.php’파일을 불러온다(포함시킨다). 그 다음에는 if문으로 조건을 걸어 주었다.

 

{$_GET[‘view-source’] == 1} {view_source(); }

$_GET[‘view-source’] 1이면 소스코드를 보여준다는 구문이다.

이 구문이 정상적으로 실행이 되어 클라이언트인 나에게 코드가 보여지는 것이다.

*이부분은 유사한 형태로 계속해서 나온다. 뒷 풀이에서는 따로 다루지 않겠다.

 

if(!$_COOKIE['user_lv']){

SetCookie("user_lv","1",time()+86400*30,"/challenge/web-01/");

SetCookie 형식을 보면 SetCookie(“쿠키명”, “쿠키값”, “만료시간”,“사용가능 위치”); 로 되어있으면 여기서 user_lv라는 값은 쿠키이름을 나타낸다.

만료시간을 보면 약 한 달로 설정되어있다.(86400 = 60 x 60 x 24 , 24시간)

 

[그림 3]

이번에는 하단의 <?php> php구문을 살펴보자 쿠키값을 본격적으로 검사하는 구문이다.

 

if(!is_numeric($_COOKIE['user_lv'])) 쿠키값이 숫자가 아닐 경우 쿠키값을 1로 설정한다라는 구문이며 is_numeric은 변수 값이 숫자인지를 판별하는 구문이다.

 

기본적으로 쿠키값은 1로 세팅되어져있다.

 

1.if($_COOKIE['user_lv']>=6) 쿠키 값이 6보다 크거나 같을 경우 $_COOKIE['user_lv']=1;

쿠키값을 1로 세팅한다.

 

2. if($_COOKIE['user_lv']>5) 쿠키 값이 5보다 클 경우 문제가 풀리다.

 

위 두 경우가 동시 만족할 때 문제가 풀리도록 설계되어있다.

 

6보다 크거나 같으면 값이 1이 되고 5보다 클 경우 문제가 풀린다. 그렇다면 어떻게 해야될까

56사이에 값이 쿠키값이 되면 문제가 풀린다! [5 < user_lv < 6]

 

그렇다면 쿠키값은 어떻게 바꾸는가? 필자는 chrome 확장프로그램으로 EditThisCookie

를 다운 받아 사용하였다.

[그림 4]

user_lv 값이 1로 나타나는 것을 볼수 있다. 이 값을 56의 사이값으로 바꿔주면 solve!

[그림 5]

난 풀었어서 already solved....

 

이 문제는 Cookie 개념을 위한 문제인거 같다.

'Challenge > webhacking.kr' 카테고리의 다른 글

Webhacking 7번 문제 풀이  (0) 2020.02.03
Webhacking 6번 문제 풀이  (1) 2020.01.30
Webhacking 5번 문제 풀이  (0) 2020.01.30
Webhacking 4번 문제풀이  (0) 2020.01.29
Webhacking 3번 문제풀이  (0) 2020.01.29

+ Recent posts