보안을 그리다, 훈이

[Web Hacking] SQL Injection 취약점 본문

Security/Web Hacking

[Web Hacking] SQL Injection 취약점

HooNeee 2021. 5. 10. 19:34

 

 

[SQL Injection 개념]

웹 사이트의 보안상 허점을 이용해 특정 SQL 쿼리문을 전송하여 공격자가 원하는 데이터베이스의 중요한 정보를 가져오는 해킹 기법을 말한다. 대부분 클라이언트가 입력한 데이터를 제대로 필터링하지 못하는 경우에 발생한다. 공격의 쉬운 난이도에 비해 피해가 상당하기 때문에 보안 위협 1순위로 불릴만큼 중요한 기법이며, 실제로 OWASP Top 10 중 첫 번째(2017년 기준, 2021년 현재 세 번째)로 등재되어 있다 .

 

 

[SQL Injection 종류]

- Error based SQL Injection - 논리적 에러를 이용한 SQL Injection

 

[로그인 쿼리문] SELECT * FROM member WHERE id = 'hooneee' AND password = '1234'

[주입할 쿼리문] SELECT * FROM member WHERE id = '' OR 1=1 -- ' AND password = '1234'

[결과] SELECT * FROM member

 

대표적인 SQL Injection 기법으로, 상단의 쿼리문은 일반적으로 로그인 시 많이 사용되는 SQL 구문이다. 해당 구문에서 입력값에 대한 검증이 없을을 확인하고, 악의적인 사용자가 임의의 SQL 구문을 주입하였다. 주입된 내용은 ' OR 1=1 -- 로 WHERE 절에 있는 싱글쿼터(')를 닫아주기 위한 싱글쿼터와 OR 1=1 이라는 구문을 이용해 WHERE 절을 모두 참으로 만들고, -- 를 추가해 뒤의 구문을 모두 주석 처리 해주었다. (주석 사용 시, -- 입력 후 한 칸 띄우기!)

결론적으로 member 테이블에 있는 모든 정보를 조회할 수 있게되며 가장 먼저 생성된 계정으로 로그인에 성공하게 된다. 일반적으로 관리자 계정을 가장 먼저 생성하므로 관리자 계정에 접근할 수 있다. 악의적인 사용자는 접근한 관리자 권한을 통해 추가적인 공격을 시도할 수 있다.

 

 

- Union based SQL Injection - Union 명령어를 이용한 SQL Injection

 

[주입할 쿼리문 예시]

SELECT number, title, content FROM board WHERE title LIKE '% ' UNION SELECT id, password, date FROM member --

 

SQL에서 Union 키워드는 두 개의 쿼리문에 대한 결과를 통합하여 하나의 테이블로 보여주게 한다. 정상적인 쿼리문에 Union 키워드를 사용하여 인젝션에 성공하면, 원하는 쿼리문을 실행할 수 있게 된다. Union Injection을 성공하기 위해서는 Union하는 두 테이블의 컬럼 수가 같아야 하고, 데이터 형 또한 같아야 한다. 이 공격도 역시 입력값에 대한 검증이 없기 때문에 발생한 취약점이다.

 

 

- Blind SQL Injection 1 - Union 명령어를 이용한 SQL Injection

Blind SQL Injection은 데이터베이스로부터 특정한 값이나 데이터를 전달받지 않고, 단순히 참과 거짓의 정보만 알 수 있을 때 사용한다. 로그인 폼에 SQL Injection이 가능하다고 가정할 때, 서버가 응답하는 로그인 성공과 실패 메시지를 이용하여, DB의 테이블 정보 등을 추출해 낼 수 있다.

 

 

- Blind SQL Injection 2 - Time based SQL Injection

Union 명령어를 이용한 SQL Injection과 마찬가지로, 서버로부터 특정한 응답 대신에 참 혹은 거짓의 응답을 통해 데이터베이스의 정보를 유추하는 기법이다. 사용되는 함수는 MySQL 기준으로 SLEEP과 BENCHMARK이다.

 

 

Stored Procedure SQL Injection - 저장된 프로시저에서의 SQL Injection

저장 프로시저(Stored Procedure) 은 일련의 쿼리들을 모아 하나의 함수처럼 사용하기 위한 것이다. 공격에 사용되는 대표적인 저장 프로시저는 MS-SQL 에 있는 xp_cmdshell로 윈도우 명령어를 사용할 수 있게 된다. , 공격자가 시스템 권한을 획득해야 하므로 공격 난이도가 높으나 공격에 성공한다면, 서버에 직접적인 피해를 입힐 수 있는 공격이다.

 

 

