Jaeseo's Information Security Story

SQL Injection 기초 개념 본문

Security Study/Web hacking

SQL Injection 기초 개념

Jaeseokim 2019. 10. 17. 17:49

SQL Injection의 정의

  • 데이터 베이스 관리 언어 SQL을 통해 데이터베이스에 접근 시 비정상적인 구문을 삽입하여 공격하는 기법이다.
    주로 클라이언트에서 서버로 전송하는 입력 값을 조작하여 행하여 진다.
    이는 개발자가 입력 받은 값이 정상적인지 필터링 하지 못하여 발생하는 취약점이다.

SQL Injection의 위험성

  • 데이터베이스 내의 정보를 무단으로 유출 및 변조

  • 데이터베이스 기반의 인증 우회 (계정 인증 우회) 등..

  • 매우 오래된 공격 기법 이지만 DB에 접근 할수 있다는 점 아직도 많은 웹사이트가 취약하여 OWASP에서 발표한 웹 주요 취약점 TOP 10에서도 1위를 차지하고 있는 공격 기법이다.

    OWASP TOP 10 2017
    1 인젝션
    2 취약한 인증
    3 민감한 데이터 노출
    4 XML 외부 개체(XXE) 신규
    5 취약한 접근 통제 합침
    6 잘못된 보안 구성
    7 크로스 사이트 스크립팅(XSS)
    8 안전하지 않은 역직렬화 신규
    9 알려진 취약점이 있는 구성요소 사용
    10 불충분한 로깅 및 모니터링

SQL Injection 영향을 주는 문자

문자 역할
' ' ' 닫는 역할
" " " 닫는 역할
-- 뒷문장 주석처리
; 앞 명령어 종결
/**/ 주석처리(공백우회에도 사용)

SQL Injection 기본 원리

예를 들어 아래와 같이 ASP 서버쪽에서 userid와 password를 넘겨 받아 아래의 코드로 체크를 한다고 생각을 해본다.

select * from user_data where userid = ' & userid & ' and password = '& password & '

일반적으로는 사용자가 id , pass를 입력한다면 아래와 같이 Query를 진행하는데

select * from user_data where userid = ' id ' and password = ' pass '

이때 id입력 창에 '를 추가 하고 -- 를 통해 뒷문장을 주석 처리 한다면 어떻게 되는지 생각을 해본다.

select * from user_data where userid = ' ' --  ' and password = '& password & '

위와 같이 되는데 이때 결과적으로는 아래의 Query가 진행하게 되는 것을 볼 수가 있다.

select * from user_data where userid = ' ' --

이제 이 점을 활용 하여 공격을 해본다.

select * from user_data where userid = ' ' or 1=1 --  ' and password = '& password & '

위의 상황은 id 입력 값으로 ' or 1=1 -- 으로 집어 넣은 상황이다.

select * from user_data where userid = ' ' or 1=1 --

이때 실제로 작동하는 것은 위와 같은 Query가 작동하게 되는데 userid가 어떤 것이 오든 or 연산자 덕분에 뒤의 값이 참이 와서 무조건 True가 오게되는 것을 볼 수가 있다.

이러한 방법은 매우 간단한 방법이며 실제로 서버로 처리될때에는 다양한 문자열이 필터링 되어 처리가 되기 때문에 실제로 공격이 가능한 사이트는 거의 전무 하다.

Comments