old-24

- webhacking.kr ~ old-24 문제 풀이를 진행해보겠습니다.
- 페이지로 접근하면
client ip, agent값이 표시된 테이블(표)을 볼 수 있습니다. view-source버튼을 눌러 소스코드를 확인해보겠습니다.

- 서버 측 코드(
<?php>) 부분을 살펴보면extract($_SERVER), extract($_COOKIE)로 값을 빼내고 $REMOTE_ADDR, $HTTP_USER_AGENT값을 각각$ip, $agent변수에 할당하고 있습니다.- 클라이언트 측에 저장된 쿠키 값은 없었기 때문에
$REMOTE_ADDR, $HTTP_USER_AGENT는$_SERVER배열에 저장되어 있던 값으로 추측할 수 있겠습니다.

- 클라이언트 측에 저장된 쿠키 값은 없었기 때문에
- 여기서 주목할 포인트는 아래 부분인데요.
$_SERVER배열로부터 값을 추출한 후에$_COOKIE값을 추출하고 있습니다.- 마지막에 추출되는 건
$_COOKIE이므로,$REMOTE_ADDR, $HTTP_USER_AGENT덮어쓰기가 가능합니다.

- 바로 이렇게 말이죠.

- 그런데, 코드에서 볼 수 있듯이
solve(24)를 호출하려면$REMOTE_ADDR값이 127.0.0.1 이어야 합니다.

if($REMOTE_ADDR)조건문 내부에서는str_replace함수로 특정 문자열을 공백으로 치환 중입니다.- 따라서,
$ip값이 127.0.0.1 이 되기 위해서는 이 문자열 치환 로직을 우회해야 합니다.

- 문자열을 다른 문자가 아니라, 공백으로 치환하고 있기 때문에 충분히 우회가 가능합니다.
REMOTE_ADDR값으로 “112277.12.00.12.00.12.1”를 넣어보고 페이지를 리로드하면?!
- 짜아아아안! 솔브 성공입니다요.

(여담) 문자열을 공백으로 치환하는 건 디렉토리 순회, 파일 업·다운로드, 크로스 사이트 스크립팅 등의 취약점 우회 공격에 활용될 수 있으니 임의의 다른 문자로 필터링을 하거나 아예 화이트 리스트로 관리를 하는 게 좋습니다.
🐛.. 🐛.. 🐛..