<?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 이면 문제가 풀림 하지만 preg_match 함수로 “admin” 이라는 문자열이 있으면 필터링되어서 no! 라는 문자가 뜸
preg_match 필터링 우회
admin 을 URL Encoding 하여서 시도해봄
admin → %61%64%6D%69%6E
→ ?id=%61%64%6D%69%6E
URL을 Encoding 하였는데 값을 넣고 요청을 보내면 URL이 admin 으로 바뀌고
가 뜨는것이 확인됨
php문 내부에 GET[′id′]=urldecode(_GET['id'] = urldecode(_GET['id']); 를 확인하였는데
이 코드때문에 만약 %61%64%6D%69%6E 를 한번 더 URL Encoding 하여서 GET 요청을 보내면 URL이 admin으로 바뀌는것처럼 두번 인코딩 되어져있던게 디코딩되어서 admin을 URL 인코딩 한 결과값이 서버에 전해지지 않을까?
%61%64%6D%69%6E → %2561%2564%256D%2569%256E
정답 : %2561%2564%256D%2569%256E
<?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 이면 문제가 풀림 하지만 preg_match 함수로 “admin” 이라는 문자열이 있으면 필터링되어서 no! 라는 문자가 뜸
preg_match 필터링 우회
admin 을 URL Encoding 하여서 시도해봄
admin → %61%64%6D%69%6E
→ ?id=%61%64%6D%69%6E
URL을 Encoding 하였는데 값을 넣고 요청을 보내면 URL이 admin 으로 바뀌고
가 뜨는것이 확인됨
php문 내부에 GET[′id′]=urldecode(_GET['id'] = urldecode(_GET['id']); 를 확인하였는데
이 코드때문에 만약 %61%64%6D%69%6E 를 한번 더 URL Encoding 하여서 GET 요청을 보내면 URL이 admin으로 바뀌는것처럼 두번 인코딩 되어져있던게 디코딩되어서 admin을 URL 인코딩 한 결과값이 서버에 전해지지 않을까?
%61%64%6D%69%6E → %2561%2564%256D%2569%256E
정답 : %2561%2564%256D%2569%256E