반응형

1. 문제 설명


 

 

문제도 풀기도 전에 이제 바로 보자마자 SQLi 문제이라는 것을 알 수 있다.

 

클릭해보자.

 

 

Admin page라는 문구와 "auth"라는 버튼과 view-source가 있다.

 

별 다른 기능이 없으니 auth라는 버튼을 클릭해보자.

 

 

"Access_Denied!"라는 문구와 함께 alert가 떴다.

 

다음 시도해볼 수 있는 것이 없기 때문에 view-source를 클릭해 소스코드를 살펴보자.

 

참 소스 코드가 길다...

 

하나 하나 보자.

 

$go=$_GET['val'];

if(!$go) 
{ 
  echo("<meta http-equiv=refresh content=0;url=index.php?val=1>"); 
}

echo("<html><head><title>admin page</title></head><body bgcolor='black'><font size=2 color=gray><b><h3>Admin page</h3></b><p>");

if(preg_match("/2|-|\+|from|_|=|\\s|\*|\//i",$go)) 
  exit("Access Denied!");

$db = dbconnect();

 

$go=$_GET['val'];를 보아 일단 GET 형식으로 서버로 val라는 파라미터 값을 보낸다는것을 알 수 있다.

 

그리고 if문의 조건문에 go라는 값, 즉 사용자로부터 입력 받는 val 값이 없으면 다시 refresh 된다.

 

무조건 어떤 값이던지 넣어야지 다음으로 넘어갈 수 있다는 소리이다.

 

그후 preg_match라는 함수를 볼 수 있다.

 

 

PHP 공식 홈페이지에 보면 친절하게 설명이 되어있다.

 

regular expression을 수행하는 함수이다.

 

문제에서는 인자값이 2개가 들어간다.

 

각각의 인자값은 다음과 같다.

 

 

"/2|-|\+|from|_|=|\\s|\*|\//i"는 패턴을 의미한다.

 

$go는 사용자가 입력한 val 값이 들어가있다.

 

정리하자면 사용자가 입력한 val=go에 패턴 "/2|-|\+|from|_|=|\\s|\*|\//i"

 

매칭이 되는것이 하나라도 있으면

 

exit("Access Denied!");가 실행된다.

 

패턴의 제일 앞에 2가 있으니 2로 테스트 해보자!

 

webhacking.kr/challenge/web-07/index.php?val=2라고 입력해보았다.

 

 

역시 "Access Denied!"라는 문구를 볼 수 있다.

 

그렇다면 어떤 글자가 매칭이 될까?

 

"/2|-|\+|from|_|=|\\s|\*|\//i"

 

일단 regex에서 패턴은 한 쌍의 슬래시(/) 문자 사이에 위치한다.

 

그 다음은 많이 보았던 | -> or이고 \s공백을 의미한다.

 

그 후 보이는 것은 i인데 나도 regex를 많이 사용해보지 않아서 i가 뭔지 궁금했다.


따라서 찾아보았다.

 

 

즉, 입력한 문자열을 패턴으로 검사하는데 검사할때 대/소문자를 구문없이 매칭한다는 말이다.

 

그렇다면 이제 큰 뼈대는 이해를 했고 이제 어떤것이 매칭이 되는지 살펴볼 차례이다.

 

"/2|-|\+|from|_|=|\\s|\*|\//i"

 

(문자를 필터링 하고 싶으면 \를 하나 추가해주어야한다.)

 

이렇게 총 9개의 문자들이 필터링 되어있다.

 

그 다음 DB랑 연결을 한다.

 

여기까지 정리하면 다음과 같다.

 

사용자가 입력한 valgo라는 변수에 넣고 go라는 변수에 담긴 사용자값에서 

 

preg_match 함수를 이용해서 패턴에 매칭이되면 "Access Denied!"라는 문구와 함께 exit가 된다.

 

그럼 일단 무조건 preg_match 함수에 걸리지 않게 val를 입력해야할것이다.

 

다음 코드를 보자.

 

$rand=rand(1,5);

if($rand==1)
{
  $result=mysqli_query($db,"select lv from chall7 where lv=($go)") or die("nice try!");
}

if($rand==2)
{
  $result=mysqli_query($db,"select lv from chall7 where lv=(($go))") or die("nice try!");
}

if($rand==3)
{
  $result=mysqli_query($db,"select lv from chall7 where lv=((($go)))") or die("nice try!");
}

if($rand==4)
{
  $result=mysqli_query($db,"select lv from chall7 where lv=(((($go))))") or die("nice try!");
}

if($rand==5)
{
  $result=mysqli_query($db,"select lv from chall7 where lv=((((($go)))))") or die("nice try!");
}

$data=mysqli_fetch_array($result);

 

그 다음 rand 함수를 통해 1~5까지 수를 rand라는 변수에 넣는다.

 

