반응형

 

문제를 보면 다음과 같이 또 DB 모양이 있다.

 

이번 문제도 SQLi 문제일까? 하는 생각에 문제를 클릭해보자.

 

 

문제를 클릭하면 다음과 같이 LoginJoin 창이 보인다.

 

Login을 눌러보자.

 

 

Login을 눌르면 이렇게 IDPW를 입력하는 창이 나온다..

 

별다른 정보가 없기 때문에 페이지 소스를 보았다.

 

 

페이지 소스 보기를 봐도 별 다른 정보가 없어서 test/test를 입력해보았다.

 

 

 

test/test을 입력하고 login을 클릭한 결과 Wrong password라는 문구와 함께 다시 login 폼이 보인다.

 

IDPW를 알아내기 위해 IDPWSQLi를 수행보았지만 별다른 반응이 없었다.

 

따라서 이번 문제를 풀기 위해서는 계정을 알아야할것같았다.

 

따라서 제일 처음으로 돌아와 Join을 눌러보았다.

 

 

Join을 눌러 보니 Access_Denied이라는 문구와 함께 Join을 할 수 없게 되어있다.

 

페이지 소스에서도 아무런 정보도 찾을 수도 없고, ID, PWSQLi도 안먹히고..

 

그 다음 할 것이 없어 URL 주소를 보았다.

 

로그인 화면의 URL은 다음과 같다.

 

https://webhacking.kr/challenge/web-05/mem/login.php

 

우리는 할 수 있는 시도를 다 해보았고 문제에 힌트가 될 정보가 없기 때문에

 

https://webhacking.kr/challenge/web-05/mem를 입력하여

 

디렉토리 인덱스 취약점이 있는지 살펴보았다. 

 

여기서 말하는 디렉토리 인덱스 취약점을 짧게 정리하면 다음과 같다.


웹 애플리케이션을 사용하고 있는 서버의 미흡한 설정으로 인해 인덱싱 기능이 활성화 되어 있을 경우

공격자가 강제 호출을 통해 서버내의 모든 디렉터리 및 파일에 대해 접근이 가능하며

웹 애플리케이션 및 주요 정보가 노출될수 있는 취약점이다.


https://webhacking.kr/challenge/web-05/mem를 입력하니 디렉토리 인덱스 취약점이 발견되었다.

 

 

여기서 우리가 원하는 페이지인 join.php 페이지를 볼 수 있다.

 

join.php 페이지를 클릭해보자.

 

 

클릭하니 bye라는 문구와 함께 검은색 창만 보인다.

 

뭐지??하고 맨날 보았던 페이지 소스를 보았다.

 

 

script 태그에 이상한 script가 존재하였다.

 

원래의 보통의 script가 아니였기 때문에 이게 힌트일 것 같았다.

 

HTMl 소스코드를 가독성 있게 보면 다음과 같다.

 

<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='>';

...... 생략 ........

</script>
</body>

</html>

 

뭔가 딱 보자마자 바로 느낌이 왔다.

 

치환이다!!

 

예를 들어보자.

 

l='a';

 

말 그대로 l은 a이다. 

 

생략한 코드를 치환하면 다음과 같다.

 

<html>
<title>Challenge 5</title></head><body bgcolor=black><center>
<script>


...... 생략 ........

if(eval(document.cookie).indexOf(oldzombie)==-1) 
{
    alert('bye');
    throw "stop";
}

if(eval(document.'U''R''L').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='+id+' maxlength=20></td></tr>');
    document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name='+pw+'></td></tr>');
    document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');
}
</script>
</body>
</html>

 

이렇게 위의 코드처럼 치환하면 문제를 풀 수 있을 듯하다.

 

코드를 분석해보자.

 

 

위의 코드는 현재 cookie값 중에 oldzombie 라는 값이 있는지 체크하는것이다.

 

즉, 현재 cookie값 중에 oldzombie가 없다면 bye라는 문구와 함께 alert창을 볼 수 있다.

 

따라서 먼저 이 부분을 우회를 해야할것같다.

 

따라서 cookie 이름은 test, 값은 oldzombie를 설정하는 명령어로 cookie값을 설정해보았다.

 

 

그리고 다시 join.php 페이지에 접속해보았다.

 

 

아까와는 달리 access_denied라는 문구를 볼 수 있다!!

 

그럼 그 아래의 코드 또한 우회 해주면 된다!!

 

document.URL 값은 다음과 같이 'https://webhacking.kr/challenge/web-05/mem/join.php' 값이다.

 

 

근데 위의 소스코드에서는 oldzombie처럼 mode=1이 있는지 확인하는것이다.

 

따라서 https://webhacking.kr/challenge/web-05/mem/join.php/mode=1를 입력해보았다.

 

 

이처럼 Join 할 수 있는 폼이 생겼다.

 

여기서 JoinIDPW를 입력하고 제출 버튼을 눌러보자.

 

 

 

이제 Login.php에 접속해서 가입한 정보로 로그인을 해보자!

 

 

이렇게 로그인은 된다.

 

하지만 admin이 아니라는 문구가 뜬다.

 

따라서 이 문제의 출제 의도는 admin으로 로그인을 해야 한다는 것이다.

 

그럼 다시 Join.php에서 admin으로 가입해보자.

 

 

 

????

 

이미 admin이라는 계정이 존재한다.

 

하지만 이번 문제는 admin으로 로그인을 해야 한다.

 

앞에서 로그인 화면에선 SQLi가 통하지 않았기 때문에 이번 문제는 Join.php에서

 

admin으로 가입을 해야한다.

 

가입할때의 패킷을 보자.

 

다음과 같다.

 

id와 pw라는 파라미터로 입력한 admin123POST 형식으로 서버로 넘어간다.

 

예전에 학교 다닐때 DB에 저장될때 띄어쓰기나 공백이 들어가면 저장되는 형태에 따라서

 

'admin'과 'admin '이 같다는걸 배운적이 있다.

 

따라서 id값에 'admin' 대신 'admin '로 서버로 보내봤다.

 

그 후 로그인을 해보았다.

 

 

기억을 더듬어 문제는 풀었는데 정확하게 기억이 나지 않아서 찾아보았다.

 

