4. Penetration Testing

SQLMap 실습

dhkstn 2024. 1. 31. 17:19

. SQLMap이란


  파이썬으로 개발된 툴로 Kali Linux안에 설치되어 있는 프로그램이다. SQLMap은 터미널로 명령어를 입력하면서 SQL Injection 취약점을 찾고 공격하는 과정을 자동화한 취약점 진단 도구이다. DB정보와 데이터 추출, 쉘 침투를 통한 시스템 공격 등이 가능하다.

 

. SQL Injection


1) SQL Injection이란?

  웹 해킹 기법 중 하나로 아래 그림과 같이 악의적인 사용자가 웹 보안상 취약점을 이용하여, 임의의 SQL 쿼리 문을 전송하여 공격자가 원하는 DB의 중요 정보를 가져오는 해킹 기법을 말한다.

 

2) SQL Injection (POST/Select) 방식 실습

  위 그림 sqli_13.php는 드롭다운 메뉴를 사용하여 선택한 영화의 정보를 표로 보여준다. 또한, POST 메소드 사용으로 URL에 변수가 보이지 않는다. Proxy 도구인 버프스위트(Burp Suit)SQL Injection을 시도해 보자. 

 

  실습은 칼리리눅스 환경에서 진행하였고, Burp Suite로 확인해 보니 드롭다운 메뉴의 변수명이 movie인 것을 알 수 있었다. 

  SQL 인젝션 공격을 시도하기 위해, 기존 쿼리와 결합하여 결과를 출력하는 UNION SELECT 구문을 사용해 보자

  movie 변수에 조작된 SQL 구문 "@ union select null, host, user, password, null, null, null FROM mysql.user"을 넣고 forward를 하여 결과 값을 확인한다. 아래 그림을 보면 성공적으로 SQL Injection이 수행되었고, 결과 값에 따라 IDroot이고 비밀번호가 해쉬 함수로 이루어져 있는 것을 알 수 있다.

 

3) John the Ripper

  존 더 리퍼 도구를 사용하여 위에서 얻은 해쉬 값을 풀어보자. 우선 칼리리눅스에서 touch 명령어로 passwd.txt 파일을 만들고 nano 명령어로 passwd.txt 파일에 해쉬 값을 저장한다.

  다음으로 존 더 리퍼 도구 명령어 john -show passwd.txt를 사용하면 아래 그림과 같이 root 계정의 패스워드 ’bug’가 나온다.

 

. SQLMap 사용법


  Burp Suitesql 구문을 넣으면 수동으로 확인할 수 있는 정보가 적기 때문에 SQL 인젝션 자동화 도구인 ‘sqlmap’을 사용하여 데이터베이스와 테이블 명을 알아본다.

1) SQLMap의 자주 사용하는 옵션 (sqlmap h)

[-u URL] : 공격을 수행할 페이지 주소 지정

[--cookie=COOKIE] : 쿠키 값 지정

[--data DATA] : POST 방식으로 데이터가 전달될 때, 해당 데이터를 지정

[-p TESTPARAMETER] : 공격을 수행할 파라미터를 지정

[-v VERBOSE] : 명령어 수행을 얼마나 상세하게 출력할 것 인지를 지정 (0~6)

[--passwords] : 사용자들의 패스워드 해시값을 출력

[--tables] : 데이터베이스의 테이블들을 출력

[--columns] : 데이터베이스 테이블의 컬럼들을 출력

[--dump] : 데이터베이스 테이블 엔트리를 덤프

[--dbs] : 데이터베이스 리스트 출력

[-D DB] : 특정 데이터베이스 지정

[-T TBL] : 특정 테이블 지정

[-C COL] : 특정 컬럼 지정

 

