본문 바로가기

Problem Solving/Wargame

[Webhacking.kr] Old - 24 문제 풀이

제 아이피와 사용자 에이전트(User agent)가 보이고, 그 아래 잘못된 아이피(Wrong IP!)라고 표시가 되어있네요. 일단 소스 코드를 확인해 보겠습니다.

 

 

 

PHP 코드가 있네요. 대충 보니 $ip 변수에 클라이언트의 아이피 주소를 담고, 이 값이 127.0.0.1일 경우 문제가 풀리는 것 같습니다. 하지만 아이피 주소는 서버의 REMOTE_ADDR로 얻어오기에 얼핏 보면 불가능해 보이지만, 상단에 extract($_COOKIE); 코드가 있기 때문에 값을 제 마음대로 바꿀 수 있습니다.

 

 

https://www.php.net/manual/en/function.extract.php

 

PHP: extract - Manual

[New Version]This function is very useful for filtering complicated array structure.Also, Some integer bitmasks and invalid UTF-8 sequence detection are available.Code: $_GET,            INPUT_POST => $_POST,            INPUT_COOKIE => $_COOKIE

www.php.net

extract 함수를 PHP 매뉴얼에서 살펴보았습니다. 배열에 있는 데이터를 변수에 각각 매핑시키는 역할을 하는 것 같아 보이는데요. 사실 $ip 변수에 값을 담을 때에도 원래는 $_SERVER['REMOTE_ADDR']로 가져와야 하지만, extract($_SERVER); 코드가 있기 때문에 $ip = $REMOTE_ADDR;이 가능한 것입니다.

 

 

 

어쨌든 extract($_COOKIE); 코드 덕분에 우리는 쿠키에 값을 설정하는 것으로 언제든지 $ip 변수의 값을 바꿀 수 있습니다. 테스트로 REMOTE_ADDR 이름의 쿠키를 만들고 값을 123.123.123.123으로 설정해 보았습니다.

 

 

 

정말로 값이 바뀌었네요! 3.3.3.3으로 나오는 이유는 str_replace 함수를 이용한 필터링 때문입니다. 하지만 딱 1번만 실행되도록 코딩해놨기 때문에 이를 쉽게 우회할 수 있습니다. 예를 들어 12가 필터링 되는 경우에 1122로 입력하면, 내부의 12가 사라지면서 결과적으로 12가 나오게 됩니다. 이런 방식으로 필터링을 우회하면 됩니다.

 

123.123.123.123으로 입력했던 값을 지우고 112277....00....00....1를 입력해 보았습니다. str_replace 함수에 의해 최종적으로 127.0.0.1로 바뀌게 될 것입니다.

 

 

 

아이피가 127.0.0.1이 나오게 되면서 문제가 풀렸습니다! PHP의 extract 함수의 문제점을 알고 있는지 묻는 문제였습니다.


https://webhacking.kr

 

Webhacking.kr

Index Welcome Stranger! Notice(en) [2019-08-18] In the process of receiving service, some loss of data has been observed. For example, in very few accounts there may be a truncation of the last one letter of an userid. If userid contains multibyte characte

webhacking.kr