오랜만에 모의해킹에 관심이 생겨 웹해킹 공부도 할겸 문제를 하나 풀어보기로 했다.

일단 사이트를 들어가서 문제를 보면 해당 페이지가 나오는데...

 

아무것도 없으니 일단 페이지 소스를 보기로 했다. 

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 26</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }    
a { color:lightgreen; }
</style>
</head>
<body>
<?php
  if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
  $_GET['id'] = urldecode($_GET['id']);
  if($_GET['id'] == "admin"){
    solve(26);
  }
?>
<br><br>
<a href=?view_source=1>view-source</a>
</body>
</html>

 

해당 소스를 분석을 해보면 중요한 부분을 볼 수 있는데 아래의 부분 인 것 같다. 

<?php
  if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
  $_GET['id'] = urldecode($_GET['id']);
  if($_GET['id'] == "admin"){
    solve(26);
  }

 

사실 PHP를 제대로 공부해본 적이 없어서 구글링을 통해 함수들을 검색해서 찾아보았다, 

 

찾아본 바에 의하면 대략 Preg_match  라는 함수는 현재 정규표현식을 사용해서 문자열을 찾는 함수라고 한다

그렇다면 아래의 코드를 해석해볼 수 있다,

if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }

 

보면은 서버에서 GET 방식으로 Id를 받아오는데 Id 값이 admin과 일치하게 된다면 no를 출력하고 종료되는것 같다,

그래서 url을 입력해보았다. 

 

 

예상대로 해당 구문이 실행되어서 no를 출력하고 종료되는 것을 볼 수 있다, 

그럼 만약에 id 값이 admin이 아니게 된다면 어떨지 궁금해졌다. 

아래의 코드를 보면 어떻게 동작하는지 알 수 있을거 같다.

$_GET['id'] = urldecode($_GET['id']);
  if($_GET['id'] == "admin"){
    solve(26);

 

현재 GET으로 받아온 id를 urldecode 함수를 통해서 저장을 하는데..

urldecode가 무엇인지 잘 몰라서 구글링을 통해 찾아보니 url 인코딩 된 값을 디코딩을 하는 함수라고 한다.

그럼 해석을 해보자면,  인코딩된 id 값을 디코딩 하는데 여기서 인코딩 된 값이 admin이라면??

urldecode에서 디코딩한 결과가 admin이 될것이고 그럼  $GET[ 'id' ] 값이 admin이 될 것이다.

 

그렇다는 말은 solve함수를 실행한다는 말이 된다. 그래서 한번 admin을 인코딩한 값을 넣어보았다.

61%64%6D%69%6E -> url 인코딩 표를 보고 인코딩 하였다.

 

 

???? 같은 화면이 나온다...??

admin을 인코딩한 값인 %61%64%6D%69%6E를 넣었음에도 불구하고 URL이 admin으로 id 값이 들어가 있다. 

그렇다는 말은 preg_match 구문이 실행되고 바로 종료되었다는 이야기가 된다.

 

PHP는 GET 방식과 REQUEST 방식은 서버측에서 값을 전달받을때, 자동으로 한번 디코딩이 된다고 한다.

그말인 즉슨  %61%64%6D%69%6E이 값을 한번 자체적으로 한번 디코딩을 했다는 말이 된다,

그래서 preg_match 함수가 실행되고 종료된것 같다. 

 

그럼 이것을 어떻게 해결할 수 있을끼..?

자동적으로 디코딩을 한번 했다고 하니 그럼 인코딩을 2번 하게 된다면?

자동적으로 한번 디코딩을 하고 난 뒤 urldecode 함수가 실행되어 한번 더 디코딩이 될것이다.

그렇게 되면 아래의 코드를 실행 시킬 수 있을 것이다.

if($_GET['id'] == "admin"){
    solve(26);
  }

 

만약 생각한대로 실행이 된다면 뭔가 값을 찾을 수 있지 않을까 생각해본다.

따라서 한번더 url 인코딩을 해보았다. 

%2561%2564%256D%2569%256E

 

 

문제가 해결되었다. 

확실히 웹해킹 문제들은 PHP의 취약점을 찾는 문제들이 많이 나오는 것 같다.

웹 언어는 제대로 공부를 해본적이 많이 없어서 개념을 많이 몰라서 시간이 오래걸렸던 것 같다. 

PHP 공부를 해봐야 할 것 같다. 그럼 쉬워지지 않을려나 

 

그럼 20000~~~~

'CTF > WebHacking' 카테고리의 다른 글

Wargame.kr - strcmp  (0) 2021.02.26
Wargame.kr - fly me to the moon  (0) 2021.02.16
Wargame.kr - WTF_CODE  (0) 2021.02.13
Wargame.kr - login filtering  (0) 2021.02.12
Wargame.kr - QR CODE PUZZLE  (0) 2021.02.11

+ Recent posts