본문 바로가기
Wargame Write-Up/Webhacking.kr

[Webhacking.kr] (Web) 26번 풀이 (old-26)

by snwo 2020. 4. 5.

소스를보자.


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

get으로 id를 가져와 admin 이면 no! 를 출력하고 종료한다.

admin 이 아니면 id 를 urldecode하고 admin 이면 문제가 풀린다.


우리가 get 으로 요청을할때, 데이터는 웹브라우저가 자동으로 url 인코딩을한다.

그리고 받는쪽에서는 url 디코딩되어 받게된다.

그렇다면, url인코딩을 한번 더 하면 되겠다.


특수문자는 자동으로 url인코딩이 된다.

하지만 admin 은 특수문자가 아니기때문에, 수동으로 url인코딩해줘야한다.


%61%64%6d%69%6e==admin 으로 전달이 돼서 no! 라고 뜬다.


%61%64%6d%69%6e 를 한번더 인코딩하면

%2561%2564%256d%2569%256e 이 된다. 이 값을 전달하면 되겠다.

 

데이터가전달이되면 자동으로 url디코딩되어

%61%64%6d%69%6e 로 바뀌는데, admin 과 다르므로 조건문 통과,

urldecode 함수로 id 가 admin 이 되어 문제가풀리게된다.