- SQL Injection2025년 07월 04일
- truebird
- 작성자
- 2025.07.04.:16
[서론]
SQL injection이란 웹 애플리케이션이 데이터 베이스에 보내는 쿼리를 공격자가 조작 할 수 있도록 만드는 보안 취약점입니다.
이 공격을 통해 공격자가 얻을 수 있는 것은 아래와 같습니다.
- 다른 사용자의 민감한 정보 같은 민감한 데이터 열람
- 데이터 수정/삭제 및 애플리케이션의 동작 변경
- 서버 탈취, 백도어 설치, 서비스 거부 공격 등
[본론]
SQL Injection의 탐지 방법은 수동 탐지 방법과 자동화 공격 두가지 방법이 있습니다.
- 수동 탐지 방법
[1]. ' 입력 후 에러 발생 여부 확인
[2]. OR 1=1, OR 1=2 같은 boolean 조건 삽입 후 응답 비교
[3]. 타임 딜레이 기반 페이로드 사용 (SLEEP(5) 등)
[4]. OAST를 활용해 외부 요청 여부 확인
더보기OAST는 외부 서버(OAST 서버)와의 상호작용(Interaction)이 발생하는지를 확인하여 취약점을 판단하는 방식입니다
- 자동화 탐지 방법
Burp Scanner 또는 SQL map을 활용 할 수 있습니다. 하지만 실제 상황에서는 SQL map을 사용 못하는 경우가 있으니 유의합시다.
SQL Injection은 대부분 Select Where 문에서 발생하지만 아래와 같은 위치에서도 발생 할 수 있습니다.
UPDATE 문의 SET, WHERE INSERT 문의 값 SELECT 문의 테이블/ 컬럼 이름 ORDER by 절 공격 기법 예시
1. 숨겨진 데이터 열람
SELECT * FROM products WHERE category = '사용자 입력' AND released = 1
이런 코드로 데이터를 조회 하는 타겟이 있다고 가정 합니다. 그렇다면 우리가 입력을 할 수 있는건 catagory 뿐 입니다.
이때 category에 '-- 를 입력 할 수 있다고 하면 어떻게 될까요?
SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1
그렇다면 Gifts뒤에 있던 AND 부터 쭉 주석 처리가 되서 숨겨진 데이터를 확인 할 수 있게 됩니다.
2. 로그인 우회
SELECT * FROM users WHERE username = '입력 ID' AND password = '입력 Password'
이런식으로 ID, Pass를 입력 받는 곳이 있다고 해봅시다. Administrator의 권한을 가지고 있는 계정의 이름이 ADMIN이고 password는 "BOB13thDF!" 라고 합니다. 공격자 입장에서는 Admin의 이름을 어떻게든 알아 낸다 해도, 계정의 Password는 알아 낼 방법이 없습니다. 사실 특정 조건 (로그인을 해야만 들어갈수 있는 페이지) 이 있다면 ID도 필요가 없을 것 같습니다. 무튼 공격자자가 어떻게든 계정의 ID를 알아 냈습니다. 그렇다면 ADMIN '-- 를 입력 하는 순간
SELECT * FROM users WHERE username = 'ADMIN'--' AND password = ''
password를 입력 하지 않고도 로그인을 할 수 있을 지도 모른다. 하지만 Server측에서 검증하는 식이라면... 안타깝게도 실패 할 것 같습니다..
3. Union을 이용한 다른 테이블 정보 열람
Union은 두 개 이상의 SELECT 쿼리 결과를 합쳐 하나의 결과로 반환하는 명령어 입니다. UNION의 사용 조건은 동일한 컬럼수, 데이터 타입이 일치 해야 합니다. Union SQLI를 찾는 방법은 아래와 같습니다.
[1]. '를 입력하여 오류가 뜨면 SQL 인젝션 가능성이 높음
[2]. 컬럼 개수 확인 하기
' order by 1 -- # 이런식으로 개수를 확인 합니다. 에러가 나는 지점을 찾으면 됩니다. ' UNION SELECT NULL-- # 아니면 이런식으로 NULL을 늘려도 됩니다
[3]. 문자열출력 가능한 컬럼찾기
' UNION SELECT 'a',NULL,NULL-- ' UNION SELECT NULL,'a',NULL-- ' UNION SELECT NULL,NULL,'a'--
페이지에 a가 보이면 해당 컬럼은 문자열 컬럼이 가능 합니다.
[4] 민감한 데이터 추출
' UNION SELECT username, password FROM users--
이런식으로 민감한 데이터를 추출 할 수도 있습니다.
4. Blind SQL Injection
응답에 쿼리 결과나 오류가 직접 표시 되지 않는 경우에 사용 할 수 있는 방법입니다. 우회적인 접근 방법은 아래와 같습니다.
[1]. 조건에 따라 응답이 달라지게 만들기
[2]. SLEEP()을 사용하여 응답 시간 차이로 판단
[3]. OAST 기법을 활용한 네트워크 요청 유도
5. Secon-order SQL Injection
첫 요청에선 입력을 DB에 안전하게 저장을 했지만 나중에 저장된 값을 사용하는 쿼리에 취약점이 존재 할 때 사용 할 수 있는 방법입니다. 해당 공격에 대해서는 더 공부를 해본뒤 추가 글 작성 하겠습니다.
[결론]
데이터 베이스 별로 공격 방법도 다르고 DB에 구성 된 방법들에 따라 공격 가능성 여부가 갈립니다. 자동화 된 툴도 좋지만 직접 찾아 보는 연습을 해보는 것도 좋은 것 같습니다.
'Web Hacking > Tech' 카테고리의 다른 글
Blind SQL Injection (0) 2025.07.05 CSRF (1) 2025.06.28 XSS (0) 2025.06.28 WEB 해킹 들어가기 - 베이스 쌓기 (0) 2025.06.28 다음글이전글이전 글이 없습니다.댓글