https://techblog.woowahan.com/2559/ 여기서 정말 자세히 설명이되어있다.

 


쉽게 정리하자면 mysql DB에서는 'a'와 'a ' 또는 ' a'는 같다라고 인식을 한다.

 

즉, 공백이 있어도 같은 문자나 문자열이라고 인식을 한다는것이다.

 

하지만 이건 DB에 저장될때의 자료형이 CHAR일때만 가능하다.

 

비교하려는 두 문자열의 길이가 다른 경우

 

짧은 쪽에 공백을 이어붙여 길이를 똑같이 만든 다음 비교하기 때문에 발생하는 일이다.

 

이런 식이라면 'admin'와 'admin  '를 비교해도 똑같을 수밖에 없다.


반응형

'웹 해킹 > Webhacking.kr' 카테고리의 다른 글

7. old-07  (0) 2021.11.04
6. old-06  (0) 2021.11.03
4. old-04  (0) 2021.11.01
3. old-03  (0) 2021.10.19
2. old-02  (0) 2021.10.18
반응형

 

4번 문제이다.

 

3번 문제는 DB 모양이여서 SQLi 공격을 이용하면 될것같았지만

 

4번 문제는 뭘 의미하는지 모르겠다.

 

원래 저 모양은 소스코드나 코드를 의미할때 많이 쓰이는 그림인데...

 

일단 문제를 클릭해서 보자.

 

 

클릭하면 초록색 글씨로 어떤 값이 나오고 Passwrod를 입력하는 칸이 나온다.

 

test라고 입력하고 발생하는 패킷을 한번 보자.

 

POST 형식으로 key라는 파라미터 우리가 입력한 test를 볼 수 있다.

 

그 후 페이지 소스를 보니 딱히 뭐 별다른게 없어보인다.

 

따라서 문제에서 주어진 [view-source]를 클릭해서 소스를 보자.

 

 

[view-source]를 클릭하면 해당 문제의 소스코드를 볼 수 있다.

 

php 코드를 보여주는데 핵심은 여기인것 같다.

 

일단 sleep(1)함수가 먼저 보인다.

 

주석으로는 anti brute force가 적혀있다.

 

나는 이 주석을 보고 힌트를 얻었다.

 

일단 굳이 sleep을 준 이유도 없을것이고 주석으로 친절히 anti brute force로 적어준것으로 보아

 

몇번으로 해결된 문제가 아닌거 같았다.

 

그 다음줄을 보자.

 

if문을 크게 2개로 나눠보면 (isset($_SESSION['chall4']) ($_POST['key'] == $_SESSION['chall4']) 로 나눌 수 있다.

 

이 2개가 참이면 solve(4)가 실행되면서 문제를 clear 할 수 있을것 같다.

 

php에서 isset은 $_SESSION['chall4']) 이라는 변수가 설정되어있는지 확인하는 함수이다.

 

다음 우리가 password에 입력한 key값이 $_SESSION['chall4']) 와  &&,

 

즉 같다면 solve(4) 함수를 실행 할 수 있다.

 

그 후 코드를 보자.

 

$hash rand(10000000,99999999)."salt_for_you";

 

위의 코드는 rand 함수를 사용하여 랜덤한 숫자를 만들어내는 함수이다.

 

범위는 10000000 ~ 99999999이다.

 

그리고 뒤에 salt로 "salt_for_you"에가 존재한다.

 

예를들어 rand 함수에서 12345678가 생성되었다면

 

$hash 라는 변수에는 12345678salt_for_you가 저장된다.

 

그 다음은 $_SESSION['chall4'] = $hash;으로 위의 12345678salt_for_you의 값이 해당 변수에 저장된다.

 

마지막 코드는 for문을 돌리는데 12345678salt_for_you 값은

 

sha1 함수를 돌리고 다시 hash 변수에 넣어주고 이걸 500번 반복한다.

 

여기까지 정리해보자면 다음과 같다.

  1. 주석에 anti brute force이 있는걸 보아 한번에 답을 찾을수는 없을것 같다.
  2. 우리가 입력하는 key값 즉 password와 hash값이 같아야한다.

그럼 내가 출제자가 원하는 방향으로 문제를 해결하기위해서는 

 

rand 함수의 범위를 10000000,99999999를 주고 위에 솔트 문장을 짜서 brute force

 

값을 서버로 날려봐도 소용이 없다.

 

sleep 함수도 있고 주석에도 친절하게 anti brute force라고 적혀있으니..

 

조금 생각해보니 문제를 클릭했을때 무슨초록색으로 무슨 값이 나왔었다.

 

총 크기도 20 바이트고.. sha1으로 나온 hsah 값인것같다.

 

 

그러면 저기 나오는 초록색 hsah 값은 총 sha1을 500번 돌린 값이라는걸 알 수있다.

 

하지만 sha1이 처음 실행되는 인자에는 rand 함수에서 12345678가 생성되었다면

 

제일 처음 $hash 라는 변수에는 12345678salt_for_you가 들어간다.

 

그 후 sha1을 500번 돌린 hash값을 변수 $hash에 최종적으로 넣는다.

 

그 값이 우리가 볼 수 있는 초록색 값이고 이것은 

 

즉, 처음 만들어진 12345678salt_for_you이 값을 찾아야하는 문제인것 같다. (Point 1)

 

그럼 이 문제를 풀기위해서는 다음과 같이 생각할 수 있다.

  1. 먼저 문제에서 나오는 해쉬값을 본다.
  2. 그 후 문제처럼 rand(10000000,99999999)를 통해 숫자를 정한다.
  3. 나온 숫자 뒤에 "salt_for_you"를 합쳐준다.
  4. 나온숫자+salt_for_you(ex 12345678salt_for_you)를 sha1으로 500번 돌린다.
  5. 500번 돌린 hash값과 문제에서나오는 hash 값을 비교한다. 
  6. 맞으면 정답은 12345678salt_for_you
  7. 아니면 다시 처음부터 수행한다.

하지만 이렇게 하다보면 webhacking.kr 서버와 세션이 끊어질 수 있다.

 

실컷 답을 찾아 12345678salt_for_you를 입력하려고 할때 로그인을 다시해야한다.

 

그러면 다시 찾아야한다.

 

