[TryHackMe] SQL Injection

코준·2025년 6월 27일

TryHackMe

목록 보기
23/32

SQL Injection

SQLi라고도 불리는 SQL 삽입 공격은 웹 애플리케이션 데이터베이스 서버에서 공격자가 쿼리를 실행시켜 데이터를 탈취하는 공격이다.

데이터베이스와 SQL에 대해서 짧게 알아보자.

Database

데이터베이스는 DBMS(Database Management System)에 의해 제어되는 조직화된 데이터 저장 방식이다.

DBMS는 관계형과 비관계형으로 나뉘는데, 이 챕터에서는 관계형 데이터베이스에 초점을 맞춘다.
일반적으로 MySQL, MsSQL, Access, PostgreSQL, SQLite 등이 있다.

일반적인 데이터베이스 서버의 형태로 서버는 여러 개의 데이터베이스를 가질 수 있고 각 데이터베이스는 자체적인 데이터 세트를 포함한다. 저장하고 싶은 정보에 대해서 테이블을 사용해 저장하는데, 고유의 이름으로 분류된다.

테이블은 Columns과 rows로 구성되는 표와 같다.

  • Columns(열)

각 열은 필드라고 부르며 고유한 이름을 가진다. 열을 생성하면 데이터 타입을 설정할 수 있고 정수, 문자열 및 위치 정보와 같이 복잡한 데이터를 포함할 수 있다.

정수를 가지는 열은 Auto-Increment기능으로 고유 번호를 오름차순으로 부여한다. 이렇게 하면 Key가 생성되고 모든 행에 대해 고유한 인자(Index)로서 사용 가능하다.

  • Rows(행)

행 또는 레코드(records)라고 부르는 개별 데이터 라인이다. 테이블에 데이터를 추가하면 테이블이 가진 필드에 해당한 데이터가 채워진 하나의 레코드가 생성된다.

Relational vs Non-Relational DB

관계형 데이터베이스(이하 DB)는 데이터가 저장된 테이블이 서로 정보를 공유한다.
필드를 사용해서 저장될 데이터를 정의하고, 행을 사용해서 실제 데이터를 하나씩 저장한다.

종종 기본 키(Primary Key)를 가진 필드가 포함되고, 고유ID로서 다른 테이블에서 참조돼 테이블 간의 관계를 형성한다.

비관계형 DB는 데이블, 필드, 행을 사용해서 데이터를 저장하지 않는 모든 종류의 DB를 말한다.

특정 레이아웃을 구축할 필요가 없기 때문에 각 데이터 필드가 다른 정보를 포함할 수 있어 관계형 DB보다 유연하다.

SQL(Structured Query Language)

SQL은 DB를 쿼리하는 데 사용되는 기능이 있는 언어이다.
간단하게 검색(SELECT), 업데이트(UPDATE), 삽입(INSERT) 및 삭제(DELETE)하는 명령어가 사용된다.

데이터를 정의(Definition)하고, 조작(Manipulation)하며, 조작한 결과를 적용하거나 취소(Transaction Control)하고, 접근권한을 제어(Control)하는 처리할 수 있는 언어로 구성된 것이 아주아주 쉽게 말하는 SQL이다.

그 밖의 SQL에 대해서는 설명하지 않겠다.

SQL Injection

SQL 인젝션은 웹 애플리케이션이 사용자로부터 받은 데이터를 SQL 쿼리에 직접 포함할 때 발생할 수 있다.

시나리오를 가정해보자.
블로그에서 각 게시물이 고유 ID를 가지고, 공개 또는 비공개로 설정될 수 있다고 할 때, 블로그의 1번 게시물은 https://website.thm/blog?id=1의 URL을 가질 수 있겠다.

id 매개변수는 쿼리스트링을 통해 선택된 블로그의 게시물을 나타낸다.
웹 애플리케이션은 데이터베이스에서 id=1에 해당하는 게시물을 검색해야 하고

SELECT * from blog where id=1 and private=0 LIMIT 1;와 같은 SQL문을 사용할 수 있다.

blog테이블에서 id가 1이며, private=0으로 설정된 공개 게시물이며 결과는 1개로 제한하는 SELECT SQL문이다.

위 예시에서 조회문자열의 id가 SQL에 직접 사용되는 것을 확인할 수 있다.

이제 id=2게시물이 비공개로 설정돼 블로그에서 열람할 수 없다고 가정해보자.

이때 이 게시물을 강제로 열람하고 싶은 익명의 유저는
https://website.thm/blog?id=2;--을 호출했다.

이 URL은 결과적으로 SELECT * from blog where id=2;-- and private=1 LIMIT 1;의 SQL문이 생성된다.

;은 SQL문의 끝을 나타내고, --은 그 뒤 모든 내용을 주석으로 처리한다는 뜻이다.

때문에 결과적으로 SELECT * from blog where id=2;의 쿼리만 실행된다.

In-Band SQL 인젝션이라는 유형의 SQL 인젝션 취약점을 사용해서 비공개로 설정된 게시글을 읽을 수 있을 것이다.

profile
Hi !

0개의 댓글