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”를 넣어보고 페이지를 리로드하면?!
  • 짜아아아안! 솔브 성공입니다요.

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


🐛.. 🐛.. 🐛..