따라서 이번 문제는 핵심 포인트는

 

rand이 아닌 처음값인 10000000부터 마지막 값인 99999999 까지 값을 미리 사전에 만들어

 

sha1으로 500번 돌린 값을 미리 구해 비교하면 훨씬 빠르다. (Point 2)

 

그리고 모든 10000000~99999999 까지 모든 값을 할 필요도 없다.

 

물론 10000000~99999999 까지 모든 값을 사전에 준비하면 한번에 문제를 풀 수는 있지만

 

어차피 이번 문제는 확률문제이다.

 

따라서 나는 4분의 1인 값인 10000000~25000000만 미리 계산하였다.

 

이렇게 총 만들어진 파일의 용량은 761MB이다.

 

해당 소스는 다음과 같다.

 

이렇게 hash.txt라는 파일을 만든 후  문제에서 주어진 hash값을 파일에서 찾으면 이번 문제는 clear다.

 

 

 

 

반응형

'웹 해킹 > Webhacking.kr' 카테고리의 다른 글

6. old-06  (0) 2021.11.03
5. old-05  (0) 2021.11.01
3. old-03  (0) 2021.10.19
2. old-02  (0) 2021.10.18
1. old-01  (0) 2021.10.18
반응형

3번 문제도 2번 문제와 같이 DB 그림이 있다.

 

따라서 이번 문제도 SQLi를 이용해서 문제를 푸는것 같다.

 

클릭해보자.

클릭해보니 이렇게 이상한 판이 나왔다.

 

처음에는 뭘까?하고 숫자가 입력이 되어있길래 나도 숫자를 입력해야하나? 싶어서

 

빈칸을 클릭해보았다.

 

근데 아래의 5*5만 클릭이 되었다.

 

 

숫자를 입력하는줄알았지만 이렇게 뭔가 규칙을 맞춰야하는것 같다.

 

하지만 아직도 지뢰찾기나 이런 규칙이 있는 퍼즐? 퀴즈? 같은걸 별로 안좋아한다.

 

따라서 위의 그림처럼 그냥 다 클릭하고 solved라는 버튼을 클릭해보았다.

 

solved를 클릭하면 GET 형식으로 다음과 같은 URL로 서버로 요청한다.

 

https://webhacking.kr/challenge/web-03/index.php?_1=1&_2=1&_3=1&_4=1&_5=1&_6=1&_7=1&_8=1&_9=1&_10=1&_11=1&_12=1&_13=1&_14=1&_15=1&_16=1&_17=1&_18=1&_19=1&_20=1&_21=1&_22=1&_23=1&_24=1&_25=1&_answer=1111111111111111111111111

 

그리고 브라우저에서는 다음과 같은 모습을 볼 수 있다.

 

 

여기까지 정리하면

 

총 5*5 빈칸 하나가 의미하는건 URL의 파라미터에 _1, _2 ... 이렇게 표현이 되는것 같다.

 

예를들어 첫번째칸은 파라미터 _1...

 

그리고 클릭을 해서 검은색으로 되면 파라미터 값은 1이 되고 클릭이 안되면 0이 되는것 같다.

 

그리고 5*5이기 때문에 _1,_2...._25를 전부 합친것이

 

answer=1111111111111111111111111로 표현되는것 같다.

 

페이지 소스를 봐도 go()라는 함수가 사용자가 클릭한 칸을 전부 합쳐서

 

문자열로 1111111111111111111111111을 만들어 주는것 같다.

 

그래서 _1과 _2..._25에 SQLi를 수행 보았다.

 

근데 별 다른것이 없었다...

 

마찬가지로 answer에도 SQLi를 수행 보았다.

 

여기서도 별 다른 반응이 없었다.

 

그럼 어떻게 할까?

 

저 퀴즈를 풀어야하나???

 

근데 풀기가 너무 귀찮아서.

 

brute force로 그냥 보내버릴까? 해서 코드를 작성을 해보았다.

 

근데 짜던 도중 생각해보니 표현 할 수 있는 숫자는 0, 1이고 자릿수는 25자리다.

 

그럼 brute force를 수행한다면...  엄청 낭비다..

 

따라서, 퀴즈를 풀어야할것같다...

 

뭐 여러 사이트를 참조하고 문제를 푸는 방법을 익힌 후 문제를 풀고 solved를 눌러보았다.

 

 

이렇게 Clear 했다는 문구와 함께 log를 남기기 위해 이름을 입력하라는 문구가 나오고

 

submit 버튼이 나왔다.

 

따라서 test!!라고 입력을 해보았다.

 

test!!라고 입력해본 결과 입력한 이름 test!!과 아까 퀴즈에서 풀었던 answeriplog처럼 남겨졌다.

 

log을 남기기 위해 submit을 클릭했을때 발생하는 패킷은 다음과 같다.

 

 

POST 형식으로 answer에는 아까 퀴즈에서 푼것이 들어가있으며

 

파라미터 id에는 앞에서 입력한 test!!가 URL 인코딩 되어 있다.

 

여기까지 정리해보자면

 

URL: https://webhacking.kr/challenge/web-03/index.php?_1=1&_2=1&_3=1&_4=1&_5=1&_6=1&_7=1&_8=1&_9=1&_10=1&_11=1&_12=1&_13=1&_14=1&_15=1&_16=1&_17=1&_18=1&_19=1&_20=1&_21=1&_22=1&_23=1&_24=1&_25=1&_answer=1111111111111111111111111

  1. 위의 URL 파라미터에서는 SQLi가 발생하는 곳은 없었다.
  2. 퀴즈를 풀고 나니 log를 남길 수 있는 곳을 찾았다.
  3. log를 남길때 발생하는 패킷에 answer과 id라는 파라미터 2개가 생겼다.
  4. 3번에서 찾은 파라미터 2개에 대해서 SQLi를 수행해보자.

 

이렇게 answer의 마지막에 SQLi를 테스트하기위해 '를 입력하고 서버로 요청해보았다.

 

 

 

이렇게 query error!라는 문구와 함께 오류가 난다.

 

여기다! (Point 1)

 

여기서 SQLi를 수행하면 될것 같다.

 

 

이렇게 answer에 1'+and+1=1#이라고 입력을 해주었다.

 

