php의 문법을 알고 있다면 쉽게 풀 수 있는 문제였다.
처음 들어온다면 자신의 ip와 자신이 쓰고 있는 브라우저의 버전과 이름, 운영체제, 엔진 정보, 장치 정보 등이 보일 것입니다.
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 24</title>
</head>
<body>
<p>
<?php
extract($_SERVER);
extract($_COOKIE);
$ip = $REMOTE_ADDR;
$agent = $HTTP_USER_AGENT;
if($REMOTE_ADDR){
$ip = htmlspecialchars($REMOTE_ADDR);
$ip = str_replace("..",".",$ip);
$ip = str_replace("12","",$ip);
$ip = str_replace("7.","",$ip);
$ip = str_replace("0.","",$ip);
}
if($HTTP_USER_AGENT){
$agent=htmlspecialchars($HTTP_USER_AGENT);
}
echo "<table border=1><tr><td>client ip</td><td>{$ip}</td></tr><tr><td>agent</td><td>{$agent}</td></tr></table>";
if($ip=="127.0.0.1"){
solve(24);
exit();
}
else{
echo "<hr><center>Wrong IP!</center>";
}
?><hr>
<a href=?view_source=1>view-source</a>
</body>
</html>
코드에서 중요한 것을 보니 extract라는 문법이 보입니다.
extract는 나중에 제가 따로 다룰 예정이니 간단히 설명하자면
PHP에서는 배열(array)를 파이썬의 딕셔너리와 같이 사용합니다. *키 : 값
그리고 extract는 이 배열의 키와 값들을 각각 변수의 이름과 값으로 나누어 선언해주는 함수입니다.
extract($_SERVER);
그럼 이건 뭘까요?
이걸 알려면 PHP의 목적을 알아야합니다.
결국 PHP는 동적 웹사이트를 쉽게 만드려는 목적을 가지고 있습니다.
이 목적을 이루기 위해서는 웹과 서버를 다룰 수 있어야합니다.
이중 서버를 다루기 위해 만든게 $_SERVER이란 슈퍼글로벌 변수입니다.
그리고 배열이죠.
$_SERVER에서는 서버의 각종 데이터들을 키와 값으로 나누어 저장하고 있습니다.
ex) $_SERVER['REMOTE_ADDR'] = (클라이언트의 ip주소)
고로 extract($_SERVER)은 이런 서버의 키와 값들을 변수의 형태로 바꿔서 쉽게 다룰 수 있도록 변형한 겁니다.
그리고 다음 줄에 있는 extract($_COOKIE)는 당연히 쿠키의 데이터를 변수로 바꾼 것이죠.
*쿠키는 키 : 값의 형태를 띕니다.
그럼 이제 이 문제의 조건을 알아보죠.
이 문제는 서버에서 REMOTE_ADDR의 값을 127.0.0.1로 읽으면 깨집니다.
그런데 아까 extract($_SERVER)에서 클라이언트에서 직접 보낸다고 했죠?
이 말은 즉, 변조가 가능합니다.
그리고 이와 더불어 다음 줄에 extract($_COOKIE)가 있는데 extract 함수는 뒤에 나온 함수와 앞에 나온 함수에서 동일한 변수가 있다면 뒤에 나온 함수의 변수 값이 최종 변수값이 됩니다.
즉 REMOTE_ADDR이란 쿠키를 만들고 그곳에 127.0.0.1이란 값을 넣으면 끝이죠.
그런데 REMOTE_ADDR을 필터링을 합니다.
if($REMOTE_ADDR){
$ip = htmlspecialchars($REMOTE_ADDR);
$ip = str_replace("..",".",$ip);
$ip = str_replace("12","",$ip);
$ip = str_replace("7.","",$ip);
$ip = str_replace("0.","",$ip);
}
htmlspectialchars는 XSS 공격을 방지하기 위해 특수 문자들을 HTML 엔티티로 변환합니다.
ex) & -> &
그리고 순차적으로
- .. -> .
- 12 -> ""
- 7. -> ""
- 0. -> ""
이 조건들을 모두 통과한 값이 127.0.0.1이면 됩니다.
그리고 이 값은 직접 풀고 싶으신 분들이 있을 수도 있으니 맨 아래에 기재하겠습니다.
답 : 112277....00....00....1
'Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] old 20 해설 (0) | 2025.01.04 |
---|---|
[Webhacking.kr] old-39 풀이 (0) | 2024.12.29 |
[Webhacking.kr] old-38 풀이 (1) | 2024.12.15 |
[Webhacking.kr] old-54 풀이 (1) | 2024.12.14 |
[Webhacking.kr] old-01 풀이 (0) | 2024.12.14 |