view-source를 눌러 확인해 보자.
<?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
if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
$_GET['id'] = urldecode($_GET['id']);
if($_GET['id'] == "admin"){
solve(26);
}
?>
먼저 'preg_match' 함수는 주어진 정규 표현식 패턴을 사용해서 문자열 내에서 일치하는 부분을 찾아내는 함수이다.
서버에서 GET 방식으로 'id' 값이 'admin'과 일치하면 'no!'를 출력하고 종료시키고 그 밑에 줄부터는
url decode 함수를 이용해서 GET에서 받은 'id' 값을 url디코딩시키는 코드인 거 같다 그리고 'id' 매개변수가 'admin' 인지 확인하고 'admin' 이면 문제가 풀리는 거 같다.
요약하자면 문자열 'admin'을 넣으면 막히고 'admin' 을 url 인코딩을 해서 정답을 대입해야 하는 거 같다.
한번 해보자.
'
먼저 그냥 문자열로 대입하면
'no!'라고 뜬다.
여기서 URL 처음 입력한 '?'는 '$_GET' 변수를 통한 접근이라고 말할 수 있고 , DB에 대해서 요청하는 것이다.
그리고 이제 'no!'를 확인했으니 정답을 얻어보자.
'admin'은 영문 문자열은 URL 인코딩하지 않아도 그대로 쓸 수 있기에 URL 인코딩 표를 참고하거나, ASCII 코드로 변경하여 '0x' 부분을 '%'로 치환해 주자.
admin = %61%64%6D%69%6E
대입해 보자.
그래도 똑같이 'no!'가 출력된다.
확인해 본 결과 PHP에서는 GET, REQUEST 방식을 통해 전달된 값은 자동으로 URL 디코딩이 된다고 한다.
PHP가 서버 측에서 URL을 해석할 때 자동으로 처리되는 부분 중 하나라고 한다.
그러면 인코딩을 한번 더 하면 된다는 말이다. [ 코드에서 한번 , GET으로 한번 decode 시킴]
URL 인코딩 사이트에서 한번 더 인코딩 시키자.
admin[2번Encode] == %2561%2564%256D%2569%256E
'Wargame > Webhacking.kr' 카테고리의 다른 글
webhacking.kr - old 24 (function_extract) (0) | 2024.03.12 |
---|---|
webhacking.kr - old 03 (SQL Injection) (0) | 2024.03.08 |
webhacking.kr - old 18 (SQL Injection) (0) | 2024.03.06 |
webhacking.kr - old 16 (ASCII) (0) | 2024.03.06 |
webhacking.kr - old 06 (base64) (0) | 2024.03.06 |