웹/webhacking.kr

webhacking.kr 26번

최경환의 해킹공부 2021. 2. 17. 07:17

26번은 페이지에는 아무것도 없기 때문에 바로 소스코드를 보겠습니다.

<?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>

소스코드도 분석할 내용이 많지 않습니다. 일단 preg_match함수를 통해 get방식으로 전달받은 id의 값이 admin일 경우 no를 출력하면서 종료하게 되어 있습니다. 그리고 이 조건을 우회한다면 url 디코딩한 id의 값이 admin일 경우에 문제가 풀리게 됩니다.

 

여기서 url기준으로 admin이라는 값을 넘기려면 admin을 그대로 넣거나, %61%64%6d%69%6e 값을 넣는 방법 2가지가 있습니다. 하지만 두 값을 넣어보면 당연히 필터링에 걸려 문제가 풀리지 않습니다. 여기서 urldecode라는 함수를 이용해야 하는데 공격할때 url인코딩을 한 번 하여도 괜찮다는 점을 이용해야 합니다. 여기서 url인코딩을 하면 admin은 그대로 admin이 되기 때문에 소용이 없습니다. 하지만 두 번째 문자의 %문자가 url인코딩을 할경우 다르게 들어가기 때문에 단순 필터링에서 걸리지 않게 됩니다.

 

따라서 %61%64%6d%69%6e 를 url인코딩 한 값인 %2561%2564%256d%2569%256e를 넘겨주면 문제가 풀리게 됩니다.