Blind SQL Injection ?
- 쿼리의 결과를 참 또는 거짓으로만 출력하는 페이지에서 사용할 수 있는 SQL Injection 공격 기법
- 출력 내용이 참 또는 거짓으로만 구성된 웹 페이지에서 참/거짓 정보를 이용해 데이터베이스의 내용을 추측하는 공격 방식
- Brute Force 공격과 비슷하게 상당히 많은 경우의 수를 대입해보며 공격을 수행해야 하기 때문에 일반적으로 자동화 도구를 이용하여 공격을 수행한다.
DVWA 환경에서 SQL Injection (Blind) 공격 실습
우선 본 실습에 앞서 실습 환경의 경우 리눅스 환경에서 DVWA 환경을 구축한 후 가장 취약한 환경인 Low 레벨 환경에서 실습을 진행하였습니다.
Blind SQL Injection 공격을 실습하기 위해 해당 탭으로 들어온 모습입니다.
User ID 입력란에 번호를 입력하면 해당 번호에 사용자 계정의 유무를 판단해주는 기능이 있는 것을 확인할 수 있습니다.
해당 번호에 사용자가 존재하는 경우좌측 사진과 같이 User ID exists in the database. 라는 문구를 출력해주는 것을 확인할 수 있고, 사용자 계정이 존재하지 않는 번호를 조회할 경우 우측 사진과 같이 User ID is MISSING from the database.
라는 문구를 출력하는 것을 확인할 수 있습니다.
자동화 도구를 이용한 Blind SQL Injection 공격을 수행하기 전 간단하게 Blind SQL Injection 공격 방법을 설명하기 위해 직접 Blind SQL Injection 공격을 수행해본 사진입니다.
우선 Blind SQL Injection 은 내가 입력한 값이 참인지 거짓인지의 정보를 기반으로 실제 값을 추정하는 방식의 공격입니다.
위 사진에서는 length() 함수와 database()를 이용하여 ' or length(database()) = 숫자-- 라는 구문을 작성해 데이터베이스 이름의 길이를 구하는 공격을 수행한 것입니다. 입력된 숫자를 1부터 증가시키며 참 값의 출력이 나올 때까지 시도하여 데이터베이스 이름의 길이를 알아내는 공격을 수행한 결과 3을 입력할 때까지는 거짓일 때의 문구가 출력되었지만 4를 입력한 결과 참일 때 결과를 반환한 것을 확인하였을 때 데이터베이스 이름의 길이는 4글자라는 정보를 획득할 수 있습니다.
이러한 방식으로 다양한 함수들을 이용하여 참/거짓 정보를 확인하고 값을 알아내가는 공격이 Blind SQL Injection 공격입니다.
이 때 사람이 일일이 모든 경우의 수와 함수를 입력하며 공격을 수행할 경우 상당히 오랜 시간이 걸리기 때문에 보통 해당 과정을 자동화하여 공격을 진행하는데 이 때 자동화 해주는 툴 중 하나가 SQLMAP 이라는 툴입니다.
리눅스 터미널에서 sqlmap을 실행하고 타겟 URL과 cookie 정보를 설정한 후 --current-db 옵션을 사용하여 데이터베이스 이름을 알아내는 공격을 수행한 결과 데이터베이스 이름은 'dvwa' 라는 것을 알아낼 수 있습니다.
알아낸 데이터베이스 이름을 기반으로 SQLMAP을 이용하여 데이터베이스에 있는 테이블들을 --tables 옵션을 사용하여 알아내는 공격을 수행한 결과입니다.
dvwa 라는 이름의 데이터베이스에는 guestbook 이라는 테이블과 users 라는 이름의 테이블이 존재하는 것을 확인할 수 있습니다.
이 중 users 라는 테이블에 모든 사용자의 계정 정보와 패스워드 정보가 있을 확률이 높을 것으로 예상되어 users 라는 테이블을 좀 더 상세하게 살펴보기로 하였습니다.
알아낸 데이터베이스 이름과 테이블 정보를 기반으로 users 테이블의 모든 항목을 덤프한 결과입니다.
우측 사진에 보이는 것과 같이 users 테이블에 있는 모든 정보들이 출력되는 모습을 확인할 수 있습니다.
이 중 password 라는 이름의 Columns 에 있는 정보들은 MD5 해시 값으로 저장되어 있는 것을 확인할 수 있는데 해당 정보는 복호화하여 우측에 표시 해주는 것도 확인할 수 있습니다.
이전 users 테이블에 있는 정보에서 pablo 라는 사용자 계정과 패스워드를 이용해 DVWA 웹 페이지에서 로그인한 결과
계정 탈취에 성공하여 로그인에 성공한 모습을 확인할 수 있습니다.
Blind SQL Injection 대응 방안
Blind SQL Injection 대응 방안의 경우 이전 SQL Injection 공격 대응 방안과 같습니다.
- Prepared statement 구문을 사용하여 입력된 값은 모두 문자열로서만 처리되도록 구현하는 것이 가장 안전하다.
- 하지만 여러 이유로 Prepared statement 구문을 사용하여 구현하지 못하는 상황이 있을 수 있다. 그럴 경우 입력된 값이 개발자가 의도한 값인지 검증할 수 있는 로직을 구현하여 불필요한 특수 문자 등은 입력되지 않도록 구현해야 한다.
위 예시는 특정 문자가 입력될 경우 자동으로 공백으로 치환되도록 설정하고 SQL 구문이 입력란에 입력될 경우 에러 팝업창이 출력되도록 설정하여 불필요한 문자는 입력하지 못하도록 제한한 코드이다.
- WAS 설정 파일(위 예시는 php 설정 파일)에서 에러메시지는 출력 되지 않도록 설정해야 한다.
- 웹 방화벽(WAF, Web Application Firewall)을 사용하여 부적절한 요청이 전송될 경우 차단한다.
'CERT > 웹 모의해킹 실습' 카테고리의 다른 글
[웹 해킹] DOM Based XSS / DVWA 환경 실습 / 대응 방안 (0) | 2023.06.21 |
---|---|
[웹 해킹] Weak Session IDs / DVWA 환경 실습 / 대응 방안 (0) | 2023.06.21 |
[웹 해킹] SQL Injection / DVWA 환경 실습 / 대응 방안 (0) | 2023.06.14 |
[웹 해킹] Insecure CAPTCHA / DVWA 환경 실습 / 대응 방안 ( 캡챠 우회 공격 ) (0) | 2023.06.03 |
[웹 해킹] File Upload 공격 / DVWA 환경 실습 / 대응 방안 (0) | 2023.06.03 |