Webhacking.kr 24번 문제 풀이
Webhacking.kr 24번 문제 풀이
24번 문제의 메인 화면이다.
client 에는 나의 공인 ip가 출력되어 있었다.
페이지 소스를 확인해보니 index.phps 힌트파일이 존재한다고 주석처리 되어있다. index.phps로 들어가보자
코드에는 현재 문제의 php 소스코드가 존재했다. 해석해보자
<?
extract($_SERVER); #extract는 배열속의 키값을 변수화 시켜준다 즉, $_SERVER의 값을 변수화 시킴
extract($_COOKIE); #$_COOKIE의 값을 변수화 시킴
if(!$REMOTE_ADDR) $REMOTE_ADDR=$_SERVER[REMOTE_ADDR]; #문제에 접속한 클라이언트 IP가 없으면 REMOTE_ADDR 변수에 문제에 접속한 클라이언트 IP 저장
$ip=$REMOTE_ADDR; #ip 변수에 클라이언트 ip저장
$agent=$HTTP_USER_AGENT; #agent 변수에 $HTTP_USR_AGENT 를 저장
if($_COOKIE[REMOTE_ADDR])
{
$ip=str_replace("12","",$ip); #클라이언트 ip에 12 라는 문자가 들어오면 공백으로 치환
$ip=str_replace("7.","",$ip); #클라이언트 ip에 7. 라는 문자가 들어오면 공백으로 치환
$ip=str_replace("0.","",$ip); #클라이언드 ip에 0. 라는 문자가 들어오면 공백으로 치환
}
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") #ip에 저장된 값이 127.0.0.1 이면 if문 수행
{
@solve(); #문제 공략
}
else
{
echo("<p><hr><center>Wrong IP!</center><hr>");
}
?>
소스코드 해석을 참조해보면 REMOTE_ADDR 쿠키에 저장된 값을 $ip 변수에 저장하고 그 값이 127.0.0.1 이면 문제가 풀리게된다.
하지만 위의 소스코드중 str_replace 함수를 이용해 "12" , "7." , "0." 을 사용하면 공백으로 치환시킨다.
실제로 공백으로 치환되는지 확인해보기 위해 REMOTE_ADDR 쿠키를 추가하고 127.0.0.1 주소를 넣어주고 전달했다.
실제로 "12", "7.", "0." 이 필터링당해 1 하나만 남아있는것을 확인 할 수 있었다.
str_replace는 처음 한번 변수에 저장된 값을 검사해 치환을 하고 그 후에 다시 저장된 값에 대해서는 검사를 하지 않는다.
그렇다면 112277..00..00..1 이런식으로 적게 된다면 어떻게될까?
"1122"에서 가운데 "12"가 공백으로 치환되어 최종적으로 "12"라는 문자가 완성될 것이다. 그렇게 "7." , "0." 부분도 똑같이 완성될 것이며 127.0.01 이 완성된다. str_replace는 다시 저장된 값에 대해서는 검사하지 않기 때문에 문제를 공략할 수 있을것이다.
str_replace 구문의 필터링을 우회하여 127.0.0.1 의 주소가 들어갔고 문제를 공략했다.
100 Point Get :D
'Web Hacking > Web Hacking.kr' 카테고리의 다른 글
Webhacking.kr 26번 문제 풀이 (0) | 2017.07.12 |
---|---|
Webhacking.kr 25번 문제 풀이 (0) | 2017.07.10 |
Webhacking.kr 23번 문제 풀이 (0) | 2017.07.10 |
Webhacking.kr 21번 문제 풀이 (2) | 2017.07.10 |
Webhacking.kr 20번 문제 풀이 (0) | 2017.07.07 |