Search

SQLi 이론

카테고리
[이론] 웹 공격위협
상태
완료
게시일
2024/04/23
태그
SQLi, 웹 공격

SQL Injection

DB와 연동된 웹 애플리케이션에서 데이터 유효성 검증을 하지 않을 경우, 공격자가 입력 폼 URL 입력란에 SQL 구문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있는 보안 취약점

SQL Injection 위험성

인증우회

데이터베이스(DB) 획득

의도적으로 DB 에러메시지 유발, DB의 구조 파악
데이터 베이스의 구조
DB → Table → Column → Data

Error based SQLi

⇒ 강제로 에러를 유발시켜 에러페이지에서 정보를 획득하는 SQLi
공격기법
고의적으로 에러메시지가 발생하도록 유도
테이블명, 필드명 등과 같은 주요정보 노출
DB의 구조 파악 및 2차 공격 시도

Union based SQLi

⇒ SQL 문법 중 Table의 내용을 조회하는 쿼리(명령어) = SELECT
Union : SQL 문에서 SELECT를 여러번 사용할 수 있게 해주는 쿼리(명령어) 두 개의 SELECT문의 결과 집합을 하나로 합쳐서 반환
ex) SELECT column1, column2 FROM table1 UNION SELECT column_a, column_b FROM table2
⇒ Union 앞, 뒤의 SELECT문이 가져오는 column의 개수가 동일해야 실행 가능하다

Union based SQLi를 실행하기 위해서는 웹 사이트에서 SELECT 문을 사용하는 부분을 찾아내야한다 (+ SELECT 하는 컬럼 갯수도 찾아내야함)

SELECT문 ⇒ 조회, 검색하는 곳에서 주로 사용
SELECT문에서 사용하는 column 개수의 파악 ⇒ 노가다

Blind based SQLi

⇒ 웹 브라우저 상에서 SQLi에 대한 결과가 직접적으로 나오지 않는 경우에 사용!
원리 : 사용자 입력값을 입력받는 부분에 SQL 쿼리를 입력 → 입력하는 쿼리는 무조건 참인 쿼리, 무조건 거짓인 쿼리 입력 → 이 때, 두 쿼리에 대한 반응이 다르다면, Blind based SQLi 에 대한 취약점 존재 확인
참인 쿼리 ’ and 1=1 --
거짓인 쿼리 ’ and 1=2 --

★ 가장 중요한 포인트

⇒ 참/거짓일 때의 반응이 달라야함

자주 사용되는 함수

substring([절단할 문자열], [절단 시작 위치], [절단할 길이]) ⇒ 문자열 절단 함수
ex) substring(’admin’, 1, 1) ⇒ a substring(’admin’, 2, 3) ⇒ dmi
ascii([문자]) ⇒ 해당 문자의 Ascii code 반환 (10진수)
ex) ascii(’a’) ⇒ 97 char(97) ⇒ ‘a’
char([아스키코드]) ⇒ 해당 아스키코드에 대한 문자를 반환
(부가적으로 알아두면 좋은 것)
mssql 키워드 중 ‘top’ 이라는 키워드가 있음 = 가장 위
ex) SELECT top 1 table_name from information_schema.tables ⇒ table_name Column 데이터 중 가장 첫 번째 데이터 출력

Q) 첫 번째 테이블의 첫 번째 글자 확인

대치동' and substring((select top 1 table_name from information_schema.tables),1,1)='a' -- ⇒ False 대치동' and substring((select top 1 table_name from information_schema.tables),1,1)='o' -- ⇒ True

But! o와 O 모두 참으로 나옴, 구분이 필요함

상동' and ascii(substring((select top 1 table_name from information_schema.tables),1,1))=79 -- ⇒ False 상동' and ascii(substring((select top 1 table_name from information_schema.tables),1,1))=111 -- ⇒ True (소문자 o 인것 확인)

SQL Injection 시큐어 코딩

소스코드 레벨에서 Prepared Statement 구문을 통한 SQL Injection 방어
개발 중 DAO 객체 또는 DB 연결 구문에서 Prepared Statement 구문 이용
SQL Injection 취약점이 근본적으로 발생하지 않는 구조로 웹사이트를 개발
해당 구문은 SQL 쿼리를 선 처리하여 컴파일 한 후, 이후 입력되는 변수 값을 항상 문자열 변수로 처리함
사용자가 어떤 악의적인 SQL 구문을 변수에 삽입해도 SQL 문에 영향을 미치지 않아 SQL Injection이 발생하지 않는다