SQL injection : 응용 프로그램 내 보안 상 허점을 이용하여, 악의적 SQL 문을 넣어 실행되게 함으로써 데이터베이스를 비정상적으로 조작하게 된다.
사용자의 입력값이 서버측에서 코드로 실행되는 '코드 인젝션' 기법 중 하나이다. 클라이언트 측의 SQL 쿼리에 신뢰할 수 없는 데이터가 입력되었을 경우, 데이터가 쿼리 로직의 일부로 해석되어 DB에서 실행될 때 발생한다.
$username = $_POST["username"];
$password = $_POST["password"];
$mysqli->query("SELECT * FROM users WHERE username='{$username}' AND password='{$password}'");
user name = admin
password = password' OR 1=1
입력 시, 쿼리문은 아래와 같이 바뀌게 된다.
SELECT * FROM users WHERE username='admin' and password='password' OR 1=1--
이 때, 1=1은 항상 참이되므로 유저네임이 admin인 아이디로 로그인이 가능하게 된다.
'--' 는 주석의 의미로 이후 서브쿼리를 모두 의미없는 문자열로 만들어버린다.
mysqli_real_escape_string()
함수 사용
$username = $mysqli->real_escape_string($_POST["username"]);
$password = $mysqli->real_escape_string($_POST["password"]);
Prepared Statement
적용하기: 매개변수화된 구문을 사용하여 동일한 구문 실행에 있어 SQLi 공격을 방지한다. 또한, 바인딩된 변수가 쿼리와 별도로 서버로 전송되어 사용자가 입력한 구문이 쿼리로 실행되지 않는다.
블랙 리스트 기반 필터링
: SQL 쿼리 구조를 변경하는 특수문자 및 SQL 예약어를 미리 등록하고, 입력을 제한하는 방식이다. 해당 문자 입력 시 준비된 문자열로 치환되거나 에러 메시지가 뜨게된다.
화이트 리스트 기반 필터링
: 허용되는 문자열을 등록하고 리스트 이외 문자열 입력 시 차단한다.
관리자 DB 계정과 웹애플리케이션 운영 계정 권한의 분리가 필요하다.
ETC. 웹 방화벽 사용, 주기적 로그 및 취약점 점검
식별(Identification) : 사용자가 자신이 이용하려는 서비스의 인증 허가를 받기 위해 자신의 신분을 밝히는 것을 말한다.
ex) ID, MAC Adress, IP, RFID...
인증(Authentication) : 시스템이 자신의 신원을 밝힌 사용자를 여러 인증 방식에 의거하여 시스템에 접근 가능한 사용자라는 것을 인증해주는 것을 말한다.
ex) 지식 기반 인증, 소유 기반 인증, 존재 기반 인증 등
'apple'
, psw 값을 'sweet'
으로 입력했을 시, DB에서 id 값은 apple이고, psw가 sweet으로 정확히 일치하는 사용자를 한번에 찾는 경우String sql = "SELECT * FROM users WHERE id=apple AND psw=sweet";
'apple'
, psw 값을 'sweet'
으로 입력했을 시, DB에서 id 값 apple을 먼저 찾고, id 값이 apple 인 사용자 중 psw가 sweet 인 사용자를 찾는 경우String sql = "SELECT sweet FROM users WHERE id=apple";
if (psw.equals(dbPsw)) {
System.out.println("로그인에 성공하였습니다.");
} else {
System.out.println("비밀번호가 일치하지 않습니다.");
}
- SQL injection의 개념 : https://ko.wikipedia.org/wiki/SQL_%EC%82%BD%EC%9E%85
- SQL injection 기법 및 예방법 :
https://gomguk.tistory.com/118#toc-link-18