본문 바로가기

프로젝트/DVWA 실습

DVWA 실습 #8-3 - SQL Injection(high)

2021/01/15 - [프로젝트/DVWA 실습] - DVWA 실습 #8 - SQL Injection

 

DVWA 실습 #8 - SQL Injection

DVWA의 일곱 번째 실습 대상인 SQL Injection이다. 현재 데이터베이스에는 5명의 사용자 정보(이름, 비밀번호 등)가 저장되어 있으며 SQL Injection으로 이들의 비밀번호를 탈취하는 것이 목적이다. 현재

haruhiism.tistory.com

문제 해결 방법

이번 단계에서는 로그인한 사용자의 세션에 id 조회 파라미터를 담고 있다. 그래서 한번 조회한 값은 다른 실습 페이지로 이동했다가 돌아와도 그대로 남아있는 것을 볼 수 있다. 하지만 굳이 별도의 창을 띄우는 것은 Burp Suite의 Repeater 같은 툴로 요청을 반복할 수 있기 때문에 SQL Injection을 방어하는 데 별다른 도움이 될 수 없다. 그리고 결정적으로 SQL Injection에 대한 필터링이 없기 때문에 이전과 비슷하게 공격할 수 있는데 이번에 다른 점은 맨 마지막에 LIMIT 구문이 붙어서 결과를 하나만 출력하고 있다는 것이다.

SELECT first_name, last_name FROM users WHERE user_id = '' or '1'='1' LIMIT 1;

이는 기존에 SQL Injection에 의해 WHERE 조건절이 항상 참이 되어 모든 데이터가 출력되는 것을 방지하기 위해 한번에 하나의 데이터만 출력하도록 LIMIT 1처럼 제한한 것이다. 그러나 아직 코드에는 여러개의 데이터가 반환되었을 경우 이를 출력하기 위한 while 문이 남아있기 때문에 주석 문자를 사용하여 LIMIT 구문을 지워버리면 전부 다 출력되는 것을 볼 수 있다.

SELECT first_name, last_name FROM users WHERE user_id = '0' union select user_id, password from dvwa.users#' LIMIT 1;

이는 취약점을 보완하려면 SQL 쿼리 뿐 아니라 이를 활용하는 코드도 취약한 부분을 찾아 보완해야 한다는 것을 일깨워준다.