보안/E-COPS

[1주차 - 웹 해킹 기초 이론] SQL Injection & Command Injection

박박고은 2025. 3. 18. 23:10

SQL Injection

DBMS에서 사용하는 질의 구문인 SQL을 삽입하는 공격

 

정상적인 로그인 구문

SELECT * FROM member WHERE id = 'userid' and pw = '[ENC_DATA]'

 

Terminating Query 방식

SQL 쿼리를 중간에 종료하고 새로운 쿼리를 이어서 작성하는 기법

[ 'or 1=1-- ] 를 id 칸에 입력하면?

 

SELECT * FROM member WHERE id = '' or 1=1 --and pw = '[ENC_DATA]'

 

▶ 1=1이 참이기 때문에 TRUE가 반환되고, 뒤의 구문은 --로 인하여 주석처리가 된다

 

In-line Query 방식

기존의 쿼리를  종료시키는 것이 아닌, 추가 논리 또는 로직을 꼬아 결과를 유도하는 기법

 


SQL Injection 공격 유형

 

인증 우회 공격

인증 기능을 실행하는 어플리케이션 대상 (ex : 로그인)

방금의 예시들과 유사한 방법으로 실행

 

데이터 조회 공격

데이터베이스에 저장된 정보를 조회

 

Error-Based SQL Injection

이상한 요청을 보낸 뒤 오류를 보고 SQL의 구조를 파악

ex) error : members 테이블의 memberid 컬럼이 어쩌구... ➡ 테이블은 members고 첫 번째 컬럼은 memberid 겠구나!

 

Blind SQL Injection

DBMS 에러가 발생되지 않는 환경에서 (눈 먼 환경) SQL 인젝션 하기 위한 방법

가장 많이 사용됨

 

- Boolean 기반

SQL 쿼리의 참/거짓에 따라 응답이 다른 경우에 사용

 

- Time 기반

SQL 쿼리의 참/거짓에 따라 서버의 응답 시간이 다른 경우에 사용

Sleep(5000)과 같이 대기하는 명령어를 수행해 공격의 성공 여부 판단지정한 시간만큼 시간이 지연되면 SQL 인젝션에 취약한 것으로 간주!

 

시스템 명령어 실행 공격

SQL 서버에 시스템 명령을 실행

환경이 까다로워 발생하기 어려움

 


OS Command Injection

사용자 입력값에 운영체제 명령어를 주입하여 서버를 제어하는 공격

 

서버에 설치된 프로그램을 호출하거나, 임의의 파일을 읽고 쓰거나, 네트워크 연결을 만드는 등 서버 전체에 대한 공격 가능

 

운영체제 제어 방식

- CLI (Command Line Interface)

- GUI (Graphic User Interface)

 

📌 사용자 입력값을 통해 시스템 명령어를 실행하도록 되어있는 특정 기능에 대해 시스템 명령어를 삽입하여 공격

SQL Injection VS Command Injection

 

Command Injection이 더 위험함에도, SQL Injection 취약점이 훨씬 많기 때문에 SQL Injection이 주목받는다.

 

Command Injection에 자주 쓰이는 Linux 명령어

cat : 파일 내용을 화면에 표시함

ls : 현재 디렉터리의 파일 목록을 표시함

whoami : 현재 사용자의 이름을 표시함

Command Injection에 자주 쓰이는 메타 문자

- 다중 명령어 사용

; (Command Sequence) : 앞의 명령어의 성공 여부와 관계 없이 다음 명령어 실행

&& (AND conditional execution) : 앞의 명령어가 실패하면 다음 명령어를 실행하지 않음

|| (OR contidional execution) : 앞의 명령어가 성공하면 다음 명령어를 실행하지 않음

 

- 파일 이름 유추

* (File subtitution wildcard; zero or more characters) : 파일 이름의 일부를 *로 대체하여 명령할 수 있음

 

- 앞의 명령어의 결과를 다음 명령어로 전달

| (Pipe) : 앞의 명령어의 실행 결과가 다음 명령어의 입력으로 사용

> (Output redirection) : 앞의 명령어의 실행 결과를 뒤에 입력되는 파일로 저장