본문 바로가기

웹해킹

웹해킹 #3 SQL 인젝션

1. SQL 인젝션

 

- 웹 서버 영역의 데이터베이스로 전송되는 SQL 쿼리문을 사용자가 임의로 조작 가능할 때 발생

- 허가되지 않은 정보에 접근하거나 데이터 변조

 

이론

 

사례 ① WHERE 구문 우회

$id = $_REAUEST[ ‘id’ ];

$query = “SELECT name, email FROM users WHERE id = ‘$id’;”;

 

- 코드 내에 위와 같은 SQL 쿼리문 코드가 존재함

- ‘or’ 키워드가 삽입되어 WHERE 문의 조건이 항상 참이 되어 모든 사용자의 정보 전달됨

- ID=1인 사용자와 1=1이 무조건 참이므로 모든 사용자의 정보 노출

 

사례 ② UNION 구문 활용

- UNION은 합집합으로 두 개의 SELECT 구문의 결과를 모두 포함

- ‘#’ : 뒤에 오는 내용 주석 처리 (가장 끝의 문자로 인해 에러가 발생할 수 있기 때문에 : '짝이 맞지 않음)

 

실습 (BWAPP Low level 기준)

 

WHERE 구문 우회 실습

- 1’ or ‘1’=‘1 입력해보기

- ID=1인 사용자와 그 외 모든 사용자의 정보 확인 가능

 

UNION 공격 실습

 

* UNION 공격 실습에 앞서 코드 속 SELECT문에서 몇 개의 column을 지정하고 있는 지와 테이블 이름과 어떤 데이터를 가지고 있는 지 알아내어야 한다!

 

순서 : ORDER BY로 colum 지정 수 알아내기 -> 데이터베이스 이름 알아내기 -> 데이터베이스 내의 테이블 알아내기

        -> 테이블 데이터 알아내기 -> 비밀번호 알아내기

 

<ORDER BY>

- UNION을 사용하기 위해서는 원래 SQL 쿼리문이 조회하는 SELECT 문의 칼럼 개수 =

   UNION 뒤의 SELECT 문에서 요청하는 칼럼 개수

- ORDER BY : 지정된 칼럼을 기준으로 결과를 정렬할 때 사용하는 키워드이며, 위치 인덱스도 이용 가능

- ORDER BY 구문을 이용하여 칼럼 개수 알아낼 수 있음

- 에러가 발생하기 직전의 값이 칼럼의 개수가 됨

 

- 1’ ORDER BY [num]# 입력해보기

오류 x

 

오류 x
오류 발생!

-> 전체 column의 개수가 2개이다!

 

- ‘ UNION SELECT 1,2# 입력해보기

- 첫번째 SELECT문에서는 아무 ID를 지정해주지 않았으므로 출력 결과가 없고, 두 번째 SELECT문에서는 이름이 1,2인 column이 테이블 내에 존재하지 않기 때문에 디폴트 값처럼 숫자 1,2가 그대로 출력되는 것을 확인할 수 있다.

 

<데이터 베이스 이름 알아내기>

- Mysql 데이터베이스는 information_schema라는 데이터베이스에서 데이터베이스의 이름,

   테이블, 칼럼 정보 등 관리

- Information_schemaschemata 테이블로부터 schema_name을 가져오는 쿼리문 이용

- ' UNIONSELECTschema_name,2 from information_schema.schemata# 입력

데이터베이스 목록이며 추측 상 bWAPP가 우리가 알아야하는 데이터베이스임을 알 수 있다!

<dvwa 데이터베이스의 테이블 목록 알아내기>

- table_schemdvwa인지 확인하는 조건을 주어 dvwa 데이터베이스의 테이블만 출력

- ' UNION SELECT table_name,2 from information_schema.tables where table_schema 입력

테이블 목록이며 이 중 users가 우리가 찾는 테이블임을 추측

<테이블 데이터 알아내기>

- ' UNION SELECT column_name,2 from information_schema.columns where table_schema='dvwa' and table_name='users'# 입력

데이터 목록(column 목록)이며 이 중 user와 password를 통해 비밀번호를 알아낼 수 있을 것이라 추측

<비밀번호 알아내기>

- ' UNION SELECT user,password from users# 입력

비밀번호를 알아낼 수 있음! (현재는 인코딩 되어있음!)

 

2. SQL 인젝션 공격 대응

 

- 입력값 검증

- 시큐어 코딩을 통한 대응

  : 사용자가 입력한 값이 오직 데이터로만 사용되어야하고 SQL 쿼리문의 구조에 영향을 줄 수 없도록 코딩

 

 

추후에 블라인드 sql 인젝션 구문과 bwapp 실습사이트 난이도별 풀이를 추가할 예정이다...