문제) APM(Apache, PHP, MySQL) 환경의 사이트를 운영중인 L씨는 현재 SQL Injection 악성코드의 공격을 받고 있다
PHP 설정파일에서 어떤 옵션을 설정해야 안전한가?
이 문제는 단순히 PHP 설정파일에서 SQL Injection을 조금이나마 미연에 방지하기 위한 옵션을 묻고있다.
우선 SQL lnjection이란?
SQL 인젝션은 코드 인젝션의 한 기법으로 클라이언트의 입력값을 조작하여 서버의 데이터베이스를
공격할 수 있는 공격방식을 말한다. 주로 사용자가 입력한 데이터를 제대로 필터링 하지 못했을 경우에 발생한다.
공격의 쉬운 난이도에 비해 파괴력이 어마어마하기 때문에 시큐어 코딩을 하는 개발자라면
가장 먼저 배우게 되는 내용이다. 이러한 injection 계열의 취약점들은 테스트를 통해 발견하기는 힘들지만
스캐닝툴이나 코드 검증절차를 거치면 보통 쉽게 발견되기 때문에 탐지하기는 쉬운 편이다.
쉽게 설명하자면 어느 홈페이지에 이름 입력칸 하나가 존재한다고 가정하자.
그 홈페이지의 서버에는 SQL 언어로 이루어진 학생정보 DB가 존재한다.
INSERT INTO students (이름) VALUES ('학생 이름');
그 입력창에 이름 Field 라는 표시가 되어있더라도 필터링 식에 대한 Secure Coding이 되어있지 않은경우,
입력칸에 입력한 정보는 서버로 전송된다.
이를테면 보통 사람들은 확인을 위해 이름 입력칸에 본인의 이름만을 입력할 것이다.
하지만 악의적인 목적을 지닌 사용자의 경우 Secure Coding이 되어 있지 않은 홈페이지를 스캔하여
입력칸에 이름이 아닌 SQL 질의문을 삽입하여 서버로 전송 할 경우,
INSERT INTO students (이름) VALUES ('not4dog'); DROP TABLE students;--');
이름 값 뒤에 DROP TABLE students;--'); 이라는 주석처리 구문으로 인해
students 테이블, 즉 모든 학생정보가 삭제되고 테이블의 구조 또한 같이 삭제된다.
이 같은 상황을 조금이라도 방지하고자 PHP에는 addslashes와 magic_quotes_gpc 이라는 옵션이 있다.
magic_quotes_gpc란? php.ini 파일에 작성되어 있는 설정값으로 기본값은 on이며,
자동적으로 모든 GET, POST, COOKIE Data에 addslashes()처리를 한다.
이 설정을 통해 SQL Injection에서 사용자의 데이터 입력값에 쿼리를 조작하기 위한 ' 등이 있을 경우,
이를 \ 처리해주므로 공격을 방지할 수 있다.
addslash란? 데이터베이스 Query에서 Field값으로 저장하기 전에 사용되는 함수이다.
만일 문자열에 작은따옴표('), 큰따옴표("), 백슬래시(\), NULL 문자가 포함되어 있다면,
이 문자들 앞에 백슬래시(\)를 붙여 특수 문자가 순수한 하나의 문자로 인식되도록 해준다.
I'm a boy → I\'m a boy
만약 데이터베이스에 저장하기 전에 addslahses를 사용하지 않는다면,
데이터베이스의 필드값에 저장되는 문자열 가운데 특수 문자가 포함될 경우,
그 문자가 하나의 일반적인 문자가 아닌 특수 문자로 인식되어 오류를 일으키거나 잘못된 결과를 초래할 수 있다.
문제에서 함수가 아닌 php.ini에서 설정할 수 있는 옵션을 물어보았으므로,
정답은 magic_quotes_gpc 가 된다.