그 후 총 5개의 if문이 있는데 어느 곳에 들어갈지는 5분의 1의 확률을 가지고 있다.

 

일단 어느 if문에 들어가도 query가 수행하는 행위는 같다.

 

rand1일때를 기준으로 설명하면 다음과 같다.

 

mysqli_query 함수로 DB 핸들러와 쿼리를 인자로 넣어주면

 

DB에 입력한 쿼리로 요청하게 되고 오류 없이 실행되면 true, 에러가 발생하면 false를 반환한다.

 

따라서 true로 실행이되면 쿼리 결과값을 result 변수에 넣는다. 

 

만약 false가 난다면 "nice try!"라는 문구를 볼 수 있다.

 

예를들어 val에 패턴에 없는 문자 ^를 입력해보자.

 

 위의 퀴리는 당연히 error가 날것이며 그렇다면 "nice try!" 문구를 볼 수 있어야한다.

 

 

이처럼 nice try라는 문구를 볼 수 있다.

 

다시 정상적인 SQL문을 살펴보자.

 

만약 별 문제가 없다면 chall7이라는 테이블에 존재하는 lv 컬럼에서

 

사용자가 입력한 값이 존재하면 출력해주는 간단한 쿼리이다.

 

그 다음 코드를 보자.

 

if(!$data[0]) 
{ 
  echo("query error"); exit(); 
}

if($data[0]==1)
{
  echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=\"alert('Access_Denied!')\"><p>");
}

elseif($data[0]==2)
{
  echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=\"alert('Hello admin')\"><p>");
  solve(7);
}

 

만약에 쿼리한 결과값이 없으면 "query error"가 출력되고 exit로 종료가 된다.

 

이제 쿼리한 결과값이 1이냐 2이냐로 나뉘는데

 

1이면 제일 처음에 봤던 "Access_Denied!"이라는 alert창을 볼 수있다.

 

하지만 2이면 "Hello admin"이라는 alert창이 나오면서 solve(7)이라는 함수가 실행되면서

 

문제가 풀릴것이다.

 

따라서 우리가 원하는 최종적인 목표는 쿼리 결과가 2가 나와야 한다는것이다.

 

여기까지가 PHP 소스코드 설명이였다.

 

그럼 문제를 어떻게 풀어야할까?

 

최종적으로 정리하면 다음과 같다.

  1. val라는 값을 무조건 입력해야함.
  2. 총 9개의 preg_match에 걸리지 않게 입력해야함.
  3. rand 함수로 인해 총 5분의 1의 확률을 가짐.
  4. 입력한 val=go가 쿼리상 에러가 있으면 "nice try!"를 볼 수 있음
  5. 쿼리상 문제가 없으면 "query error", alert('Access_Denied!'), alert('Hello admin') 이 3개임
  6. 최종적으로 쿼리한 결과값이 2가 되야함

위의 총 6개의 리스트를 가지고 문제를 풀어보자.

 

 


2. 문제 풀이


 

먼저 최종으로 쿼리한 결과값이 2가 되야한다.

 

 

그러기 위해서는 $go라는 곳에 2를 넣어야한다.

 

하지만 preg_match에 의해 2는 필터링되어 있다.

 

 

근데 위에처럼 정리를 해보니 -,+,*,/가 존재한다.

 

이걸보고 아 사칙연산을 통해 2를 구하는걸 막기위해서 넣은거구나라고 생각이들었다.

 

보안에서 mod는 많이 활용된다.

 

그렇다면 5%3, 11%3mod를 통해서 2가 나오게 하면될것같았다.

 

따라서 11%3val에 넣어 서버로 전송해보았다.

 

 

"query eeror"라는 문구가 보인다.

 

그렇다면 총 5개의 if문에서는 아무런 쿼리 에러가 일어나지 않았으므로 이는 통과한것이다.

 

하지만 왜 정답에서 요구하는 2를 계산해서 $go에 넣었는데 왜 solve(7)이 실행이 안됬을까?

 

생각을 했다.

 

한참을 생각하다보니 조회하는 chall7 테이블에 lv 이름을 가진 컬럼 중 2가 없다는 소리이다.

 

따라서 아래처럼 11%3...을 통해서 저 쿼리문이 실행되고나면 결과값이 2가 나오게 해야한다.

 

또한 chr 함수를 이용해서 2를 표현 할 수 있다.

 

 

하지만 chall7에는 lv2인값이 없다.

 

그렇다고 insert를 할 수도 없고 따라서 union을 사용할 수 밖에 없다.

 


union이란 


 

영어 그대로 합동, 합친다는 의미로 2개의 select문을 합치는것을 말한다.

 

어떤 두 단체가 합병이나 합쳐질때는 서로의 이해관계나 기타 제약 조건이 반드시 따라온다.

 