하지만 이렇게 빈 페이만 나온다.

 

쿼리가 오류이면 분명 query error!라는 문구가 보일 것인데 보이지가 않았다.

 

다음은 answer에 1'+and+1=0#을 입력해보았다.

 

1'+and+1=1#나 1'+and+1=0#이 해당 쿼리를 만들어낸 과정은 다음과 같다.

 

  1. 원래의 answer 끝에 '를 삽입하자 query error!라는 문구가 보임.
  2. 따라서 여기서 SQLi를 수행.
  3. '를 삽입했으니 원래의 정상적인 쿼리 마지막에는 '가 한개가 남음.
  4. 이 마지막 한개의 '를 처리하기 위해 주석인 #을 추가함.

 

결과는 또 빈페이지...

 

뭘까? 하고 생각을 해보았다.

 

log에서는 3개를 볼 수있었다.

 

입력한 이름(id)와 answer 마지막으로 ip 이렇게 3개를 볼 수 있었는데

 

내가 입력한 answer 1'+and+1=1#, 1'+and+1=0#이 잘 먹힌지를 보기위해서는

 

먼저 log에 answer1이라는것을 먼저 등록을 해주어야 참/거짓의 반응을 살펴 볼 수 있을것 같다.

 

이렇게 answer에 1을 넣고 id에는 test를 넣고 먼저 서버로 보내 log를 남겼다.

 

서버에서는 쿼리상에 문제가 없기 때문에 이렇게 log를 남겨준다.

 

이제 다시 answer1'+and+1=1#, 1'+and+1=0#이 잘 먹히는지 살펴보자.

 

 

위의 그림에서 answer 부분이 1' and 1=1# and 기준으로

 

왼쪽 오른쪽이 참이기 때문에 위에서 남긴 로그가 나와야한다.

 

이렇게 잘나왔다.

 

이제 1'+and+1=0#를 입력하고 서버로 요청해보자.

 

여기서 만약에 빈페이지가 나온다면 여기서 SQLi를 수행하는것이 확실해 진다!

 

빈페이지가 나오는것으로 보아 여기서 SQLi를 수행하는것이 확실해 졌다.

 

따라서 앞의 문제처럼 DB명의 길이DB명을 알아보자!!

 

코드를 작성하여 DB의 길이를 알아내보니 10자리였다.

 

이제 DB의 길이를 구하고 이제 DB 명을 알아내야한다.

 

근데 가만히 생각을 해보니 이번 문제가 DB명을 알아내고 table명, column명을 알아낼 필요가 있을까?

 

뭔가 위의 과정을 통해 answer라는곳에 SQLi를 하는건 맞는거같은데..

 

flag값처럼 출제자가 원하는 answer라는 값을 알아내야하는건가?

 

그러면 DB명table명, column명을 알아내서 answer라는 값을 알아내야하는건 맞다.

 

근데 answer라는 값을 항상 참으로 만들면???

 

그래서 answer에 아래와 같이 1'or+'1를 넣어봤다.

 

풀렸다...

 

반응형

'웹 해킹 > Webhacking.kr' 카테고리의 다른 글

6. old-06  (0) 2021.11.03
5. old-05  (0) 2021.11.01
4. old-04  (0) 2021.11.01
2. old-02  (0) 2021.10.18
1. old-01  (0) 2021.10.18
반응형

첫번째 문제는 php로 되어있었다.

 

두번째 문제는 DB 그림이 존재하는것으로 보아.

 

 

SQLi 공격을 이용해야할듯하다. (이것 또한 힌트일 수 있다.)

 

2번째 문제를 클릭해서 들어가보면 다음과 같은 문구를 볼 수 있다.

 

 

근데 이게 전부???

 

아무런 기능이 없다...

 

따라서 할 수 있는거는 페이지 소스라도 봐야한다.

 

페이지 소스를 보니 주석으로 admin.php라는 페이지가 있다고 친절하게 알려준다.

 

따라서 https://webhacking.kr/challenge/web-02/admin.php에 에 접속해보자. 

 

접속하면 다음과 같이 볼 수 있을것이다.

 

 

패스워드를 입력하라고한다.

 

여기서도 마찬가지로 페이지 소스를 보았다.

 

위의 페이지 소스를 보아하니 여기서는 딱히 얻을 힌트는 없어 보인다.

 

따라서 처음 문제에서 힌트(DB)를 얻었던것을 생각해 SQLi를 수행보았다.

 

하지만 아무런 반응을 볼 수 없었다.....

 

따라서 다시 처음으로...

 

아무리 생각해도 패스워드를 입력하는곳에서 SQLi를 수행하는것이 맞는거같은데... 하면서

 

혹시 몰라서 쿠키값을 보았다.

 

 

쿠키값을 보니 현재 timestamp가 적혀있다.

 

timestamp값을 알아보니 처음 페이지 소스보기에서 주석처리로 되었던 시간과 똑같이 적혀있었다.

 

따라서 쿠키값을 임의의 숫자인 123456789를 입력하고 다시 페이지 소스보기를 눌러보았다.

 

 

그러니 다음과 같이 페이지 소스에 시간이 반영이 되었다.

 

따라서 여기서 힌트를 얻었다. (Attack Vector)

 

힌트를 조금 알기쉽게 풀어 설명하면,

 

time이라는 쿠키값에 시간이나 어떤 값을 입력하면

 

페이지 소스보기의 시간을 출력(서버의 반응)을 볼 수 있다는 것이다.

 

여기까지의 내용으로 정리하고 가정을 세워보면 다음과 같다.

  1. 해당 문제의 그림에서 DB가 나왔기 때문에 해당 문제는 SQLi를 이용해야한다.
  2. 하지만 어디에서 SQLi가 발생하는지는 알 수 없다.
  3. 패스워드를 입력하는곳에 SQLi 공격을 수행해보았지만 딱히 별다른것이 없다.
  4. time이라는 쿠키값에 사용자가 입력한 timestamp가 반응을 보인다.
  5. time이라는 쿠키값을 가지고 SQLi를 수행해본다.

먼저 true, false 반응이 나오는지 보기 위해서

 

