SQL Injection (SQL 삽입 공격)
해커에 의해 조작된 SQL 쿼리문이 데이터베이스에 그대로 전달되어,
비정상적인 명령을 실행시키는 공격 기법
공격의 핵심은 클라이언트 측에서 SQL 쿼리에 신뢰할 수 없는 데이터가 입력되었을 때,
데이터가 쿼리 로직의 일부로 해석되어 DB에서 실행될 때 발생
목적
SQL 구문에 추가 절을 삽입하게 되면 쿼리의 의미가 변경되고 의도하지 않은 데이터의 유출, 변조가 가능
1. 정보 유출
2. 저장된 데이터 유출 및 조작
3. 원격 코드 실행
- 일부 데이터베이스의 경우 확장 프로시저를 이용하여 원격으로 시스템 명령의 실행이 가능하다.
이 경우 시스템 명령의 실행은 원격 자원 접근 및 데이터 유출, 삭제가 가능
4. 인증 우회
- 공격의 대표적인 경우로 로그인 폼 등에서 발생한다.
상위 권한을 가진 사용자의 권한으로 인증 절차를 우회하여 로그인 정보 없이 로그인 가능
공격 기법
1. Error based SQL Injection
2. UNION based SQL Injection
3. Blind SQL Injection
4. Stored Procedure SQL Injection
5. Mass SQL Injection
1. ErrorBased SQL Injection
- 논리적 에러를 이용
- 에러가 발생되는 사이트 에서 에러 정보들을 이용하여 DB및 쿼리의 구조 등의 추측 가능
ex) 로그인
- 공격 대상 : SELECT * FROM Users WHERE id = 'INPUT1' AND password = 'INPUT2'
- 공격 예시 : SELECT * FROM Users WHERE id = '' OR 1=1 -- ' AND password = 'INPUT2'
싱글쿼터를 닫아주기 위한 싱글쿼터와, OR 1=1 구문을 이용해 WHERE 절을 모두 참으로 만들고, -- 를 넣어줌으로써 뒤의 구문을 모두 주석 처리
결과
Users 테이블에 있는 모든 정보를 조회하게 됨으로써 가장 먼저 만들어진 계정 (보통 관리자 계정) 으로 로그인할 수 있게 됨 → 관리자 계정 탈취
2. UNION based SQL Injection
- 정상적인 쿼리문에 하나의 추가 쿼리를 삽입하여 원하는 정보를 획득
- 성공하기 위해서는 두 가지 조건
- UNION하는 두 테이블의 컬럼 수가 같아야 함
- UNION하는 두 테이블의 데이터 형이 같아야 함
ex) 게시글 조회
- 공격 대상 : SELECT * FROM Board WHERE title LIKE '%INPUT%' OR contents '%INPUT%'
- 공격 예시 : SELECT * FROM Board WHERE title LIKE '% ' UNION SELECT null,id,passwd FROM Users -- INPUT%' OR contents '%INPUT%'
사용자의 id와 passwd를 요청하는 쿼리문을 주입
결과
사용자의 개인정보가 게시글과 함께 화면에 보여짐
3. Blind SQL Injection
1) Boolean based SQL
- 사용되는 SQL문 : limit, SUBSTR, ASCII..
- 특정한 값이나 데이터를 전달받는 것이 아닌, 쿼리를 통해 나온 참과 거짓의 정보만을 통해 정보를 취득
- 발생되지 않는 사이트에서는 논리적 에러를 이용하거나 UNION을 이용할 수가 없기 때문에, Blind를 통해 정상적인 쿼리가 수행되는지, 혹은 쿼리가 수행되지 않아 쿼리 결과가 없는지를 판단
- 서버가 응답하는 성공과 실패 여부를 이용하여 DB의 테이블 정보 등을 추출
ex) 로그인 폼 통해 DB의 테이블 명 알아내기
- 공격 대상 : SELECT * FROM Users WHERE id = 'INPUT1' AND password = 'INPUT2'
- 공격 예시 : SELECT * FROM Users WHERE id = 'abc123' and ASCII(SUBSTR((SELECT name FROM information_schema.tables WHERE table_type='base table' limit 0,1),1,1)) > 100 (로그인이 될 때까지 시도) -- INPUT1' AND password = 'INPUT2'
임의로 가입한 abc123이라는 아이디와 함께 뒤의 구문을 주입한다. 해당 구문은 테이블 명을 조회하는 구문으로 limit 키워드를 통해 하나의 테이블만 조회하고, SUBSTR 함수로 첫 글자만, ASCII를 통해서 ascii 값으로 변환한다. 만약 조회되는 테이블 명이 Users 라면 'U' 자가 ascii 값으로 조회가 될 것이고, 뒤의 100이라는 숫자 값과 비교
결과
거짓이면 로그인 실패가 될 것이고, 참이 될 때까지 뒤의 100이라는 숫자를 변경해 가면서 비교
공격자는 이 프로세스를 자동화 스크립트로 만들어 단기간 내에 테이블 명 알아내기 가능
2) Time based SQL
- 사용되는 SQL문 : SLEEP, BENCHMARK..
- 쿼리 결과를 특정 시간만큼 지연시키는 것
- Blind와 마찬가지로 에러가 발생되지 않는 조건에서 사용하며, 참 혹은 거짓이라는 결과값이 나오지 않으므로 시간을 재는 것
- 궁극적으로는 DB 구조를 파악하기 위함
ex) 로그인 폼 통해 DB의 길이 알아내기
- 공격 대상 : SELECT * FROM Users WHERE id = 'INPUT1' AND password = 'INPUT2'
- 공격 예시 : SELECT * FROM Users WHERE id = 'abc123' OR (LENGTH(DATABASE())=1 (SLEEP 할 때까지 시도) AND SLEEP(2)) -- INPUT1' AND password = 'INPUT2'
LENGTH(DATABASE()) = 1 이 참이면 SLEEP(2)가 동작하고, 거짓이면 동작하지 않음
결과
숫자 1 부분을 조작하여 DB의 길이를 알아내기 가능
4. Stored Procedure SQL Injection
Stored Procedure (저장 프로시저) : 편의를 위해 일련의 쿼리들을 모아 하나의 함수처럼 모아둔 것
- 공격자가 시스템 권한을 획득해 직접적으로 피해를 주는 것
- 대표적으로, MS SQL에서 사용할 수 있는 xp_cmdshell을 통해 윈도우 명령어를 실행할 수 있음 → 자주 악용됨
5. Mass SQL Injection
- 다량의 SQL Injection 공격
- 한 번의 공격으로 다량의 DB가 조작되어 큰 피해를 입히는 것
- 보통 MS-SQL을 사용하는 ASP 기반 웹 애플리케이션에서 많이 사용
- DB 값을 변조하여 DB에 악성 스크립트를 삽입하고, 사용자들이 변조된 사이트에 접속 시 좀비 PC로 감염되게 하며
이렇게 감염된 좀비 PC들은 DDoS 공격에 사용
[해킹] SQL Injection : 개념 및 공격 기법
* 개인적인 공부 내용을 기록한 글입니다. SQL Injection : 개념 및 공격 기법 1. SQL Injection 개념 보안상의 취약점을 이용하여, 임의의 SQL문을 주입하고 실행되게 하여 DB가 비정상적인 동작을 하도록
www.cho-log.io
- https://gyoogle.dev/blog/computer-science/data-base/SQL%20Injection.html
SQL Injection | 👨🏻💻 Tech Interview
SQL Injection 해커에 의해 조작된 SQL 쿼리문이 데이터베이스에 그대로 전달되어 비정상적 명령을 실행시키는 공격 기법 공격 방법 1) 인증 우회 보통 로그인을 할 때, 아이디와 비밀번호를 input 창
gyoogle.dev
'CS' 카테고리의 다른 글
PATCH와 PUT (0) | 2023.08.03 |
---|---|
대칭키와 비대칭키 (0) | 2023.08.03 |
Join (0) | 2023.07.27 |
트랜잭션 격리 수준 (0) | 2023.07.20 |
트랜잭션 (0) | 2023.07.20 |