2) SQLMap 사용

  sqlmap -u 옵션에는 자동화 공격을 시도할 페이지의 주소를 입력하고 POST 메소드를 사용하기 때문에 --data 옵션을 사용하여 인젝션을 시도할 변수를 명시한다. 또한, bWAPP는 로그인을 해야 사용 가능하기 때문에 --cookie 옵션으로 쿠키 값을 입력해야 변수에 대한 자동 인젝션 공격이 수행된다.

 

  SQL Injection (POST/Select) 실습과 같은 방법으로 Burp Suite를 이용해 쿠키 값을 찾는다.

  • 취약한 페이지 주소 : http://192.168.133.131/bWAPP/sqli_13.php
  • 취약한 변수 : Movie

  다음으로 아래 그림과 같은 sqlmap 명령어 사용으로 bWAPP 서버의 데이터베이스 버전과, 웹 서버의 자세한 설명이 나왔고 무엇보다 중요한 정보인 데이터베이스 이름이 노출되었다.

 

   데이터베이스를 알아낼 때 취약한 파라미터가 movie 뿐이므로 p 옵션에서 SQL 인젝션을 시도할 변수 movie로 지정한다. 또한, 테이블 명을 알아보기 위하여 --dbs 옵션 대신 --tables 옵션을 넣어 위 그림과 같이 sqlmap 명령어를 입력한다.

  --dbs 옵션을 사용했을 때 보았던 데이터베이스들의 테이블이 전부 출력된다. sqli_13.php페이지의 데이터베이스는 bWAPP이므로 bWAPP 테이블 명만 확인한다. movies 변수에는 현재 페이지에서 사용하는 정보, users 테이블에는 사용자 정보가 저장되어 있다고 추측한다.

 

  이번에는 users 테이블의 칼럼을 확인하기 위해 --tables 옵션 대신 --columns 옵션을 사용한다.

  위 그림을 살펴보면 bWAPP라는 데이터베이스에서 users라는 테이블의 총 9개의 칼럼이 출력되었는데, 그중 중요해 보이는 칼럼인 id, login, password3개의 칼럼 값을 알아내기 위해 SQL Injection (union 베이스) 쿼리문을 작성한다.

 

  • 쿼리문> 0 union select null, id, password, login, email, null, null from users
    • 위 쿼리문을 Burp Suite‘movie’ 변수 안에 넣어준다.

  버프스위트로 조작한 쿼리를 Forward 하면, 페이지에 사용자 계정 정보가 노출된다.

 

3) John The Ripper

  이번에도 John the Ripper 도구를 이용하여 위에서 얻은 해쉬 값을 풀어보자. 우선 칼리리눅스에서 touch 명령어로 183801.txt 파일을 만들고 nano 명령어로 183801.txt 파일에 해쉬 값을 저장한다.

  다음으로 존 더 리퍼 도구 명령어 john show 183801.txt를 사용하면 아래 그림과 같이 aim 계정의 패스워드 ’bug’가 나온다.

 

4) 대응 방안 (SQL Injection post/select)

  아래 코드는 비박스 환경의 /var/www/bWAPP/sqli_13-ps.php 코드이다.

  이 페이지는 bind_param이라는 함수를 사용하는데 bind_param 함수는 바인딩을 이용하는 함수이다. 이 함수를 사용하여 쿼리에 값을 직접 입력하지 않고 일단 ‘?’로 처리한 다음 그 자리에 값을 삽입하는 방식인 것이다.

 

  즉, DB에서 컬럼을 개별로 호출하고 연결하는 방식으로 SQL Injection을 막고 있기 때문에 공격 수행이 불가능해진다.

 

. 결론


  SQL Injection 공격을 실습해 본 결과, 데이터베이스와 연동된 응용프로그램에서 입력된 데이터에 대한 유효성 검증을 하지 않는 경우, 공격자가 입력 데이터에 SQL 쿼리문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있게 된다는 것을 알게 되었다.

 

  이에 따라 항상 사용자 입력 값 검증을 해야 하고, 비정상적인 입력값(‘, “, #, --, = )을 필터링 해야 한다는 것을 깨달았다. 또한, 데이터 길이를 제한하며 IDS/웹 방화벽을 구축해야 SQL Injection 공격에 효과적으로 대응할 수 있다는 것을 알게 되었다.

 


참고자료 및 출처