[웹보안] SQL Injection
SQL Injection 개요
- OWASP TOP10에서 꾸준히 상위권을 유지하는, 가장 흔한 웹해킹 기법 중 하나
- 웹 페이지의 입력값을 통해서 SQL명령어를 주입하여 오동작을 일으키는 해킹방법
- 해커에 의해 조작된 SQL 구문이 데이터베이스에 그대로 전달되어 비정상적인 DB 명령을 실행시키는 공격 기법
SQL Injection 종류
1. Error based SQL Injection (논리적 에러를 이용한 SQL 인젝션)
- 에러메세지를 보고 데이터베이스의 구조를 알아내는 방법
- 일부러 에러메세지를 출력시켜, 원하는 정보(db명, 테이블명, 컬럼명 등)를 알아내는 것
- 기본적으로 웹 애플리케이션은 쿼리 수행 중 오류가 발생하면 DB오류를 그대로 브라우저에 출력하며, 이 오류 정보를 통해 DB의 스키마 정보나 데이터가 유출될 수 있다.
SELECT user FROM user_table WHERE id='USER1' AND password='1234';
ID | PW |
---|---|
USER1 | 1234 |
일반 유저는 위와 같이 로그인할 것이다.
SELECT user FROM user_table WHERE id='random' AND password=' ' OR '1' = '1';
ID | PW |
---|---|
random | ' OR '1' = '1 |
비밀번호의 입력값이 true AND false OR false 가 되는데,
AND 연산보다 OR 연산의 우선순위가 빠르기 때문에 해당 구문의 연산 값이 TRUE가 됨
ID, PW를 몰라도 로그인에 성공할 수 있음
2. Union SQL Injection
Union: 두개 이상의 쿼리를 요청해 결과를 얻는 SQL 연산자
두개 이상의 쿼리를 사용한다는 점을 이용해 공격자가 원래의 요청에 추가 쿼리를 삽입하여 정보를 획득하는 기법
단 Union 쿼리는 2개의 테이블이 동일한 필드 개수와 데이터타입을 가져야 하므로 사전공격을 통해 해당정보를 얻어야 한다.
ID | PW |
---|---|
admin' union select * from user-- | nomatter |
SELECT user FROM user_table WHERE id='admin' union select * from user--
AND password='nomatter';
ID로 위 정보를 입력하면, -- 이후는 주석처리가 되므로 user 테이블의 모든 정보를 조회할 수 있다.
3. Blind SQL Injection
- 에러가 출력되지 않는 사이트에서 이용 가능한 방법
- SQL Injection 을 통해 단순히 참, 거짓을 판단할 수 있는 상황에서 실제값을 알아내기 위한 공격 (참, 거짓에 따라 서버의 반응이 달라야 사용 가능)
- 일반적인 SQL 인젝션에 대해 방어가 잘 되어있는 경우라도 블라인드 SQL이 동작하는 경우가 많음
- 임의의 SQL 쿼리를 이용해 정보를 얻어내는 것은 일반적인 SQL Injection과 비슷하나 쿼리 결과에 따른 서버의 반응을 통해 공격하는 기법
- SUBSTR함수나 ASCII 함수, Limit 를 이용하는 방법이 있음
ID | PW |
---|---|
' and ascii(substr(select pw from users where id = 'admin', 1, 1)) < 100 -- | nomatter |
SELECT user FROM user_table WHERE id='admin' and ascii(substr(select pw from users where id = 'admin', 1, 1)) < 100
AND password='nomatter';
위 SQL 인젝션을 통해 admin 계정 비밀번호의 첫번째 글자 아스키 코드가 100 이하인지 알 수 있다.
이런 공격을 반복하면 한글자 한글자 파악 가능하다.
SQL Injection 대응 방법
1. 입력값 검증
- 데이터 타입 검증
- 길이 검증
- 특수문자 동작 제어
2. Prepared Statement
- 가장 확실한 방법
- SQL 쿼리를 사전에 컴파일하여 변수만 따로 넣어 실행시키는 것
- 변수를 문자열로 바꾸는 것이라 안전함
client.query("SELECT * FROM stooges WHERE name IN ($1, $2, $3)", ['larry', 'curly', 'moe'], ...);
- 웹 방화벽 이용
서버에 웹 방화벽 제품을 설치하여 공격을 탐지 및 차단
패턴 기반으로 분석하여 SQL 인젝션으로 보이는 요청이 있으면 차단 - 원시 에러 미출력
오류메시지는 직접 출력되지 않도록 설정
참고
https://itwiki.kr/w/SQL_%EC%9D%B8%EC%A0%9D%EC%85%98
https://namu.wiki/w/SQL%20injection
https://m.mkexdev.net/427
https://m.blog.naver.com/lstarrlodyl/221837243294
https://dongdd.tistory.com/48
Author And Source
이 문제에 관하여([웹보안] SQL Injection), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@choco_sister/웹보안-SQL-Injection저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)