SQL Injection
SQL 질의를 변조/삽입하여 비정상적으로 DB를 접근하는 기법
* 무료 SQL Injection 취약점 스캐너 - Nikto, SQLMap, Absinthe
Form SQL Injection
HTML Form 기반 인증을 할 경우, 사용자 인증 sql query의 조건절(where)이 항상 참이 되도록 조작
예시 코드
$sql = "SELECT id, pass FROM member WHERE id='$id' and pass='$pass'";
id 입력란에 아래와 같은 코드 삽입으로 공격
MYSQL
' or 1=1#
MSSQL, Oracle
' or 1=1--
예방
* 특수문자 Escape 처리
php.ini
---------------
magic_quotes_gpc = On
---------------
mysql_real_escape_string()
* 선처리 질의문(Prepared Statement)을 통해 SQL Injection 방지
$stmt = $connecti->prepare("SELECT id, pass FROM member WHERE id=? AND pass=?");
$stmt->bind_param("ss",$id,$pass);
$stmt->execute();
$stmt->bind_result(&col1,$col2,$col3);
* 파라미터 필터링(Parameter Filtering)을 통한 SQL Injection 방지
BlackList 문자열 생성 후 해당 문자열이 포함될 경우 사용할 수 없도록 설정.
Union SQL Injection
UNION을 이용하여 다른 쿼리문의 결과와 결합해 공격하는 기법
컬럼 개수를 파악해서 진행해야 한다.
ex) id 입력란에 order by를 이용하여 컬럼 개수를 파악한다.
오류가 발생할 경우, 해당 테이블의 컬럼이 이전 컬럼까지 존재한다는 것을 유추할 수 있다.
' order by 3 #
SQL Injection 대응 방안
1. 문자열 필터링
2. MS-SQL 확장 프로시저 제거
3. WAS의 dbuser 권한 제한
4. Prepared Statement 사용
Error-Based SQL Injection
SQL 쿼리에 따른 에러 값을 기반으로 DB 정보를 수집하여 공격하는 기법
Blind SQL Injection
질의 결과의 True/False를 통해 의도하지 않은 SQL 쿼리를 실행시키는 기법