4. Web Hacking/1. Webhacking.kr
3번 문제 포스팅을 이어 4번 문제를 해결 하려 했지만..감이 안 와서 구글링을 해보았더니 엄청난 리소스가 소요되는 문제라 추후에 풀이를 해보려고 합니다.
그리하여 5번 문제 도전 !!
1. 문제
Login 버튼과 Join 버튼이 보입니다.
2. 풀이
임의의 ID/Pw 입력하니 Wrong password라는 문구가 출력됩니다.
Join 버튼을 누르니 접근이 거부 되었다고 뜨네요..
홈페이지 소스 코드를 확인해보니 login 버튼을 클릭시 move 함수로 인해 mem/login.php 이동되지만
Join 버튼 클릭시 no 함수로 인해 alert 창만 띄우고 끝입니다...
회원가입 후에 Login을 하면 풀리는 것 같습니다만.. 해당 소스만 봤을 때 어떻게 해야 할지 몰라
Directory Listing이 가능한지 확인해봤습니다.
정말 다행이도 web-05/mem 디렉터리 안에 join.php와 login.php가 있습니다.
join.php로 이동을 시도하자 ' bye ' 라는 문구만 나오네요..
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>');}
해당 홈페이지 소스 코드를 보니...난독화가 되어 있는 것 같습니다만
지식이 부족한 해당 문제 풀이를 아주 조금...참고 해보았습니다.
상기 소스 코드를 해독해보니 'oldzombie'의 쿠키값이 없다면 'bye' 출력
URL에 mode=1이 포함되지 않으면 'access_denied' 출력입니다
크롬 브라우저의 개발자 도구를 사용하여 oldzombie를 생성 후 임의의 값을 입력.
그 후 URL 뒤에 mode=1을 넣어주었습니다.
드디어 Join.php의 본 모습이 나타났습니다 !
계정을 생성 후 Login.php로 돌아가 접속을 시도해보니
admin 계정으로 접속을 하랍니다...
admin 계정을 생성하려 하였지만 이미 계정이 기생성 되어 있다네요... brute force 공격을 할 수 도 없고...
곰곰히 생각하다가 가입 페이지지만 일반 웹 사이트의 가입 페이지 처럼 ID, Passwd 형식에 제한이 없을 것이라는 예상을 해봤습니다.
그리하여 admin이라는 ID 앞 뒤로 공백 2개을 추가하여 생성을 시도 하였더니 성공적으로 생성이되었습니다.
생성한 ' admin ' / '1234' 입력 하여 로그인을 시도하니 정상적으로 문제가 풀렸습니다
다소 어려웠던 문제는 아니지만 난독화된 코드에서 벽이 한 번 있어서 아쉬웠고
제 힘으로 100% 풀이를 못 했다는게 살짝 아쉬웠습니다..
감사합니다 !
페이지 소스를 보니 별다른 힌트는 없는 것 같습니다.
2. 퍼즐 풀기
퍼즐을 해결하니 아래 이미지와 같이 값을 제출하는 웹이 출력됩니다.
제가 적은 임의의 값과 answer 값 그리고 제 IP가 출력되었습니다.
answer의 value 값이 '1010100000011100101011111' 고정 되어 있는 걸 확인 할 수 있습니다.
URL 끝에 answer 값이랑 해당 페이지의 hidden으로 감춰져 있는 value 값이랑 동일 하였고
임의로 수정 해본 결과
No! 라는 문구가 출력되면서 다시 노노그램 첫 화면으로 돌아갑니다.
이러한 점을 봤을 때 answer의 value 값이 3번 문제의 힌트인 것 같습니다.
DB 문제이므로 answer의 value 값을 SQL Injection 공격으로 참을 넘겨보겠습니다.
오랜만에 Burp Suite을 이용해보겠습니다 !
먼저 IE 옵션에서 프록시 서버를 활성화 후
임의의 값을 제출 할 때 무슨 값을 제출 하는지 Burp Suite으로 확인해보니
고정된 answer 값 & id 값을 제출합니다.
그리하여 고정된 answer 값을 참으로 바꾸기 위해 'or 1=1-- 값으로 수정 해보았습니다.
아래와 같이 3번 문제도 깔끔하게 Clear 했습니다 !!!
이번 문제는 그렇게 난이도가 있지는 않아서 금방 풀렸던 것 같습니다.
2번째 포스팅에서 컬럼 갯수를 확인하였고 컬럼명의 길이를 구하는 과정에서 막혀 3번째 포스팅까지 오게되었습니다.. 2번째 포스팅 할 때는 죽어도 안 되더니 포스팅 할려고 쿼리문을 삽입해보니.. 잘 되는
5. 첫 번째 테이블의 컬럼명의 길이 구하기구하기
select length(column_name) from information_schema.columns where table_name="admin_area_pw"
테이블의 컬럼 명의 글자 수는 2글자로 확인됩니다.
6. 첫 번째 테이블의 컬럼명 구하기
(select ascii(substring(column_name, 1, 1)) from information_schema.columns where table_name="admin_area_pw")
01:52초가 출력되었네요 01:52 -> 112sec -> ascii 코드 'p'
(select ascii(substring(column_name, 2, 1)) from information_schema.columns where table_name="admin_area_pw")
01:59초가 출력되었네요 01:59 -> 119sec -> ascii 코드 'w'
7. Value의 글자 수 구하기
Value 값의 글자 수는 17글자로 확인됩니다.
앞서 테이블명을 구했던 것 처럼 ascii 코드로 출력하여 패스워드로 추측되는 Value 값을 얻어보려 합니다.
8. Value 값 구하기
select ascii(substring(**, 1, 1)) from ad***********
01:47 -> 107 -> ascii 'k'
select ascii(substring(**, 2, 1)) from ad***********
01:57 -> 117 -> ascii 'u'
select ascii(substring(**, 3, 1)) from ad***********
01:40 -> 100 -> ascii 'd'
...
select ascii(substring(**, 17, 1)) from ad***********
노가다로 17번째까지 하여 Value 값을 구했습니다.
앞에서 구한 Value 값을 admin.php의 Password로 제출 해보겠습니다.
생각해보니 기본적인 웹 해킹에 쩔쩔맨 제 모습이 한심합니다...
다시 한 번 DB에 대해서 공부를 해야겠다는 경각심이 듭니다
다음은 3번 챌린지로 돌아오겠습니다!!!
허접한 글을 봐주시느라 정말 고생이 많으셨습니다
Challenge(old) -2 2번째 포스팅입니다 !~
바로 전 포스팅에는 DB의 정보를 얻기 전 단계까지 포스팅하였는데요.
1. 테이블 갯수 찾기
select count(table_name) from information_schema.tables where table_schema=database()
구문을 사용하여 DB의 테이블 갯수를 찾아보겠습니다. 첫 번째 파트와 똑같이 크롬 브라우저의 개발자 도구를 사용하여 Cookie 값에 상기 구문을 입력하여 주석 처리된 시간의 '초 단위' 부분의 값을 확인 할 것입니다.
테이블의 개수는 2개로 확인이 되네요.
2. 테이블명의 글자수(이름의 길이)
select length(table_name) from information_schema.tables where table_schema=database() limit 0, 1
첫 번째 테이블명의 글자수를 출력하는 쿼리문을 이용해보겠습니다.
OMG...13글자네요...............
3. 첫 번째 테이블의 테이블 명 구하기
select ascii(substring(table_name, 1, 1)) from information_schema.tables where table_schema=database() limit 0,1
첫 번째 테이블명의 길이는 13개 인것을 확인하였기 때문에 테이블명의 첫 글자부터 찾아보겠습니다 !!
주석 처리된 시간에 표시되는 숫자로만 확인 할 수 있기에 ascii 쿼리문을 사용하였습니다.
01:37로 값이 변경되었네요 1분 37초는 97초이니 ascii코드의 97 값인 ' a ' 인걸 알 수 있습니다.
13글자이므로 substring 함수를 사용하여 테이블명을 알아보겠습니다.
select ascii(substring(table_name, 2, 1)) from information_schema.tables where table_schema=database() limit 0,1
01:40 -> 100초 -> ascii 10진수의 100 = ' d '
첫 번째 테이블명은 ad로 시작하여 13글자인 것 같습니다.
Table name = admin_area_pw
4. 첫 번째 테이블의 컬럼 개수 구하기
select count(column_name) from information_schema.columns where table_name="admin_area_pw"
첫 번째 테이블의 컬럼은 1개입니다.
5. 첫 번째 테이블의 컬럼명의 길이 구하기구하기
select length(column_name) from information_schema.columns where table_name="admin_area_pw"
.........정상적인 쿼리문인데 왜 값이 출력이 안될까요....이번 포스팅은 여기까지
저번에 포스팅 했던 1번 항목은 php 관련하여 소스 코드를 분석하여 그나마 쉽게(?) 풀었는데
2번 항목은 아이콘만 봐도 DB 관련 문제인걸로 확인됩니다(DB에 취약한 블로거)
하지만 ! 포기하지 않고 도전 해보겠습니다
역시나..달랑 텍스트만 존재하는 페이지네요.
웹 해킹에 필수적인 개발자 도구를 사용하여 해당 페이지의 소스 코드를 확인 해 봐야 할 것 같습니다
다른 소스는 볼 필요 없이 2번 항목은 빨간색 사각형으로 마킹한 주석 구문이 눈에 띕니다 !
상단의 시간은...무슨 의미인지 모르겠고 하단의 admin.php가 힌트인 것 같습니다.
web-02 디렉터리에 admin 페이지가 확인됩니다.
2번 항목은 올바른 패스워드를 제출해야 풀리는 것 같습니다.
하단 주석에 대한 부분은 풀렸고..상단 주석의 시간(?)이 무엇을 의미하는지 찾아봐야 할 것 같습니다.
2번 항목 admin.php가 아닌 최초의 페이지로 돌아와서 쿠키 값을 확인 해보겠습니다.
!! Time 쿠기가 확인됩니다. 하지만 쿠키 값이 전혀 추측이 안되는 정수네요...
임의적으로 값 변조를 해봐야겠네요
먼저 time 쿠키 값을 1로 변경 해본 후 해당 페이지의 주석이 변경되었는지 확인 해보겠습니다
해당 쿠키 값을 1로 변경 하니 09:00:01 초 단위가 변경되었습니다.
쿠키 값을 10으로 변경하니 초 단위가 '10' 으로 변경되었습니다 !
2번 항목은 쿠키 값을 변경하여 DB에 대한 정보를 얻어야하는 것 같습니다...
쿠키 값을 변경 - 주석 처리된 시간이 변경....
일반적인 SQL Injection으로는 숫자로만 표현되기 때문에 DB 테이블 컬럼 갯수 밸류 값을 확인 못 할 것 같습니다
!! 그럼 참일 때 1로 표현되고 거짓일 때 0으로 표기되는 Blind SQL Injection을 이용하면 어떨까 생각됩니다
최초의 쿠키 값으로 변경되며 주석 처리된 시간도 최초의 시간으로 변경됩니다
Blind SQL Injection을 사용 하려면 참 또는 거짓 일 때 결과 값이 확인되어야 하지만
쿠키 값을 0으로 변경 했을 때 최초의 쿠키 값으로 변경 되기 때문에 SQL Injection을 이용 해보겠습니다.
쿠키 값을 거짓 값(0) 으로 변경 했을 때 09:00:00 초단위가 ' 00 ' 으로 표기 됩니다
이러한 점을 취합하여 추측 했을 때
쿠키 값에 참일 경우 초 단위 '쿠키 값' // 거짓일 경우 = 초 단위 '00' - 표기
Blind SQL Injection 엄청난 노가다를 필요로 하는걸 잘 알기에...........
다음 글에 이어서 적도록 하겠습니다
평소에 웹 해킹에 대해 관심이 있었지만 정작 워게임 사이트 회원 가입만 해놓고 접속을 안 하다가
남는 시간에 1개씩 천천히 풀어보려 합니다.
하기 이미지와 같이 현재 사이트에는 61가지의 도전 항목이 있으며 1번 항목에 대해 포스팅 해보려 합니다.
1번 항목을 누르면 아래와 같이 ' view-source ' 를 클릭하여 web-01 페이지의 소스를 볼 수 있습니다.
1번 항목이다보니 가볍게 풀릴 것 같은 느낌이네요 ~
파란색 사각형으로 마킹 한 소스는 한 눈에 봐도 웹페이지 디자인에 관한 소스 같네요
1번 항목을 해결하기 위해서는 빨간색 사각형으로 마킹 한 소스 구문을 알아봐야 할 것 같습니다.
첫 번째 소스 코드를 보면 전체적으로 if 구문안에 is_numeric(데이터의 값이 숫자인지 확인)함수 내 COOKIE 값을 user_lv로 지정해놨습니다.
2,3행 소스 코드를 보면 COOKIE값인 user_lv이 5보다 크면서 6보다 작아야지 문제가 풀리는 것 같습니다.
그럼 개발자 도구를 사용하여 COOKIE을 임의로 변경 해보겠습니다
크롬 브라우저 기준 F12 Key를 누르면 브라우저 우측에 개발자 도구가 출력됩니다.
수 많은 항목 중에서 Application 클릭 후 Storage - Cookies를 누르면 해당 페이지의 쿠키 값을 확인 할 수 있으며, 소스 코드 내에 있던 user_lv를 확인 할 수 있습니다.
5보다 크면서 6보다 작아야 하기 때문에 그 중에 5.5를 임의적으로 수정 후 새로고침을 해보겠습니다.
손 쉽게 1번 항목 Clear ~
다른 워게임 사이트에 비해 1번 항목부터 php 소스 코드를 분석하여 문제를 풀어야 했습니다...
전부 클리어 못 할 것 같은 느낌이 오네요
구글링을 하면 해당 사이트의 풀이가 많지만 시간이 많이 소비 되더라도 최대한 제 힘으로 풀어보려 합니다
다음엔 2번 항목으로 돌아오겠습니다