오랜만에 모의해킹에 관심이 생겨 웹해킹 공부도 할겸 문제를 하나 풀어보기로 했다.
일단 사이트를 들어가서 문제를 보면 해당 페이지가 나오는데...
아무것도 없으니 일단 페이지 소스를 보기로 했다.
<?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);
}
사실 PHP를 제대로 공부해본 적이 없어서 구글링을 통해 함수들을 검색해서 찾아보았다,
찾아본 바에 의하면 대략 Preg_match 라는 함수는 현재 정규표현식을 사용해서 문자열을 찾는 함수라고 한다
그렇다면 아래의 코드를 해석해볼 수 있다,
if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
보면은 서버에서 GET 방식으로 Id를 받아오는데 Id 값이 admin과 일치하게 된다면 no를 출력하고 종료되는것 같다,
그래서 url을 입력해보았다.
예상대로 해당 구문이 실행되어서 no를 출력하고 종료되는 것을 볼 수 있다,
그럼 만약에 id 값이 admin이 아니게 된다면 어떨지 궁금해졌다.
아래의 코드를 보면 어떻게 동작하는지 알 수 있을거 같다.
$_GET['id'] = urldecode($_GET['id']);
if($_GET['id'] == "admin"){
solve(26);
현재 GET으로 받아온 id를 urldecode 함수를 통해서 저장을 하는데..
urldecode가 무엇인지 잘 몰라서 구글링을 통해 찾아보니 url 인코딩 된 값을 디코딩을 하는 함수라고 한다.
그럼 해석을 해보자면, 인코딩된 id 값을 디코딩 하는데 여기서 인코딩 된 값이 admin이라면??
urldecode에서 디코딩한 결과가 admin이 될것이고 그럼 $GET[ 'id' ] 값이 admin이 될 것이다.
그렇다는 말은 solve함수를 실행한다는 말이 된다. 그래서 한번 admin을 인코딩한 값을 넣어보았다.
61%64%6D%69%6E -> url 인코딩 표를 보고 인코딩 하였다.
???? 같은 화면이 나온다...??
admin을 인코딩한 값인 %61%64%6D%69%6E를 넣었음에도 불구하고 URL이 admin으로 id 값이 들어가 있다.
그렇다는 말은 preg_match 구문이 실행되고 바로 종료되었다는 이야기가 된다.
PHP는 GET 방식과 REQUEST 방식은 서버측에서 값을 전달받을때, 자동으로 한번 디코딩이 된다고 한다.
그말인 즉슨 %61%64%6D%69%6E이 값을 한번 자체적으로 한번 디코딩을 했다는 말이 된다,
그래서 preg_match 함수가 실행되고 종료된것 같다.
그럼 이것을 어떻게 해결할 수 있을끼..?
자동적으로 디코딩을 한번 했다고 하니 그럼 인코딩을 2번 하게 된다면?
자동적으로 한번 디코딩을 하고 난 뒤 urldecode 함수가 실행되어 한번 더 디코딩이 될것이다.
그렇게 되면 아래의 코드를 실행 시킬 수 있을 것이다.
if($_GET['id'] == "admin"){
solve(26);
}
만약 생각한대로 실행이 된다면 뭔가 값을 찾을 수 있지 않을까 생각해본다.
따라서 한번더 url 인코딩을 해보았다.
%2561%2564%256D%2569%256E
문제가 해결되었다.
확실히 웹해킹 문제들은 PHP의 취약점을 찾는 문제들이 많이 나오는 것 같다.
웹 언어는 제대로 공부를 해본적이 많이 없어서 개념을 많이 몰라서 시간이 오래걸렸던 것 같다.
PHP 공부를 해봐야 할 것 같다. 그럼 쉬워지지 않을려나
그럼 20000~~~~
'CTF > WebHacking' 카테고리의 다른 글
Wargame.kr - strcmp (0) | 2021.02.26 |
---|---|
Wargame.kr - fly me to the moon (0) | 2021.02.16 |
Wargame.kr - WTF_CODE (0) | 2021.02.13 |
Wargame.kr - login filtering (0) | 2021.02.12 |
Wargame.kr - QR CODE PUZZLE (0) | 2021.02.11 |