본문 바로가기

해킹&보안/웹 & 앱

SQL Injection

SQL인젝션

데이터베이스를 사용하는 웹 프로그램에서 SQL을 호출할 떄 발행할 수 있는 취약점이다.
개인정보나 기밀 정보 노출과 직결되는 경우가 많다
 
대부분의 웹 프로그램은 DB를 이용하고 있으며, 테이블 안에 데이터 검색, 추가, 삭제 같은 처리를 해야할 떄 SQL을 사용해 데이터베이스에 명령을 내린다. 만약 SQL을 호출하는 부분에서 문자열 필터링 등을 하지 않거나 미흡하게 구현했다면 변조된 SQL 구문을 삽입해서 실행시킬 수 있다.
 
쉽게 이해해보면 웹사이트의 입력 필드(예: 로그인 창, 검색 창)에 악의적인 데이터를 입력하여 시스템의 정보를 몰래 들여다보거나 조작할 수 있는 기법이다.
 

SQL 인젝션 공격의 순서

  • 1 웹사이트와 데이터베이스의 관계 설정
    • 웹사이트와 데이터베이스: 웹사이트는 사용자의 데이터를 저장하고 조회하기 위해 데이터베이스를 사용한다. 예를 들어, 사용자가 로그인할 때 입력한 사용자 이름과 비밀번호를 데이터베이스에서 확인하여 사용자가 올바른지 인증한다.
    • 로그인 과정:
      • 사용자가 로그인 폼에 아이디와 비밀번호를 입력한다.
      • 웹사이트는 이 정보를 사용하여 데이터베이스에서 해당 사용자의 정보를 조회한다.
  • 2 공격자의 입력
    • 입력 필드 조작: 공격자는 웹사이트의 입력 필드(예: 로그인 폼)에 악의적인 데이터를 입력하여 SQL 쿼리를 조작한다. 이 데이터는 웹사이트가 데이터베이스에 대한 요청을 변조하게 만든다.
    • 악성 입력: 예를 들어, 공격자가 로그인 폼의 사용자 이름 필드에 admin' OR '1'='1과 같은 값을 입력한다.
  • 3 악성 데이터가 포함된 SQL 쿼리 생성
    • 쿼리 변조: 웹사이트는 공격자가 입력한 값을 포함한 SQL 쿼리를 생성하여 데이터베이스에 전송한다. 이 쿼리는 사용자 입력을 SQL 문에 직접 포함시킨다.
    • 쿼리 예시:
      • 공격자가 입력한 값이 사용자 이름 필드에 포함되면, 최종 쿼리는 다음과 같이 변형된다:
SELECT user FROM user_table WHERE id='admin' AND password='' OR '1'='1';

 

  • 4 변형된 SQL 쿼리 실행
    • 쿼리 분석: 데이터베이스는 변형된 쿼리를 실행한다. 쿼리의 논리적 구조에 따라 데이터베이스는 입력된 조건을 평가한다.
    • 쿼리 결과:
      • '1'='1'은 항상 참(True)으로 평가되므로, 이 쿼리는 사실상 WHERE 조건이 참이 되는 결과를 초래한다.
      • id='admin' AND password='' 조건이 맞지 않더라도 OR '1'='1' 때문에 쿼리는 참이 된다.
  • 5 로그인 성공
    • 접근 권한 부여: 쿼리가 참으로 평가되면 데이터베이스는 모든 사용자 정보를 반환하거나 접근을 허용한다. 이로 인해 공격자는 로그인에 성공하거나 모든 사용자 정보를 조회할 수 있게 된다.

예시

정상 로그인

사용자가 아이디: lshun, 비밀번호: 1234를 입력하면 쿼리는 아래와 같다

SELECT user FROM user_table WHERE id='lshun' AND password='1234';

▶ 이 쿼리는 데이터베이스에서 lshun라는 아이디와 1234라는 비밀번호를 가진 사용자가 있는지 확인한다.
 

SQL 인젝션 공격

공격자가 아이디: admin, 비밀번호: ' OR '1'='1을 입력하면 쿼리는 다음과 같다

SELECT user FROM user_table WHERE id='admin' AND password='' OR '1'='1';

▶ 이 쿼리는 OR '1'='1' 때문에 항상 참으로 평가되며, 로그인 시도는 성공하게 된다

'해킹&보안 > 웹 & 앱' 카테고리의 다른 글

상태 코드 확인 및 변경 (실습)  (0) 2024.09.15
GET / POST로 데이터 전송하기 (실습)  (2) 2024.09.14
OWASP TOP 10  (0) 2024.07.31
XSS  (0) 2024.07.31
쿠키&세션  (0) 2024.07.30