[webhacking. kr] old-24
▷유형: PHP
▷문제:
<페이지 소스>
이런 소스코드가 있다. 싹 훑어보았을 때 ip의 값이 127.0.0.1일 경우 solve 함수를 실행한다.
소스코드를 자세하게 봐보자
<?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>
[24번에서 쓰인 문법과 용어]
∨ extract() 함수
: $_GET[], $_POST[]의 변수값을 일반 변수로 변환한다.
◇예시:
$a[f_n]="sb"
$a[l_n]="kim"
$a[birth]="2000"
extract($a);
echo "$f_n";
echo "$l_n";
echo "$birth";
>>>sb kim 2000
body 부분의 코드를 따로 살펴보면,
<?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>";
}
?>
①
extract($_SERVER);
extract($_COOKIE);
extract함수를 통해 $_SERVER와 $_COOKIE로 전달된 모든 변수명이 생성되고 값이 저장되었을 것이다.
∨
$_SERVER함수에서 $REMOTE_ADDR를 인자로 받으면 사이트 접속한 사용자의 ip가 값으로 나온다.
◇ 형식:
$_SERVER['REMOTE_ADDR'] = 사이트 접속한 사용자 IP = xxx.xxx.xxx.xxx
∨
HTTP_USER_AGENT를 인자로 받으면 사이트에 접속한 사용자의 환경이 나온다.
◇ 형식:
$_SERVER['HTTP_USER_AGENT'] = 사이트 접속한 사용자 환경 = Mozilla4.0(compatible; MSIE 6.0; Windows NT 5.1; Q312461; .NET CLR 1.0.3705
②
$ip = $REMOTE_ADDR;
$agent = $HTTP_USER_AGENT;
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>";
}
중간에 $ip에 들어간 문자열이 전혀 다른 걸로 대체된다.
∨ ..→.
∨ 12,7.,0. → 공백
ip에 "127.0.0.1이란 값이 들어가면 solve함수가 실행되고 문제가 풀린다! ⇒최종 ip가 127.0.0.1 로 되야한다.!!
그러므로 $REMOTE_ADDR 쿠키를 만들어 줄때 처음부터 이 상황을 고려하고 만든다.
③
$_COOKIE에 $REMOTE_ADDR를 새로 만들어 준다.
⇒editthiscookie프로그램으로 쿠키를 생성한다.
127.0.0.1이 출력되어야하므로
1(12)27(7.)..0(0.)..0(0.)..1 을 넣으면 된다.
④
다시 문제 창을 새로고침을 하면 문제가 풀린다.