본문 바로가기

웹 해킹/웹 공부

URL 이중인코딩

https://webhacking.kr/challenge/web-11/

 

Challenge 26

 

webhacking.kr

관련 문제

 

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

 

 

 

  • 한 번 인코딩된 문자열 검사:
    • 문자열: %61%64%6d%69%6e
    • preg_match("/admin/", "%61%64%6d%69%6e")는 %61을 a, %64를 d, %6d를 m, %69를 i, %6e를 n으로 인식합니다.
    • 따라서, %61%64%6d%69%6e는 admin을 포함한다고 인식하여 "no!"를 출력하고 종료합니다.
  • 이중 인코딩된 문자열 검사:
    • 문자열: %2561%2564%256d%2569%256e
    • preg_match("/admin/", "%2561%2564%256d%2569%256e")는 %25를 %로 인식하고, 뒤에 오는 61은 그대로 61로 인식합니다.
    • 따라서, %2561는 %61로, %2564는 %64로 인식됩니다.
    • 이는 admin과 일치하지 않으므로, 이 문자열에는 admin이 포함되지 않는다고 인식합니다

 

 

이중 인코딩된 문자열 검사:

입력: id=%2561%2564%256d%2569%256e


preg_match("/admin/", "%2561%2564%256d%2569%256e")는 %61%64%6d%69%6e로 변환되므로 admin을 포함하지 않는다고 인식합니다.


$_GET['id'] = urldecode($_GET['id']);는 %2561%2564%256d%2569%256e를 %61%64%6d%69%6e로 변환합니다.

 

변환된 값은 urldecode에 의해 다시 디코딩되어 admin이 됩니다.


따라서, if($_GET['id'] == "admin") 조건이 참이 되어 solve(26);이 호출됩니다.