원래의 timestamp 뒤에 and 1and 0을 삽입하여 페이지 소스 보기 살펴보자.

 

예를들어 현재 기준으로 1634532456라는 time이 나와있을때는 참이다.

 

왜냐? 서버에서 미리 쿠키값을 설정했기때문이다.

 

따라서 1634532456 and 1을 넣었을때 이면 페이즈 소스 보기에서의 시간이 나오는 주석에는

 

2021-10-18 01:47:36가 보일것이고 1634532456 and 0,

 

false일때는 2021-10-18 01:47:36가 아닌 다른 값이 나와야한다.

 

만약 1634532456 and 0가 false인데도 2021-10-18 01:47:36가 나온다면

 

true/false를 알 수 없기 때문에 다른 방법으로 찾아봐야할것이고

 

SQLi 공격으로 푸는 문제가 아닐 수 있다.

 

그럼 time이라는 쿠키에 1634532456 and 1를 넣어보자.

 

 

예상했던거와 달리 1634532456 and 1(true)를 입력하니 2021-10-18 01:47:36가 나오지 않고

 

2070-01-01 09:00:01가 나왔다.

 

????

 

그럼 1634532456 and 0(false)인 경우일 때는 어떤지 보자.

 

 

이번에는 2070-01-01 09:00:01이 아니라 2070-01-01 09:00:00가 나왔다.

 

그럼 여기까지 정리를 해보면 true(참)일 경우에는 2070-01-01 09:00:01이 나오고 

 

false(거짓)일 경우에는 2070-01-01 09:00:00이 나온다.

 

그렇다면 time이라는 곳에 timestamp 값 말고 1=1, 1=0 true, false를 입력해도 값을까?

 

넣어보니 같았다. (Point 1)

 

따라서 이것을 기준으로 삼아 SQLi를 수행해보자. 

 

먼저 패스워드를 알려면 DB명도 알아야하고 table 명도 알아야하고 column명도 알아야 하고

 

각각의 이름을 알려면 길이 또한 알아야한다.

 

따라서 갈길이 먼것같다. 그리고 이렇게 푸는게 아직 맞는지도 모르겠다.

 

DB명을 알아내는것으로 해당 문제가 쿠키값에서 SQLi를 진행하는지

 

또한 2번 문제가 SQLi로 푸는건지 판단할 수 있을것 같다. 

 

일단 해보자.

 

일단 DB 길이를 알아내기 위해서 length(database())=DB 길이를 이용할 것이다.

 

EditThisCookie에 하나 하나 대입하는것보다 그냥 코드로 짜서 돌리는게 편할것같아 코드로 돌려버렸다.

 

코드로 DB의 길이를 알아보니 6자리임을 알 수 있었다.

 

자리수를 알아냈으니 DB명을 알아보자.

 

코드를 작성해서 알아본 결과 DB명은 다음과 같이 chall2라는것을 알 수 있다.

 

DB명을 알아냈으니 이제 테이블 구조를 살펴보자.

 

먼저 chall2이라는 DB에 몇개의 테이블이 있는지 테이블의 길이를 구해보자.

 

테이블 길이와 테이블 명, column 길이와 명을 알아내는 방법은 여기(클릭)에 가서 참고하자!

코드를 작성한 결과 0번째 테이블의 길이 즉, 첫번째 테이블은 13자리, 2번째 테이블 길이는 3개이다.

 

나머지는 1로 보아 1번째, 2번째 테이블에 우리가 원하는 패스워드 값이 있을것이라고 추측해본다.

 

따라서 먼저 첫번째 13자리의 테이블명을 알아보자.

 

13자리의 테이블명은 admin_area_pw이다.

 

여기에 우리가 원하는 패스워드가 있을것같다.

 

테이블 명을 알았으니 이제 admin_area_pw의 존재하는 column갯수길이이름을 알아야한다.

 

먼저 column의 갯수는 1개이다.

 

길이는 2자리이다. (뭔가 느낌상 column명이 pw인것 같다.)

 


역시 코드를 작성해서 실행해본 결과 컬럼명이 pw로 나왔다.

 

이제 해당 pw를 알아내면 끝이다!!

 

pw를 알아내기 위해서는 길이를 먼저 알아야한다.

 

이렇게 총 길이는 17자리이다.

 

이제 pw의 값을 알아보자!

 

코드를 작성해서 돌려본 결과 다음고 같이 pw값이 나왔다.

 

위의 pw값을 https://webhacking.kr/challenge/web-02/admin.php에 입력해보자. 

 

 

반응형

'웹 해킹 > Webhacking.kr' 카테고리의 다른 글

6. old-06  (0) 2021.11.03
5. old-05  (0) 2021.11.01
4. old-04  (0) 2021.11.01
3. old-03  (0) 2021.10.19
1. old-01  (0) 2021.10.18
반응형

먼저 old-01 문제를 클릭해서 들어가 본다면 다음과 같은 화면을 볼 수 있다.

 

딱히 다른 기능이 없어 보이므로 view-source를 클릭해보자.

 

 

view-source를 클릭하면 다음과 같은 php 소스 코드를 볼 수 있다.

 

위의 php 소스 코드 중 핵심 코드는 다음과 같다.

 

바로 solve(1); 함수를 실행시켜야지 이번 old-01 문제를 해결 할 수 있을것 같다.

 

solve(1); 함수를 해결 하기 위해서는 3개의 if문을 잘 봐야한다.

 

3개의 if문의 조건절에 COOKIE값이 들어가있다.

 

따라서 이번 문제는 COOKIE 값을 이용해야한다는것을 알 수 있다.

 

editthiscookie를 이용하여 COOKIE값을 보게되면 user_lv이라는 이름을 가진 쿠키의 값이 1이라고 셋팅되어 있다.

 

다시 3개의 if문으로 돌아와 첫번째 if문은 숫자인지 아닌지를 판단하는것 같다.

 

여기서 쿠키값은 문자가 아닌 숫자임을 알 수 있다. (Point 1)

 

2번째 if문에서는 user_Iv값이 4이상이면 다시 user_Iv값이 1로 셋팅된다. (Point 2)

 

마지막 if문에서는 user_Iv값이 3보다 크면 solve(1)를 실행 시킨다. (Point 3)

 

