Wargame/Webhacking.kr

[Webhacking.kr] Old 26

핏디 2021. 8. 4. 15:26
SMALL

[문제]

 


[풀이]

<?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 코드 부분이다.

 

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

 소스코드를 분석해보면 다음과 같다.

 if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); } -> get 방식으로 id를 입력 받아 admin이면 no! 출력 후 종료

  $_GET['id'] = urldecode($_GET['id']); -> id를 urldecode하여 id에 저장

  if($_GET['id'] == "admin"){ solve(26);} -> id가 admin이면 26 단계 solve

 

즉, admin를 입력해야 26단계를 해결할 수 있는데, admin을 필터링 하고 있다. 

 

get 방식으로 입력 값을 줘야 하니, urlencoding을 생각해볼 수 있다.

 

admin을 url encoding 해보면, %61%64%6d%69%6e으로 나타낼 수 있다.

그러나 이것을 보내면 admin으로 치환되어 no!를 출력해버린다.

 

웹 서버와 브라우저 간의 통신에서 브라우저는 입력 값을 자동으로 인코딩해서 php서버로 보내고,

php는 받은 값을 자동으로 디코딩하기 때문!! 

 

따라서 url encoding을 2번 진행한 값을 보내면 flag를 획득할 수 있다.

 

https://webhacking.kr/challenge/web-11/?id=%2561%2564%256D%2569%256E 

 

LIST

'Wargame > Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] Old-54  (0) 2021.08.11
[Webhacking.kr] Old-39  (0) 2021.08.11
[Webhacking.kr] Old 18  (0) 2021.07.28
[Webhacking.kr] Old 17  (0) 2021.07.28
[Webhacking.kr] Old 16  (0) 2021.07.27