- Mass SQL Injection - 다량의 SQL Injection 공격

2008년에 처음 발견된 공격기법으로 기존 SQL Injection과 달리 한번의 공격으로 다량의 데이터베이스가 조작되어 큰 피해를 입히는 것을 의미한다. 보통 MS-SQL을 사용하는 ASP 기반 웹 애플리케이션에서 많이 사용되며, 쿼리문은 HEX 인코딩 방식으로 인코딩 하여 공격한다. 보통 데이터베이스 값을 변조하여 데이터베이스에 악성 스크립트를 삽입하고, 사용자들이 변조된 사이트에 접속 시 좀비 PC로 감염되게 한다. 이렇게 감염된 좀비 PC들은 DDoS 공격에 사용된다.

 

 

[대응방안]

- 입력 값에 대한 검증

SQL Injection 에서 사용되는 기법과 키워드는 엄청나게 많다. 사용자의 입력 값에 대한 검증이 필요한데, 서버 단에서 화이트리스트 기반으로 검증해야 한다. 블랙리스트 기반으로 검증하게 되면 수많은 차단리스트를 등록해야 하고, 하나라도 빠지면 공격에 성공하게 되기 때문이다.

 

아래는 대표적인 블랙리스트이다.

/*, –, ‘, “, ?, #, (, ), ;, @, =, *, +, union, select, drop, update, from, where, join, substr, user_tables, user_table_columns, information_schema, sysobject, table_schema, declare, dual,…

 

공백으로 치환하는 방법도 많이 쓰이는데, 이 방법도 취약한 방법이다. 예를 들어 공격자가 SESELECTLECT 라고 입력 시 중간의 SELECT가 공백으로 치환이 되면 SELECT 라는 키워드가 완성된다. 공백 대신 공격 키워드와는 의미 없는 단어로 치환되어야 한다.

 

 

- Prepared Statement 구문사용

 Prepared Statement 구문을 사용하게 되면, 사용자의 입력 값이 데이터베이스의 파라미터로 들어가기 전에 DBMS가 미리 컴파일 하여 실행하지 않고 대기한다. 그 후 사용자의 입력 값을 문자열로 인식하게 하여 공격쿼리가 들어간다고 하더라도, 사용자의 입력은 이미 의미 없는 단순 문자열이기 때문에 전체 쿼리문도 공격자의 의도대로 작동하지 않는다.

 

 

- Error Message 노출 금지

공격자가 SQL Injection을 수행하기 위해서는 데이터베이스의 정보(테이블명, 컬럼명 등)가 필요하다. 데이터베이스 에러 발생 시 따로 처리를 해주지 않았다면, 에러가 발생한 쿼리문과 함께 에러에 관한 내용을 반환해준다. 여기서 테이블명 및 컬럼명 그리고 쿼리문이 노출이 될 수 있기 때문에, 데이터 베이스에 대한 오류발생 시 사용자에게 보여줄 수 있는 페이지를 제작 혹은 메시지박스를 띄우도록 하여야 한다. 

 

웹 방화벽 사용

웹 공격 방어에 특화되어있는 웹 방화벽을 사용하는 것도 하나의 방법이다. 웹 방화벽은 소프트웨어형, 하드웨어형, 프록시형 이렇게 세가지 종류로 나눌 수 있는데 소프트웨어형은 서버 내에 직접 설치하는 방법이고, 하드웨어형은 네트워크 상에서 서버 앞 단에 직접 하드웨어 장비로 구성하는 것이며 마지막으로 프록시형은 DNS 서버 주소를 웹 방화벽으로 바꾸고 서버로 가는 트래픽이 웹 방화벽을 먼저 거치도록 하는 방법이다. 

 

 

[참고]

m.blog.naver.com/lstarrlodyl/221837243294

noirstar.tistory.com/264?category=779215

 

 

[연관 게시글] [Web Hacking] SQL Injection 실습
 

[Web Hacking] SQL Injection 실습

이전에 포스팅한 [SQL Injection 취약점(아래 링크)]을 토대로 실습을 진행해보았다. [Web Hacking] SQL Injection 취약점 [SQL Injection 개념] 웹 사이트의 보안상 허점을 이용해 특정 SQL 쿼리문을 전송하여..

hooneee.tistory.com

 

Comments