본문 바로가기
인터넷 보안/실습

[인터넷 보안] SQL Injection

by 볼링치는 개발자 2021. 6. 11.
반응형

SQL Injection이란?

SQL Injection은 웹으로부터 데이터베이스에 전송되는 SQL 쿼리문을 공격자가 조작하여 데이터를 변조하거나, 데이터베이스 정보들을 조회하는 공격입니다.

취약한 데이터베이스는 이런 공격을 받고 비정상적인 동작을 합니다.

비교적 쉬운 공격이지만 엄청난 피해를 줄 수 있습니다.

 

SQL Injection의 공격 방법에는 Where 절을 이용한 공격, Union 명령어를 이용한 공격, Boolean based 공격, Time based SQL, 저장된 프로시저 공격 등이 있습니다.


Where 공격

Where 절을 이용한 간단한 공격에 대해 얘기해보겠습니다.

사용자가 ID 가 1인 사용자 정보를 요청하면, SQL문은 다음과 같이 전송됩니다

SELECT name, email FROM users WHERE ID='1'

이때 공격자가 ID를 입력하는 란에 1이라고 안 적고 1' or '1' = '1이라고 입력합니다.

SQL문은 다음과 같이 전송됩니다.

SELECT name, email FROM users WHERE ID = '1' or '1' = '1'

이 SQL문은 ID가 1이거나, 항상 참이라는 구문이 삽입되어 모든 사용자의 개인정보를 불러옵니다.


Union 공격

Union을 이용한 간단한 공격에 대해 얘기해보겠습니다.

앞서 언급한 상황과 같이 사용자가 ID가 1인 사용자 정보를 요청합니다.

이때 공격자가 1' union select name, pw from users#라는 입력을 합니다.

그럼 SQL문은 다음과 같이 전송됩니다.

SELECT name, email FROM users WEHRE ID='1' union select name, pw from users#'

union으로 인해 앞의 select문에서는 ID가 1인 사용자 정보를 불러오고, 두 번째 select문에서는 users에 있는 모든 사용자 이름과 비밀번호를 조회합니다.

마지막에 # 은 주석 처리할 때 사용하므로 뒤에 SQL을 무효화하고 공격자가 원하는 SQL문만 전달합니다.


실습

이제 DVWA에서 SQL Injection 실습을 진행해 보겠습니다.

DVWA의 SQL Injection메뉴로 가서 입력창에 1을 입력하고 요청을 전송하면, ID가 1인 사용자 정보를 조회할 수 있습니다.

웹 페이지가 SQL Injection에 취약한지 알아보는 방법으로는 입력 칸에 '을 하나 입력하는 것입니다.

DVWA에서 '을 입력하고 [Submit] 버튼을 누르면 다음과 같은 SQL 에러 문이 뜹니다.

 이 에러문으로 우리는 이 사이트가 SQL문으로 입력을 처리한다는 것을 알 수 있습니다.

 

이제 입력 창에 1' or '1' = '1을 입력해보겠습니다.

항상 참이라는 조건을 걸어줘서 테이블에 있는 모든 사용자 정보를 조회할 수 있습니다.

 

Union을 사용한 공격을 해보겠습니다.

 

Union은 합집합인데, union을 사용하기 위해서는 원래 쿼리문이 조회하는 select문의 칼럼 개수와 union 뒤의 select문의 쿼리 개수가 동일해야 사용할 수 있습니다.

 

입력창에 1' union select 1#을 입력해보겠습니다.

다음과 같이 칼럼의 개수가 다르다는 에러를 볼 수 있습니다.

 

이번에는 입력창에 1' union select 1,2#을 입력해보겠습니다.

이번에는 에러가 발생하지 않고 원래 아이디에 대한 정보와, 두 번째 select문의 결과인 1,2가 합집합으로 같이 나왔습니다.

 

입력창에 1' union select 1,2,3#을 입력해도 에러가 뜹니다.

 

이렇게 첫번째 select문은 2개의 칼럼을 사용하는 것을 알게 됩니다.

 

Union키워드 말고 칼럼의 개수를 알아내는 방법은 order by 키워드를 사용하는 것입니다.

Select문의 마지막에 order by 1을 하면, 1번째 칼럼을 기준으로 정렬하라는 것인데, oreder by 뒤에 칼럼의 개수보다 큰 숫자를 입력하면 에러가 발생하기 때문입니다.

 

이제 본격적으로 데이터베이스 정보를 빼내 보겠습니다.

 

입력창에 다음과 같이 입력합니다.

<데이터베이스명 모두 조회>

1' union select schema_name,1 from information_schema.schemata #

First name옆에 정보들을 보면 모든 데이터베이스의 이름을 확인할 수 있습니다.

schema_name에 해당하는 정보가 First name 옆에 떴고, 1이라고 요청한 것이 그대로 1로 떴습니다.

 

입력창에 다음과 같이 입력합니다.

<dvwa 데이터베이스의 테이블 명 조회>

1' union select table_schema, table_name from information_schema.tables where table_schema = 'dvwa' #

결과에서 볼 수 있듯이 dvwa 데이터베이스에는 guestbook과 users라는 2개의 테이블이 있습니다.

 

입력창에 다음과 같이 입력합니다.

<uesrs 테이블 칼럼 조회>

1' union select table_name, column_name from information_schema.columns where table_schema = 'dvwa' and table_name = 'users'#

결과에서 알 수 있듯이 users 테이블에는 user_id, first_name, last_name, user, password, avatar의 칼럼이 있습니다.

 

그럼 이제 입력창에 다음과 같이 입력해봅니다

1' union select user, password from users#

결과에서 보이듯이 user와 비밀번호 정보를 모두 조회할 수 있습니다.

비밀번호를 보면 hash값으로 보호하고 있는 것을 알고 있습니다.

하지만 DVWA에서 사용하는 hash는 MD5방식을 사용해 구글에 검색만 해봐도 어떤 값인지 바로 알 수 있습니다.

반응형

'인터넷 보안 > 실습' 카테고리의 다른 글

[인터넷 보안] XSS (Kali, Ubuntu 사용)  (1) 2021.06.12
[인터넷 보안] XSS  (0) 2021.06.12
[인터넷 보안] SQL Injection - SQL Map  (0) 2021.06.12
[인터넷 보안] CSRF 공격  (0) 2021.06.11

댓글