1. 문제
2. 코드
<?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 = $_SERVER['REMOTE_ADDR'];
$agent = $_SERVER['HTTP_USER_AGENT'];
if ($_SERVER['REMOTE_ADDR']) {
$ip = htmlspecialchars($_SERVER['REMOTE_ADDR']);
$ip = str_replace("..", ".", $ip);
$ip = str_replace("12", "", $ip);
$ip = str_replace("7.", "", $ip);
$ip = str_replace("0.", "", $ip);
}
if ($_SERVER['HTTP_USER_AGENT']) {
$agent = htmlspecialchars($_SERVER['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>
3. 코드 분석 및 풀이
- 클라이언트의 IP 주소와 USER-AGENT를 가지고 온다.
- 여기서 IP에 12, 7. , 0. , .. 문자열을 제거하거나 치환한다.
$ip = $_SERVER['REMOTE_ADDR'];
$agent = $_SERVER['HTTP_USER_AGENT'];
if ($_SERVER['REMOTE_ADDR']) {
$ip = htmlspecialchars($_SERVER['REMOTE_ADDR']);
$ip = str_replace("..", ".", $ip);
$ip = str_replace("12", "", $ip);
$ip = str_replace("7.", "", $ip);
$ip = str_replace("0.", "", $ip);
}
- IP 값이 127.0.0.1 이어야 문제가 해결된다.
if ($ip == "127.0.0.1") {
solve(24);
exit();
} else {
echo "<hr><center>Wrong IP!</center>";
}
3.1 취약점
- 하지만 여기서 extract 함수를 사용할 때, $_SERVER 와 $_COOKIE 의 키 이름이 겹치면 마지막에 실행된 extract가 이전 값을 덮어쓰므로 COOKIE에 REMOTE_ADDR 이 127.0.0.1로 변조가 가능하면 IP를 조작할 수 있다.
extract($_SERVER);
extract($_COOKIE);
- 따라서 COOKIE에 KEY = REMOTE_ADDR, VALUE = 112277...00...00...1 을 하면 최종 ip는 127.0.0.1 이 된다.
'Wargame > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] old-10 (0) | 2025.02.01 |
---|---|
[Webhacking.kr] old-03 (0) | 2025.02.01 |
[Webhacking.kr] old-26 (0) | 2024.11.30 |
[Webhacking.kr] old-18 (1) | 2024.11.29 |
[Webhacking.kr] old-16 (1) | 2024.11.28 |