
간만에 흰 바탕이네요.
client ip와 agent를 보여주고 Wrong IP! 라는 문구가 보이네요. 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>
예상했던것 처럼 알맞은 IP를 받으면 해결되는 문제였습니다.
차근차근 보겠습니다.
extract($_SERVER);
extract($_COOKIE);
extract() 함수는 배열의 키를 변수로 추출하는 함수입니다.
예를 들어서 extract($_COOKIE);는 쿠키에 user = 123 이라는 값이 입력되어있다면
$user = '123'; 으로 변수를 새로 만든다는 뜻이죠.
즉 위의 코드는 서버의 실행환경과 각종 정보가 변수로 만들어진다 라는 뜻과, 쿠키에 입력된 값을 변수 만든다 라는 뜻입니다.
서버쪽 보다는 쿠키쪽이 더 중요해보이네요.
쿠키값을 통해 서버에 원하는 변수와 그 변수의 값을 조절할 수 있다는겁니다.
$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);
}
REMOTE_ADDR이라는 변수의 값을 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>";
}
맨 위의 조건문을 HEEP_USER_AGENT에 값이 존재한다면, 특수문자들을 HTML 엔티티로 변환 후 agent에 저장하겠다 라는 뜻입니다.
저도 자세히 몰라서 함수들을 검색해보니, 지금 문제에서는 크게 신경 쓸 부분은 아닌것 같더군요.
저렇게 html 에서 의미있는 문자들을 html엔티티로 변환한다면 XSS 공격등을 방지할 수 있다고도 합니다.
그 다음 두번째 if문이 눈에 띄네요.
ip변수의 값이 127.0.0.1 이라면 문제가 해결된다고합니다.
그렇지않으면 처음 본 화면에 띄워져있던 것 처럼 Wrong IP!를 출력한다고 합니다.
즉 정리하면, 쿠키를 통해 ip변수에 127.0.0.1을 넣어야하는데...
아까 ip변수를 선언하는 문장을보면
$ip = $REMOTE_ADDR;
위처럼 REMOTE_ADDR이라는 변수에서 값을 가져옵니다.
즉 쿠키에 REMOTE_ADDR이라는 값을 만들고, 거기에 127.0.0.1을 넣어서 보내면 되겠네요.
근데 이때, 아까 본것처럼 ip 값에 대한 필터링이있었습니다.
때문에 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);
}
특수문자 필터링과 총 4번의 문자열 치환을 거치게됩니다.
프로그래밍 특성상 위에서 아래로 진행되기에 반대로 아래에서 위로 올라가면서 우회할 ip를 작성해보면 되겠네요.
"127.0.0.1"에서 "0."이 필터링 당해도 "127.0.0.1"이 되도록 할려면..
"127.00..00..1"이 되겠네요.
주황색 부분이 필터링으로 사라져도 127.0.0.1이라는 원본은 유지가됩니다.
다음 "7."이 필터링되어도 문제없게 할려면..
"1277..00..00..1"
이렇게 작성하면 되겠죠?
그다음 "12"가 필터링된다고 합니다.
"112277..00..00..1"
점점 완성이 되가네요.
마지막은 ".." 이 ' . '으로 변환된다고합니다.
위처럼 적으면 ".."이 ' . '으로 변하면서 "7."과 "0."필터링을 거쳤을 때 원본이 파괴가 되네요.
때문에 ' . ' 을 하나 더 적어주면 될 것 같습니다.
그렇게 해서 완성된 ip는
"112277...00...00...1"이 되겠습니다.
이제 입력을 해볼까요?

쿠키는 역시 개발자도구에서 바꿔주면 되겠죠.
F12를 통해 쿠키 탭에 들어가서 위처럼 REMOTE_ADDR에 112277...00...00...1을 넣어주었습니다.
이제 새로고침을 하면..

짠! 문제 해결입니다.
'보안 > 워게임 (웹 해킹)' 카테고리의 다른 글
| Challenge - old-10 write up (0) | 2025.03.31 |
|---|---|
| Challenge - old-03 write up (0) | 2025.03.31 |
| Challenge - old-18 write up (0) | 2025.03.19 |
| Challenge - old-26 write up (0) | 2025.03.17 |
| Challenge - old-16 write up (0) | 2025.03.17 |