
문제에 접속하면 view-source 가 있다
이를 한번 눌러보자

<?php
if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
$_GET['id'] = urldecode($_GET['id']);
if($_GET['id'] == "admin"){
solve(26);
}
?>
소스코드를 보니 처음 보는 함수가 있다.
이를 한번 알아보자
preg_match : 특정 문자열이 패턴에 부합하는지 검사하는 함수
preg_match('/검사할 문자/', '입력한 문자')
preg_match란 쉽게 말해 입력한 문자에서 특정 문자가 있는지를 찾고싶을 때 사용하는 함수이다.
<?php
$my_name = "j4zzCh0rd";
if (preg_match("/z/", $my_name)
{
echo "There is a 'z'";
}
?>
이를 예시코드로 쉽게 알아보자.
먼저 변수 my_name 에는 이름을 저장하고
preg_match 함수로 이름에 z 가 있는지 체크해
있다면 "There is a 'z' "를 출력하는 코드를 실행시켜보자

이런식으로 쓰이는 함수가 preg_match 이다
다시 문제로 돌아와서
<?php
if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
$_GET['id'] = urldecode($_GET['id']);
if($_GET['id'] == "admin"){
solve(26);
}
?>
id 값에 admin이 들어있으면 no!를 출력하는걸로 보아 바로 값을 넣으면 안될것같다.
그런데 바로 아래 코드를 보니 id를 한번 디코드하는걸 볼 수 있다.
그렇다면 admin을 인코딩해 넣으면 자동으로 디코드가 되어
문제를 해결할 수 있을 것 같다.
$_GET[ 'id' ] 란?
get 방식으로, 키와 해당 값을 url에 담아 다음 페이지로 전달하는 방식이다.
입력 예시)
https://j4zzch0rd.php?id=admin&pw=admin
admin을 인코딩하려는 순간

??
admin이 그대로 나오는것을 볼 수 있다.
이때부터 어떻게 하지 고민을 계속 하던 와중에..
url 인코딩이 어떤 방식으로 되는지를 찾아보았다.
https://ko.wikipedia.org/wiki/%ED%8D%BC%EC%84%BC%ED%8A%B8_%EC%9D%B8%EC%BD%94%EB%94%A9
퍼센트 인코딩 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 퍼센트 인코딩(percent-encoding)은 URL에 문자를 표현하는 문자 인코딩 방법이다. 이 방법에 따르면 알파벳이나 숫자 등 몇몇 문자를 제외한 값은 옥텟 단위로 묶어
ko.wikipedia.org
요약하자면 % 뒤에 16진수 값을 넣어 문자를 치환하는것같다.
그리고 문자는 보통 인코딩을 하지 않아 위에서 admin이 치환이 안되는거였다.
admin을 검사하는 코드이니 앞에 a만 %61로 바꾸면 풀 수 있을것 같다.

이렇게 작성하고 엔터를 누르면

안된다!
.
..
뭐가 문제일까..
그렇게 다시 url을 보는데

??
아까 우리가 바꾼 %61이 a로 다시 바뀐것을 알 수 있다.
잘은 모르겠지만 아마 한번 인코딩을 하고 검사하는것같다..
그렇다면 인코딩을 2번 해서 넣어보면..?


문제 해결 :)
이번 문제는 중간에 막혀서 좀 힘들었네요..
그래도 해결하니 힘든 마음은 사라지고 문제를 풀었다는 기쁨만 남네요 ㅎㅎ
여러분들도 어떤 어려운 문제가 있더라도 포기하지말고 나아갔으면 좋겠습니다
"이 또한 지나가리라" - 랜터 윌슨 스미스
'Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] Challenge 39 (0) | 2024.10.11 |
---|---|
[Webhacking.kr] Challenge 12 (0) | 2024.10.10 |
[Webhacking.kr] Challenge 6 (0) | 2024.10.06 |
[Webhacking.kr] Challenge 17 (0) | 2024.10.06 |
[Webhacking.kr] Challenge 16 (0) | 2024.10.06 |