크게 아래의 3가지로 볼 수 있다.

  1. UNION 내의 각 SELECT 문은 같은 수의 열을 가져야 한다. 
  2. 열은 유사한 데이터 형식을 가져야 한다.
  3. 각 SELECT 문의 열은 또한 동일한 순서로 있어야 한다.

그렇다면 union을 이용해서 2를 출력하게 해보자.

 

위에서 %s로 인해 공백을 사용할 수 없으니 공백의 의미를 가지는 괄호를 이용할것이다.

 

 

일단 처음 select문을 거짓으로 만들어줘야한다.

 

왜냐하면 아무리 첫번때 select문을 2로 만들어도 값이 chall7에는 2가 존재하지 않는다.

 

따라서 첫번째 select문을 거짓으로 만들고 union으로 2번째 select문으로 2를 만들어줘야한다.

 

내가 만들어낸 페이로드는 다음과 같다.

 

 

이것을 조금 더 풀어서 설명하면 다음과 같다.

 

 

앞의 select문은 false로 무시가 되고 뒤의 select문은 쿼리상 문제는 없으니

 

2가 테이블에 없어도 출력이 된다. (이 이유 때문에 union을 사용)

 

출력이 된다는것은 result2가 들어간다는것이고 최종적으로 data[0]에도 2가 들어가

 

solve(7) 함수가 실행이되어 문제가 clear 될것이다.

 

하지만 위에 작성한 페이로는 rand 함수로 1이 된 경우이며

 

해당 if문에 가서 보면 괄호가 한쌍이다. ()

 

따라서 3 뒤에 괄호 1개를 입력한것도 그 이유이다.

 

끝으로 위의 페이로드를 val에 입력해도 정답이 될 확률 또한 5분의 1일것이다.

 

총 3번만의 시도 끝에 clear 했다.

 

반응형

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

9. old-09  (0) 2021.11.08
8. old-08  (0) 2021.11.05
6. old-06  (0) 2021.11.03
5. old-05  (0) 2021.11.01
4. old-04  (0) 2021.11.01
반응형

 

문제를 보면 다음과 같이 또 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
반응형

먼저 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
반응형

하 SQL이 너무 어렵다.

 

그래서 막연하게 쿼리를 짜서 날리는것 보다 눈으로 확인하면서 어떻게 넘어가는지 확인을 하고자 

 

Apache와 PHP를 연동하기로 마음먹었다.

 

근데 Apache버전 8를 설치하는데 자꾸 1067 에러로 실패 하여 Apache 버전 7을 설치했다.

 

다음에도 설치할 일이 생길것 같아 정리를 한다.

 

먼저 윈도우용 PHP와 Apache를 설치해준다. (필요한 분은 댓글로 요청하면 링크를 드리겠습니다.)

 

또한 64비트 윈도우 운영체제이다.

 

1. 먼저 설치는 편하게 C 드라이브 밑에 바로 해준다.

- C:\Apache24

 

2. httpd.conf 설정 파일을 수정해준다.

- httpd.conf 설정 파일에서 ServerName을 자신의 서버 IP 주소에 맞게 설정 ex) ServerName localhost

- httpd.conf 파일은 C:\Apache24\bin에 있다.

 

3. 이제 명령 프롬프트(CMD)를 꼭 관리자 권한으로 실행하여 아파치 서버를 설치 및 등록해준다.

- c:\Apache24\bin>httpd.exe -k install

 

4. services.msc를 실행하여 아파치를 실행 해준다.

- Apache2.4를 클릭하여 시작을 눌러준다.

- 이렇게 하면 아파치 설정과 실행은 끝이다.

- 이제 PHP를 설정해주자.

 

5. 위에서 받은 php도 C 드라이브 바로 밑에 설치해준다.

- C:\PHP

 

6. 압축을 푼 php 폴더에 php.ini-development 파일이 있다 이것을 메모장이나 edit로 열어주자.

- 그런 다음 이렇게 변경해준다.

 

7. 그런 다음 위의 php.ini-development 파일 복사하여  C:\Windows에 복사해준다.

- 굳이  C:\Windows가 아니라 다른곳이어도 상관은 없다.

- 복사한 php.ini-development 파일 이름을 php.ini로 고쳐준다.

 

8. 이제 php.ini과 Apache 서버를 서로 연동시켜준다.

- Apache가 설치 된 폴더에서 httpd.conf 파일을 열어 제일 마지막에 다음과 입력하고 index.php도 추가해준다.

- 그런 다음 c:\Apache24\bin>httpd.exe -k restart 입력

9. 브라우저에서 http://localhost/를 입력

- 아래 처럼나오면 성공.

 

 

반응형

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

[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
[Python] 아나콘다(Anaconda) 설치  (0) 2021.01.15

+ Recent posts