접속자 IP주소 변조 체크
본문
현재 그누보드를 이용해서 사이트 하나를 운영하고 있습니다.
사이트 특성상 중복IP를 체크해야하는 부분이 있어서
php에서 $_SERVER['REMOTE_ADDR']; 를 이용해 따로 중복IP를 관리하고 있습니다.
그런데 bbs/visit.insert.inc.php 파일의 12번째 줄에서 아래와 같은 코드를 확인했습니다.
// $_SERVER 배열변수 값의 변조를 이용한 SQL Injection 공격을 막는 코드입니다. 110810
$remote_addr = escape_trim($_SERVER['REMOTE_ADDR']);
$referer = "";
if (isset($_SERVER['HTTP_REFERER']))
$referer = escape_trim(clean_xss_tags($_SERVER['HTTP_REFERER']));
$user_agent = escape_trim(clean_xss_tags($_SERVER['HTTP_USER_AGENT']));
$vi_browser = '';
$vi_os = '';
$vi_device = '';
if(version_compare(phpversion(), '5.3.0', '>=') && defined('G5_BROWSCAP_USE') && G5_BROWSCAP_USE) {
include_once(G5_BBS_PATH.'/visit_browscap.inc.php');
}
이부분에서 궁금한 것을 정리하자면 아래와 같습니다.
Q1. $_SERVER 배열변수 값을 변조한다는 말은 곧 해커가 마음만 먹는다면 $_SERVER['REMOTE_ADDR']; 값을 변조 할 수 있다는 얘긴가요?
Q2. 변조가 가능하다면 해당 변조를 통한 SQL injection 공격을 막는 코드는 escape_trim 함수의 역할인가요? 만약 그렇다면 escape_trim 함수는 어떤 원리로 $_SERVER 배열변수가 변조 됐는지 안됐는지 판별 할 수 있는거죠?
Q3. 해커가 $_SERVER 배열값을 변조 했을 때 위 보안코드가 작동하면 변조 되기전 본래 IP로 IP주소가 저장되는 건가요?
답변주시면 감사하겠습니다!
답변 1
SERVER 배열변수 중 PHP_SELF, HTTP_USER_AGENT, HTTP_REFERER 등은 공격자가
변조할 수 있습니다. 이 값을 변조하여 XSS 공격도 가능합니다. escape_trim 함수는
배열변수 값에서 변조된 것을 판별하지 않습니다. 변조됐다고 보고 sql injection 공격을
막기 위해 escape 문자를 추가합니다. 위의 코드가 작동된다고 해서 원래 IP로 복원되는
것은 아니고 REMOTE_ADDR 값이 그대로 저장될 뿐입니다.