SQL 인젝션(Injection)은 웹 해킹 공격 중 하나로
공격자가 악의적인 SQL 코드를 입력하여 데이터베이스 쿼리를 조작해 데이터베이스를 공격하는 것이다.
이를 통해 공격자는 데이터베이스에 있는 데이터를 가져오거나 수정하거나 삭제할 수 있다.
또한 나아가 인증을 우회하거나 관리자 권한을 획득할 수도 있다.
SQL Injection은 실제 해킹 방법으로 상용 웹페이지에 사용하는 것은 엄연한 불법이다.
연습용 서버를 준비하거나 DVWA를 이용하자.
DVWA에서 SQL 인젝션 공격을 실행해 보자.
인젝션 공격 실행 전, 먼저 난이도를 Low로 변경해야 한다.
초반 설정인 Impossible에선 공격이 통하지 않기 때문이다.
난이도 변경 방법은 이전 포스팅을 참고하자.
[웹 해킹] 2. DVWA 보안 난이도 조정하기
DVWA를 실행하면 다음과 같은 화면이 나타난다.우선 왼쪽 메뉴 중 DVWA Security를 클릭하자. 여기서는 DVWA의 보안 난이도를 정할 수 있다.지금은 Impossible로 되어 있는데 이 난이도는 해킹이 거의
mr-relax.tistory.com
먼저 왼쪽 메뉴에서 SQL Injection을 선택하자.
다음과 같은 화면이 나온다.
이제 SQL Injection 공격을 시도할 수 있다.
1. 사용자 정보 알아내기
User ID 입력 창에 1’ OR ‘1’=‘1 을 입력해 보자.
입력하면 다음과 같이 데이터베이스에 등록된 모든 사람의 이름이 나타난다.
이것이 무슨 상황인지 알아보자.
하단에 있는 View Source 버튼을 누르면 현재 페이지에 적용된 php소스 파일이 나타난다.
이 중 우리가 주목해야 할 부분은 이 곳이다.
User ID에 값을 입력하면 이 쿼리문에서 입력값을 처리한다.
$id 변수에 사용자가 입력한 값이 들어가 쿼리 연산을 하는 것이다.
SELECT first_name, last_name FROM users WHERE user_id = '$id';
이 값을 하나씩 분석해 보자.
SELECT first_name, last_name #사용자의 first_name과 last_name을 보여줘라.
FROM users #user 테이블에 존재하는 것으로.
WHERE user_id = '$id'; #user_id가 사용자가 입력한 $id값과 동일한 것으로.
User ID에 1' OR '1'='1 를 입력하면 위 쿼리문이 다음과 같이 적용된다.
SELECT first_name, last_name FROM users WHERE user_id = '1' OR '1'='1';
원래는 사용자가 입력한 값에 해당하는 user의 first_name과 last_name만 출력해야 하는데
WHERE user_id = '1' OR '1'='1' 구문으로 인해 현재 데이터베이스에 있는 모든 값을 출력하게 되어 버린다.
A OR B 연산은 A나 B중 하나만 참(True)이어도 모두 참으로 인식하기 때문이다.
'1' OR '1'='1' 에서 '1'='1'이 참이기 때문에 앞에 무슨 값이 들어오든 상관없이 모든 값을 참으로 인식하는 것이다.
결국 데이터베이스에 있는 모든 user 데이터가 출력된다.
DVWA 데이터베이스에 있는 user 데이터는 다음과 같다.
SQL Injection이 성공한 사진과 비교해보면 같은 정보가 출력되었다는 것을 알 수 있다.
2. 주석 사용하기
몇 가지 SQL Injection 공격 방법을 더 알아보자.
이번엔 User ID 입력창에 1'; -- 을 입력하자.
주의할 것은 -- 뒤에 한 칸 공백을 주어야 한다는 것이다.
그렇지 않으면 다음과 같은 에러가 발생한다.
만일 정상적으로 공격이 성공했다면 다음과 같은 화면이 나타날 것이다.
다시 전체 쿼리문을 보자.
1'; -- 을 입력하면 아래와 같이 쿼리문이 작동한다.
SELECT first_name, last_name FROM users WHERE user_id = '1'; -- ';
SQL에서 -- 은 주석을 뜻한다.
위 쿼리문을 실행하면 -- 뒤에는 어떤 쿼리문이 등장하던 주석 처리가 되어버리기 때문에 실행되지 않는다.
그래서 위 화면에서는 ID가 1인 user의 데이터만 출력이 된 것이다.
3. UNION SELECT 사용해서 쿼리문 추가하기
이번에는 입력창에 1' UNION SELECT user(), null -- 을 입력해 보자.
-- 뒤에 공백 한 칸을 추가하는 것을 잊지 말자.
결과는 다음과 같이 나타난다.
UNION의 경우 두 개의 쿼리를 합해서 결과를 출력하는 명령어다.
이 경우 SELECT 문에서 출력하는 열의 수는 두 쿼리문이 동일해야 한다.
앞의 쿼리문인 SELECT first_name, last_name 가 두 개의 열을 출력하기 때문에
뒤에 이어서 나타나는 쿼리문도 두 개의 열을 출력해야 한다.
그래서 필요없는 null 값을 넣어 다음과 같은 쿼리문을 만드는 것이다.
SELECT user(), null
user()의 경우 현재 데이터베이스 사용자 이름을 반환하는 함수이다.
공격자는 이를 통해 데이터베이스에 연결된 사용자 계정을 알아낼 수 있다.
지금 연결된 계정은 dvwauser@localhost 임을 알 수 있다.
4. 데이터베이스 버전 알아내기
이번에는 다음과 같은 구문을 입력해 보자.
1' UNION SELECT @@version, null --
성공했다면 다음과 같은 결과가 나타난다.
@@version은 현재 사용하는 데이터베이스의 버전을 보여주는 명령어이다.
공격자가 데이터베이스 버전을 안다면 취약점을 쉽게 알아낼 수 있기 때문에 알려져서는 안 된다.
다음 시간에는 SQL Injection을 방어하는 방법에 대해 알아보자.
'모의 해킹' 카테고리의 다른 글
[웹 해킹] 5. 크로스 사이트 스크립팅(XSS) 개요 (0) | 2024.07.05 |
---|---|
[웹 해킹] 4. SQL Injection 방어_Prepared Statements (0) | 2024.07.02 |
[웹 해킹] 2. DVWA 보안 난이도 조정하기 (0) | 2024.06.26 |
[웹 해킹] 1. 웹 해킹 연습을 위한 DVWA 설치하기 (0) | 2024.06.24 |
침해사고 발생시 체크해야 할 리눅스 log 파일 (0) | 2024.06.17 |