3개의 힌트를 조합해보면 user_Iv값은 숫자이며 3보다는 크고 4보다는 작아야 한다.

 

따라서 3.1~3.9로 user_Iv값을 설정해주면 solve(1) 함수가 실행되며 문제를 clear 할 수 있다.

 

반응형

'웹 해킹 > Webhacking.kr' 카테고리의 다른 글

6. old-06  (0) 2021.11.03
5. old-05  (0) 2021.11.01
4. old-04  (0) 2021.11.01
3. old-03  (0) 2021.10.19
2. old-02  (0) 2021.10.18
반응형

오늘은 Galaxy S6를 루팅 해볼 것이다.

 

루팅 하는 이유는 모의해킹 진단 시 필수로 갖추어야 할 환경이다.

 

무조건 테스트 단말기를 구입해서 진행하는 것이 좋다.

 

루팅에 대한 문제점은 다른 블로그가 많으니 이에 따른 불이익은 책임지지 않는다.

 

먼저 루팅을 위해서는 총 4가지 파일이 준비되어있어야 한다.

 

1. 해당 단말기의 통신사와 일치하는 펌웨어

2. TWRP

3. Magisk

4. Odin

 

이렇게 총 4가지가 필요하다.

 

위의 4가지 파일을 정리하자면 다음과 같다.

 

1. G920SKSS3ETJ1 (SKT)

2. twrp-3.3.1-0-zeroflteskt.img

3. Magisk-v23.0

4. Odin3-v3.13.1

 

이렇게 준비해주면 된다.

 

(만약 위의 환경과 맞을 시 댓글을 남겨주시면 공유해드리겠습니다.)

 

위의 파일 중 먼저 테스트 단말기에서 설정을 해주어야 한다.

 

밑에서 이제 설명할 것인데 그림들을 일부러 크게 캡처하였다.

 

하나하나 잘 읽어보도록 하자.

 

 

1. 단말기 설정

 

먼저 설정에 들어가서 제일 밑에 있는 디바이스 정보를 눌러준다.

 

 

그 후 소프트웨어 정보를 클릭해준다.

 

 

그리고 빌드번호를 7번 눌러주면 개발자 모드가 활성화된다.

 

 

뒤로 가기로 다시 설정으로 돌아오면 밑에 개발자 옵션이 새로 생긴 것을 볼 수 있다.

 

개발자 옵션을 클릭해서 들어가 보자.

 

 

개발자 옵션에 들어가면 밑으로 내려가다 보면 USB 디버깅 옵션이 나오는데 이것을 활성화시켜주자.

 

 

 

여기까지 하면 단말기 설정은 끝이다.

 

원래 OEM 해제를 해주어야 하지만 Galaxy S6에는 없다.

 

따라서 USB 디버깅만 활성화해주면 된다.

 

그런 다음 Galaxy S6의 경우는 전원을 꺼준

 

홈버튼이 있는데 홈버튼 + 음향(-) +전원 키를

 

몇 초 누르다 보면바로 다운로드 모드로 들어가 주어야 한다.

 

adb 명령어로는 다음과 같이 입력해도 된다.

 

 

위의 2개의 방법 중 편한 하나를 선택해서 다운로드 모드로 진입해주자.

 

다운로드 모드로 진입하면 다음과 같은 화면을 볼 수 있다.

 

 

 

2. 펌웨어 설치

 

이제 다운로드가 되었으면 펌웨어 설치를 해주어야 한다.

 

이 상태에서 PC와 단말기를 USB로 연결하여 odin을 실행시켜준다.

 

그 후 펌웨어를 하나씩 올려주어야 하는데 펌웨어는 총 4개의 파일로 구성되어있다.

 

 

AP, BL, CP, CSC로 구성되어 있는데 밑의 그림처럼 odin의 BL, AP, CP, CSC 항목

 

차례대로 하나씩 넣어주자.

 

펌웨어 파일을 넣어주기 전 Options에 들어가 "Auto Reboot"를 꼭 해제해주자.

 

 

 

위의 그림처럼 펌웨어 파일을 넣어준 후 Start 버튼을 눌러주자.

 

 

Start를 누르게 되면 이제 펌웨어가 단말기에 새롭게 설치가 된다.

 

이렇게 조금만 기다려주면 다음과 같은 화면을 볼 수 있다.

 

 

이렇게 되었으면 폰에서는 아직까지 다운로드 중...이라는 문구를 볼 수 있는데

 

진행이 안 된 것이 아니라폰을 강제적으로 꺼주어야 한다.

 

폰을 강제적으로 끄는 방법은 음향(-) + 전원 버튼이다.

 

약 7초간 누르면 폰이 강제적으로 꺼진 후 system 설치가 진행될 것이다.

 

그 후 No command라는 문구가 나올 수 있는데 그 이후에 

 

Android Recovey라는 화면이 나온다. (나올 수도 있고 안 나올 수도 있다.)

 

그러면 5번, 6번에 "Wipe data/factory reset", "Wipe cache partition"이라는 것을 전원 버튼으로 클릭하여

 

차례로 5번 Yes, 6번 Yes를 진행해준다.

 

그 후 1번째 "Reboot system now"를 클릭한 후 단말기가 다시 켜지기를 기다리자.

 

 

기다리면 위의 화면처럼 진행해주면 된다.

 

3. TWRP 설치

 

다음은 이제 TWRP를 설치를 해주어야 한다.

 

이는 Magisk라는 루팅 애플리케이션을 설치하기 위해서이다.

 

다시 1. 단말기 설정에 들어가서 꼭 USB 디버깅을 설정을 해주어야 한다.

 

그 후 다시 다운로드 모드로 들어간다.

 

다운로드 모드로 들어간 후 twrp를 받았던 파일을 odinAP부분에 넣어주자.

 

 

 

이렇게 넣어주고 Start를 눌러준 후 다시 폰을 강제 재부팅을 해주는데 여기서부터가 중요하다.

 

Galaxy S6에서 강제 재부팅을 한 후 화면이 꺼진 후

 

바로 홈 버튼 + 음향(+) + 전원 버튼을 누르고 있어야 한다. (중요!!!!!)

 

그러면 다음과 같은 twrp 리커버리지 화면을 볼 수 있다.

 

 

 

