
문제 페이지다.
패킷을 보여주네?
<?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>
소스 코드다.
htmlspecialchars() 함수로 XSS 방지하고 있고,
.. -> .
12 , 7. , 0. -> 빈칸
이렇게 필터링 하는 걸 볼 수 있다.
REMOTE_ADDR 부분을 변조해서 127.0.0.1 주소를 들어가면 될 것 같다.
$_COOKIE 부분은 헤더의 Cookie 값을 받아 오는 부분이고,
$_SERVER 부분은
더보기
- $_SERVER['PHP_SELF']: 현재 실행 중인 스크립트의 파일 경로입니다.
- $_SERVER['SERVER_NAME']: 서버 호스트 이름입니다.
- $_SERVER['HTTP_HOST']: 현재 요청을 처리한 서버의 호스트입니다.
- $_SERVER['HTTP_USER_AGENT']: 사용자의 브라우저 정보입니다.
- $_SERVER['SERVER_SOFTWARE']: 서버 소프트웨어 정보입니다.
- $_SERVER['SERVER_PROTOCOL']: 요청에 사용된 프로토콜입니다 (예: HTTP/1.1).
- $_SERVER['REQUEST_METHOD']: 요청에 사용된 메서드입니다 (예: GET, POST).
- $_SERVER['QUERY_STRING']: URL의 쿼리 문자열입니다.
- $_SERVER['DOCUMENT_ROOT']: 현재 스크립트가 실행되는 문서 루트 디렉터리입니다.
- $_SERVER['REMOTE_ADDR']: 사용자의 IP 주소입니다.
- $_SERVER['REMOTE_PORT']: 사용자가 접속한 포트입니다.
- $_SERVER['SCRIPT_FILENAME']: 현재 스크립트의 절대 경로입니다.
- $_SERVER['SERVER_PORT']: 서버가 수신 중인 포트입니다.
- $_SERVER['REQUEST_URI']: 현재 요청의 URI입니다.
- $_SERVER['SCRIPT_NAME']: 현재 스크립트의 경로입니다.
- $_SERVER['HTTP_REFERER']: 현재 페이지로 링크된 페이지의 URL입니다 (있는 경우).
이러하다.
그러니까 REMOTE_ADDR 는 사용자의 IP 주소라는 것을 알 수 있겠죠?
처음에는 X-Forwarded-For 헤더를 변조해봤는데, 안되더라.
소스 코드를 한번 더 유심히 보았다.
그랬더니 눈에 띄는 부분이
1. $_SERVER 변수를 가져온 후에 $_COOKIE 변수를 가져온다.
2. REMOTE_ADDR 변수를 그대로 썼다.
-> 그니까 $_SERVER['REMOTE_ADDR'] 이렇게 썼으면 그대로 $_SERVER 변수의 값이 왔을꺼다.
-> 근데 그냥 REMOTE_ADDR를 써버리니까 Cookie 값에 저 변수를 그대로 추가해주면 변조가 가능하다.
3. 필터링 부분이 replace로 되어 있는데, 딱 한 번만 필터링한다.
-> 문자열 계속 반복하면서 필터링 하는게 아니라 한 번만 필터링 우회하면 뚫린다.
그럼 시도해보자.
burpsuite 를 켜서 cookie 값에
REMOTE_ADDR= 112277....00....00....1 를 붙여서 값을 쏘자.

풀었다!
'Web > webhacking.kr' 카테고리의 다른 글
| Webhacking.kr old-26 (0) | 2025.03.17 |
|---|---|
| Webhacking.kr old-06 (0) | 2025.03.17 |
| Webhacking.kr old-17 (0) | 2025.03.17 |
| Webhacking.kr old-16 (0) | 2025.03.17 |
| Webhacking.kr old-14 (0) | 2025.03.17 |