[ SQL 인젝션 공격이란? ]
데이터베이스로 전송되는 SQL 쿼리문을 사용자 입력으로 조작할 수 있는 경우, 데이터베이스 내 데이터를 변조하거나 허가되지 않은 정보에 접근할 수 있는 공격
예전부터 최근까지 꾸준하게 사용된 공격으로 2011년 소니 해킹, 2015년 뽐뿌 해킹, 2015년 어나니머스 WTO 해킹 등 많은 사례들이 있다.
- WHERE 구문 공격
ID가 1인 사용자 정보를 요청한다고 생각해보자. 요청을 받으면 웹 애플리케이션은 외부에 있는 DB로 SELECT name, email FROM users WHERE ID='1' 이라는 쿼리문을 전송한다. 쿼리문 안에 사용자가 입력한 ID 값 1이 조건으로 명시되어 있는 WHERE 조건문이 있다. 이 쿼리문을 풀이하자면, ID가 1인 경우에 users 라는 사용자 테이블에서 이름과 이메일을 가져오라는 뜻이다. 쿼리문이 실행되면, ID가 1인 사용자 정보가 웹 애플리케이션을 통해서 클라이언트까지 전달된다.
이때, 해커는 SQL 쿼리문을 조작하기 위해 1 뒤에 ' or '1'='1 이 부분을 넣어준다. 이 값이 그대로 쿼리문에 들어가면 중간에 or 이라는 키워드가 있는 것을 볼 수 있다. 그렇다면 쿼리문의 WHERE 조건문을 보면 ID가 1이거나 뒷 조건을 확인해야 하는데 1은 1이라는 항상 참이되는 구문이 삽입되어 있다.
이렇게 되면 ID가 1인 데이터 뿐만 아니라 ID가 다른 데이터인 경우에도 항상 조건이 참이 되기 때문에 반환된다. 결국 WHERE 구문이 우회되고 모든 사용자의 개인정보가 리턴된다.
- UNION 공격
앞서 WHERE 구문과 동일하게 ID가 1인 사용자 정보를 요청하면 SQL 쿼리문이 DB로 전달되고, ID가 1인 사용자 정보가 클라이언트까지 전달된다. 해커는 or 이라는 구문 대신, union 키워드를 삽입하고 패스워드를 요청하는 select 구문을 삽입한다. 이렇게 입력한 부분을 반영하여 SQL 쿼리문도 변경된다.
union은 합집합으로 두 개의 select 구문의 결과를 모두 포함시키는 키워드이다. 따라서 이 경우는 원래 실행되어야하는 ID가 1인 사용자 정보 이외에도 union 뒤의 select 구문의 결과도 같이 포함하게 되는데, 이 뒤에는 WHERE 조건문이 없기 때문에 모든 사용자의 이름과 비밀번호가 리턴된다.
마지막에 삽입된 #은 SQL 구문에서 # 뒤에 오는 내용을 주석처리할 때 사용된다. #은 혹시 뒤에 있을지 모르는 다른 SQL 문은 생략시키고 해커가 원하는 결과만 얻을 수 있도록 주로 활용된다.
[ SQL 인젝션 공격 실습]
WHERE 구문 우회)
DVWA의 SQL Injection 탭에 User ID를 입력하는 폼이 있다. 여기에 1이라는 값을 넣으면 ID가 1인 사용자의 정보가 출력된다. 이 경우에는 admin 이라는 이름이 출력되었다.
이러한 폼이 있을 때, SQL 인젝션 공격에 취약한지 알아보는 가장 좋은 방법은 '(작은 따옴표)를 넣는 것이다. 취약한 폼은 위 이미지와 같이 에러 메시지가 나온다.
소스코드를 살펴보면 user_id에 사용자가 입력힌 것이 $id라는 변수로 들어가 있다. 이때 ID 변수는 이미 작은따옴표로 둘러 쌓여져 있다. 만약 여기에 작은 따옴표가 하나 더 들어오게 되면, 작은 따옴표가 3개로 오류가 발생하게 된다.
이렇게 비정상적인 문자를 입력했을 때, SQL 쿼리문이 잘못되어 에러가 발생하면 그 페이지는 SQL 쿼리문을 이용하여 처리가 된다는 뜻이 된다. 뿐만 아니리 SQL 인젝션 공격에 성공할 확률도 매우 높다.
이번에는 폼 입력 칸에 1' or '1'='1 을 입력하고 실행한 결과, 위 사진과 같이 테이블의 모든 정보가 출력된 것을 확인할 수 있다. 이 문자열을 넣어줌으로써 조건문이 항상 참이 되도록 만들어서 ID가 1이라는 것에 관계없이 모든 ID의 정보가 출력되도록 하였다.
WHERE user id = '1' or '1'='1' // SQL 쿼리문
이 WHERE 구문 우회 공격을 이용하면, 어떤 사이트의 경우 자신의 정보만 조회할 수 있는 페이지에서 다른 사용자의 정보를 알아내는 것이 가능할 수도 있다.
마지막으로 폼 입력 값으로 '# 을 넣어보자. 이전 실습과 다르게 '# 을 입력했을 때는 에러가 발생하지 않았다. 그 이유는 SQL DB에서 # 이후의 내용이 모두 주석으로 처리되어 쿼리문 구조에 영향을 주지않기 때문이다. 다른 데이터 베이스의 경우에는 # 대신 --2 를 이용하여 주석처리 할 수 있다.
'Security > Web hacking' 카테고리의 다른 글
실전 웹 모의해킹 (0) | 2023.01.14 |
---|---|
XSS 공격 (0) | 2023.01.13 |
CAPTCHA 공격 (0) | 2023.01.09 |
파일 업로드 공격 (0) | 2023.01.08 |
파일인클루젼 공격 (0) | 2023.01.07 |