4. Magsik 설치

 

이제 리커버리지 화면에서 "Swipe to Allow Modifications"를 옆으로 스와이프 해주자.

 

 

그 후 "Wipe"를 클릭해주자.

 

 

위의 그림에서는 잘 보이지 않지만 "Format Data"를 클릭해주자.

 

 

그 후 "YES"를 입력해준다.

 

 

Yes를 누른 후 화면에서... done이라는 문구가 나오면 된다.

 

그 후 단만기를 USB로 PC에 연결하여 파일을 옮겨준다.

 

 

단말기를 PC에 연결하면 Internal Storage가 보이는데 거기에 위의 두 파일을 넣어준다.

 

(해당 파일도 필요시 댓글로 요청하면 공유해드리겠습니다.)

 

그 후 위의 Up A Level을 클릭 후 sdcard로 들어가 준다.

 

 

sdcard에 들어가면 아까 PC에서 단말기로 옮긴 2개의 파일이 보인다.

 

차례로 설치해주자.

 

 

 

똑같이 Magisk도 설치해준다.

 

 

 

 

이렇게 설치를 다 끝나면 위의 Reboot System을 눌러 다시 폰이 켜질 때까지 기다리자.

 

 

 

5. Magisk 실행

 

폰이 부팅되면 위의 Magisk라는 애플리케이션이 설치되어있다.

 

클릭하면 다음과 같은 문구를 볼 수 있고 확인을 눌러주자.

 

 

 

 

이렇게 설정한 후 설치를 클릭하여 Magisk를 설치해주자.

 

 

 

 

 

이제 Magisk 애플리케이션에 다시 들어가면 다음과 같은 문구를 볼 수 있는데 확인을 눌러주고

 

재부팅을 하면 Rooting이 성공한 것이다.

 

 

 

반응형

'모바일 해킹 > AoS' 카테고리의 다른 글

[Android] NDK란??  (0) 2022.03.09
[Android] Frida 설치  (0) 2022.01.23
Byte Code & Binary Code  (2) 2021.11.09
Android Penetration Testing - Setup  (2) 2021.01.11
Android Penetration Testing - Introduction  (0) 2021.01.11
반응형

아나콘드를 이용하면 파이썬에세 다양한 가상환경을 손쉽게 만들 수 있으며

 

버전에 따른 각종 다양한 이슈를 해결 할 수 있다.

 

 

1. 다운로드 및 설치

 

아나콘다 설치 파일을 다운 받자. (클릭

 

 

자신에게 맞는 환경을 선택해서 설치하면 된다.

 

다른 설치 프로그램처럼 Next만 누르면서 진행하면 된다.

 

하지만 밑의 2개만 확인하고 체크를 하고 넘어가자!

 

 

 

이렇게 하면 설치는 다 끝났다.

 

 

그 후 파이썬을 버전별로 설치 할 수 있다.

 

 

하지만 2점대는 아래와 같은 명령어로 설치해야 한다.

 

conda create -n py27 python=2.7 anaconda

 

2점대 실행은 다음과 같이 명령어를 입력하면 된다.

 

activate py27

 

 

반응형

'기타' 카테고리의 다른 글

[Anaconda] Frida 설치  (0) 2022.01.23
[Java] 자바 JR 설치  (0) 2021.11.06
[Web-proxy] 피들러(Fiddler) 설치 및 사용법  (0) 2021.11.06
[Python] 파이참(Pycharm) 설치  (0) 2021.11.06
Apache 및 PHP 연동  (0) 2020.12.08
반응형

먼저 안드로이드의 Pentesting를 배우기 위해서는 환경을 Setup 해줘야한다.

 

먼저 준비물이다.

 

3가지만 있으면 된다.

 

루팅된 테스트 폰과 PC와 테스트 폰과 PC가 연결 할 수 있는 선만 있으면된다.

 

다른것도 있지만 그건 설치만 하면된다.

 

우선 PC와 테스트용 모바일 폰이 연결이 되어야하며 PC에서 폰으로 명령어를 내리기 위해

 

ADB를 설치해주어야한다.

 

ADB란?

 

Android Debug Bridge의 약자로, Android를 위한 Debugging Tool이다.

 

주로 Debugging 용도로 사용되며 쉽게 설명하자면 PC에서 Android 기반의 Device와 연결하여

 

PC에서 보다 쉽게 Debugging 하기 위해 사용된다.

 

설치는 다음 주소에서 한다. (클릭)

 

 

Windows용을 다운받아 알집을 풀어주자.

 

압축을 풀면 platform-tools 폴더와 함께 다음과 같은 파일이 보일 것이다.

 

 

이제 cmd창에서 adb를 사용하기 위해 환경 변수를 설정해 줄것이다.

 

 

윈도우키를 누르고 "환경" 이라고 검색하면 시스템 환경 변수 편집이 있다.

 

 

여기서 환경 변수를 클릭한다.

 

 

클릭한 후 Path라는 것을 더블클릭하여 아까 설치한 platform-tools 폴더 경로를 입력해주자.

 

 

그 후 cmd 창을 열어 adb라고 입력 해보자.

 

이렇게 adb가 실행되면 PC와 테스트용 단말기가 연결이 가능하다.

 

pc와 테스트용 단말기를 연결하여 adb shell을 입력해보자.

 

이렇게 여러가지 명령어를 cmd 창을 통해 명령 할 수 있다.

 

일단 diva-beta.apk를 설치 해준다. (댓글로 요청시 보내드리겠습니다.)

 

설치 하면 zip 파일 형태인 diva-beta.apk가 보인다.

 

 

해당 경로에서 cmd 창을 열어 adb install diva-beta.apk를 입력해준다.

 

 

위의 명령어는 adb로 apk를 install 설치 한다는 의미이다.

 

이렇게하면 테스트용 단말기에 diva.apk가 설치된다.

 

그리고 pc에서 알집으로 diva-beta.apk를 풀어보자.

 

알집으로 푼 AndroidManifest.xml 파일을 에디터로 열어보자.

 

 

이렇게 알 수 없는 값으로 보인다.

 

그 이유는 APK가 컴파일 된 후 바로 알집을 풀었기 때문에 컴파일된 코드이다.

 

따라서 우리가 눈으로 읽을 수 없다.

 

AndroidManifest.xml 코드를 읽고 싶다면 Decomplie 과정을 진행해야한다.

 

Decomplie 과정을 진행하기 위해서는 apktool이나 JEBDecomplier tool을 사용한다.

 

apktool이란 대표적인 안드로이드 애플리케이션(Android Application) 대상의 리버스 엔지니어링 도구이다.

 

APK 파일을 분석하여 리소스를 뽑아낼 수 있고(디코딩), 코드를 수정하여 다시 재빌드(Rebuild)할 수도 있으며

 

실제로 XML, 이미지 파일, .dex 파일을 포함하여 안드로이드 앱의 주요 소스를 뽑기 위해 가장 많이 사용되고 있는 Tool 중 하나이다.

 

JEB 또한 apktool과 같은 리버스 엔지니어링 도구라고 생각하면 된다.

 

apktool은 여기서 다운로드 받을 수 있다. (클릭)

 

apktool로 Decomplie을 진행 할 때 다음과 같은 명령어를 입력한다.

 

java -jar apktool_버전 d diva-beta.apk

 

 

또한 JEB로 apk를 Decomplie할 때는 JEB에 Decomplie을 원하는 apk를 드래그하면 된다.

 

 

이제 AndroidManifest.xml가 Decomplie 되어 우리가 소스를 다시 분석할 수 있다.

 

 

위의 과정은 우리가 Source Code Level에서 분석할 때 주로 쓰이는 방법이다.

 

이제 App과 서버단에서 통신을 할 때 어떤 데이터를 주고 받는지 분석하기 위해

 

Android Traffic를 잡는 방법을 알아보자.

 

Android Traffic를 잡기 위해서는 Web-proxy를 사용한다.

 

Web-proxy로 대표적으로 burpfiddler가 있다.

 

burp에 대해서는 많은 포스팅이 되어 있으므로 이번에는 fiddler로 기준으로 설명하겠다.

 

fiddler를 설치하고 Tool-Options-HTTPS 탭에가서 밑에처럼 박스를 체크한다.

 

체크할 때 시스템에 인증서를 설치하는데 다 Yes를 눌러주자.

 

 

그 후 Connections 탭에가서 Allow remote computers to connect 박스를 체크를 해주자.

 

그 후 테스트용 폰으로 들어가서 PC의 ip 주소:8888를 입력한다.

 

 

그 후 fiddler 인증서를 테스트 단말기에 설치 해준다.

 

설치 한 후 테스트용 단말기에서 WiFi 항목에서 PC와 같은 네트워크 대역에 있는 WiFi을 클릭 한 후

 

고급탭에서 프록시를 자동에서 수동으로 변경한다.

 

변경 후 프록시 호스트 이름에 PC의 IP를 입력해주고 프록시 포트에는 8888로 입력 후 저장을 누른다.

 

 

 

 

그 후 fiddler에서 보면 테스트 단말기에서 전송되는 패킷을 볼 수 가 있다.

 

여기까지가 DIVA를 풀기 위한 전체적인 Setup 과정으로 보면 되겠다.

반응형

'모바일 해킹 > AoS' 카테고리의 다른 글

[Android] NDK란??  (0) 2022.03.09
[Android] Frida 설치  (0) 2022.01.23
Byte Code & Binary Code  (2) 2021.11.09
Android Penetration Testing - Rooting (Galaxy S6)  (5) 2021.08.27
Android Penetration Testing - Introduction  (0) 2021.01.11
반응형

이번 포스팅 부터는 안드로이드의 Pentesting의 기초에 대해서 배워보자.

 

앞으로 Android 애플리케이션 분석을 시작하는 방법과

 

취약한 애플리케이션 DIVA의 다양한 취약점을 다루는 방법에 대해서 배워 볼 것이다.

 

DIVA는 취약하게 만들어진 Android 애플리케이션을 의미하며

 

기초와 개념을 익히도록 만들어진 애플리케이션을 의미한다.

 

앞으로의 포스팅에서 다룰 몇가지 중요한 것을 살펴보자.

 

1. 애플리케이션 분석 하기 위해 소스 코드를 얻는 방법을 배울 것이다.

 

2. 1번에서 얻은 소스코드에서 취약점을 찾는 방법을 배울것이다.

 

3. apk을 decompiling 하는 방법과 apk을 unzipping의 차이점을 배울것이다.

 

4. kali vm에서 모바일에서 발생되는 트래픽을 분석하는 방법을 배울 것이다.

 

5. 앞으로 다룰 취약점은 다음과 같다.

     i. Insecure Logging

     ii. Hardcoding Issues

     iii. Insecure Data Storage

     iv. Input Validation Issue

     v. Access Control Issue

반응형

'모바일 해킹 > AoS' 카테고리의 다른 글

[Android] NDK란??  (0) 2022.03.09
[Android] Frida 설치  (0) 2022.01.23
Byte Code & Binary Code  (2) 2021.11.09
Android Penetration Testing - Rooting (Galaxy S6)  (5) 2021.08.27
Android Penetration Testing - Setup  (2) 2021.01.11
반응형

지금 연습하고 있는 웹 해킹 사이트 Coding의 마지막 문제이다.

 

문제를 보자.

 

뭐 문제가 "spam checker"라는 문구와 함께 이상한 문자와 입에 입력하는 값이 있다.

 

그대로 복사해서 제출해보자.

 

Timeout이다...

 

뭔지 몰라 해당 페이지의 소스 코드를 보자.

 

 

중요하게 봐야할 것은 setTimeout가 있다.

 

이것을 보아.

 

2초안에 해당 페이지에서 저 값을 시간 내에 입력을 해야하나? 라는 생각이 들었다.

 

이 문제는 쉽다.. 따라서 코드는 따로 업로드 하지 않겠다.

 

저 위의 값만 2초안에 입력하면 끝이다.

 

이것으로 풀고 있던 웹 모의해킹 사이트의 coding 문제를 다 풀었다.

 

(혹시 다른 웹 해킹 사이트 Coding 문제가 있으면 댓글로 알려주시면 감사하겠습니다.)

반응형

+ Recent posts