루키즈 교육 - 0902 학습
Application Security
* 인터넷
- 1974년에 시작 (로버트 칸, 빈트 서프)
( Gopher, Archie, Telnet 등등)
* WWW
- 1988년에 팀 버너스 리 처음
* CERN(유럽의 물리입자 연구소)
- 물리입자 사진을 찍어서 논문을 만듦
- 논문 : 사진,설명(Text),링크(참조) ===> 문서에 사진 넣고 설명을 쓰고, 링크로 연결
* 기업들이 회사소개,상품소개 : 사진,설명,링크
=> 많은 사람들이 사용하기 시작
=>회원가입=>Database=>스크립트 등 => 보안(암호화,방화벽 등등) => 클라우드 서버 운영
* 점점 복잡해지니까 구성상의 문제점, 취약점 등이 발견 => 다양한 공격알려지게 됨
- 웹브라우저(클라이언트)와 웹서버간에 암호화
- 웹서버의 설정 이슈
- 데이터베이스 설정이슈 => SQL인젝션
- 스크립트 공격 이슈 => XSS,CSRF,SSS,WebShell 등 => 난독화
* 클라이언트와 서버의 개념
- 클라이언트 : 웹 브라우저 , SSH client, FTP client
- 서버 : 웹서버(IIS,Apache2,Nginx 등)
* 기존 프로토콜 : 연결된 상태가 유지됨
- HTTP : sTATELESS(사진,텍스트,링크를 받으면 연결이 끊김)
- 마우스 클릭하면 다시 연결을 시작 => 누구신지 몰라도 연결해드림
- 로그인 : id/pw => 고객님 어서오세요. 마우스 클릭 => 누구세요?
- Cookie를 생성해서 서버에 알려줌=>http에 cookie를 넣어서 보냄 : 쿠키 취약점
* 봉찬의 가장 큰 적은? 편리를 추구하는 것
* 텍스트를 사용할 때보다 Binary를 사용하면 크기가 약 2/3로 줄어들게됨
- 전세계적으로 보면 큰 차이일 수도 있음(전기소모량도 감소 등)
* Frame : Packet을 실어 나르는 단위
- 컨테이너선 => Frame
- 컨테이너 => Packet(데이터를 넣은 상자) (3계층 전송 단위)
* HTTP Request 헤더
- Request(필수) : 어떤 Method를 사용하는지, 어떤 페이지를 요청하는지, 어떤 버전을 사용하는지 표시
- Referer : 어디를 경유해서 오셨나요?
- User-Agent : 웹브라우저의 종류를 표시하는 부분
- Host(필수) : 요청을 누구한테 하나요?(요청을 받는 호스트의 IP 주소 또는 Domain Name을 표시)
=> Referer나 User-Agent에 리눅스 명령어를 사용해서 공격하는 취약점이 존재하는 경우도 있음
* HTTP Response
- 안전한 메소드는 GET, POST뿐임
- 그 외에 나머지 메소드는 위험 => ISM-P 인증심사에서 결함으로 간주
- GET : 페이지 요청, 검색어 입력 =>HTTP BODY를 사욯ㅇ하지 않음
- POST : 로그인(ID/PW), 게시판 글쓰기, 파일 업로드 등등 => HTTP Body를 사용
- PUT : 파일을 서버에 저장 => 악성코드를 업로드함
- DELETE : 서버에 있는 파일을 삭제 => 서버의 중요한 파일이 지워질 우려가 있음
- OPTIONS : 어떤 메소드를 사용 가능한지 물어보는것
* WebDav
- 개발자들이 웹사이트를 공동 개발할 때 사용하는 공유폴더(파일을 업로드,수정,삭제 할 수 있음)
=> 인터넷에 연결해서 사용하면 매우매우 위험
* SSL(Secure Socket Layer)
- Netscape에서 만든 웹브라우저와 웹서버간 암호화 방식
- 취약점이 너무 많음 SSL1.0과 SSL2.0은 취약점이 발견되어서 사용 중지
- SSL3.0을 사용하다가 또 취약점이 발견됨
* TLS(Transport Layer Security)
- SSL을 표준화하면서 이름을 TLS로 변경(누구나 사용할 수 있음)
- 취약점이 대부분 보완됨
- 1990년 이후로는 계속 TLS만 사용
실습준비) 준비물
- VMware Workstation Player : 기간제한없음, 기능제한 있음
- VMware Workstation Pro : 기능제한 없음, 유료라서 무료 사용기간은 30일간만 사용 가능
- Virtualbox : 네트워크 설정, 디스크 크기 조정 => 수장업으로 해야함 : (VMware는 자동으로 동작)
- Windows에서 VC가 설치안된 경우 : VC설치하려면 재시작해야함 => 점심시간에 재부팅
* SGML : 표준 문서 양식
- 종이,책자 금지 => 파일로내라고 함
=> doc,ppt,pdf,xls,hwp,rtf,txt => 소프트웨어 설치(??) * 5만명 = 35만 Copy설치??
=> 모든 문서는 sgml로 만들어서 제출해야함 (단점,작성이 어려움)
* SGML 을 간단하게 만든 것이 HTML을 만듦 => 웹 표준 문서로 정함
- HTML 확장성, 호환성 부족 => XML
- XML의 특징 : 내용과 형식을 분리 => 변경내용이 있을 떄 형식은 그대로 두고 내용만 바꿀 수
* 스크립트의 종류
- ASP,JSP,PHP : Server Side Script
- Javascript : Client Side Script
- Python, Ruby 등 (최근에는 스크립트 전성시대) => 컴파일 필요없음, 즉석에서 실행됌(간단,편리 등)
실습)
* VMware에서 가상머신 실행하기
1. vmware를 실행하고
2. Player > File > Open 한 다음, 압축푼 폴더에서 Ubuntu 64-vmx 선택하고 열기 클릭
3. Play Virtual Machine 클릭 , I Copied it
(소프트웨어 업데이트 => 나중에 알림 클릭, 업그레이드 하지 않음)
* update하기
$ sudo apt update
( J의 비밀번호 : ubuntu) // 커서는 움직이지 않지만 입력이 잘되고 있는 것, 입력하고 엔터
$ ip addr ( ip 주소확인)
$ sudo init 0 (우분투 종료됨)
* 아이피주소바꾸기
1. 루키즈 카페에서 vmnetcfg_v15.zip파일을 다운로드함
2. 압축풀면 vmnetcfg.exe 파일이 나옴 복사해서
3. vmware파일(vmplayer 붙여넣기 (관리자 권한 ok)
4. vmnetcfg.exe 오른쪽 마우스 클릭, 관리자 권한으로 실행
5. vmnet 8(NAT)선택하고 아럐쪽보면 subnet IP : 192.158.5.0으로 바꿈 이후 apply 클릭 // 세번째 옥텟을 5로 변경
(VMnet()과 VMnet1은 변경사항 ㅇ없음)
6. Apply 클릭 OK
* HTTP Error Code
1) 400번대 에러의 특징 : Client 쪽에서 잘못된 요청을 한 경우
401 unauthorized : 로그인 실패 후에 권한이 없다는 의미
403 forbidden : 접근하면 안돼는 페이지 또는 디렉토리
404 Not found : 없는 페이지
2) 500번대 에러의 특징 : Server쪽에서 잘못한 경우
500 internal server error : 설정을 뭔가 잘못한 것
502 bad gateway : 서버쪽 연결 통로 문제
503 service unavailalbe : 서비스를 일시적으로 할 수 없음(DDods공격을 당하거나, 너무 많이 몰려서..)
=> 에러는 공격자에게 큰 힌트가 됨 : 에러를 알려주지말고 같은 메시지로 알려줘야함
(따라서 통일된 메시지로 응답해야함 지금은 접속이 원활하지 않음 잠시후에 다시 접속바랍니다)
참고) 웹해킹보안 모의 해킹을 할 떄, F12(개발자도구)와 Proxy도구를 사용해서 1/4정도는 풀림 => 실제로도 비슷
* SQL 인젝션의 공격 원리
- 웹브라우저와 웹서버는 HTTP로 통신, 웹서버와 Database는 SQL로 통신을 함
- 공겨자는 SQL공격구문을 웹서버에 전달 => 웹서버에서 Database에 SQL문을 작성하는데 공격구문이 따라붙게됨
- Database에서 SQL공격구문이 그대로 실행됨 => 조작된 정보가 전달될 수 있음
사례 ) 로그인을 하는 경우
select * from [테이블명] where id='' or 1=1 --' and pw=' '
* SQL의 인젝션의 핵심 3요소
1) 주석처리 : 뒷부분 무력화
- 오라클DB, MS-SQL
- MySQL, MariaDB : #
2) 로직 : 논리적으로 참이 되기만 하면 됨
'or 1=1 --
'or2>1 --
'or'a'='a' --
select * from [테이블명] where id='admin' and pw=''or 1=1 --';
3) SQL 중첩문 사용하기
- 앞의 SQL문을 마감하고 ,다른 SQL문을 뒤에 붙여서 실행핟로고 유도함
select ~~~~~~~; drop table ~~~~~~;
select * from [테이블명] where id='admin' and pw=''; drop table member ~~~~~';
- 앞의 select문을 뒤의 select문과 union으로 연결
select * from [테이블명] where id='admin' and pw=''; drop table member ~~~~';
※ 주의사항 : 앞의 select문에서 요청한 개수와 뒤의 select문에서 요청한 개수가 일치해야함
select id, pw from [테이블명] where id='admin' and pw=''union select userid, accont number from [테이블명] ~~~~~ ';
참고)
정보통신망법 위반 : 71조(5년이하의 징역 또는 5천만원 이하의 벌금)
=> 다른 사이트에 해킹 공격을 하면 안됌
* DVWA의 SQL 인젝션
- user id에 1~9번까지 넣으면 사용자 이름(frist name)과 성(surname)이 나옴
select firstname, surname for [테이블이름] where userid='' or 1=1 #' ; (' or 1=1# 넣으면됨 /
'or'a'='a'# => '가 홀수개이면 주석 사용
/ 'or'a'='a => '(Single Quot)가 짝수개이면 주석 불필요함
' or 2>1 #
' or'S'<'T'# ('S'>'T'는 안됌)
' or'A'<'Z'#
* SQL 인젝션 대응 방법
- escape처리 : 특수문자의 고유 기능을 하지 못하도록 해야함
ex) 4 + 5 = 9 => 4\+ 5\=9
예를 들면 \'or1=1\ #와 같이 백슬래시를 붙여줍니다.
=> 사람이 일일히 붙일 수 없기 때문에 Secure Coding 함수를 사용해야함
* SQL injection을 차단하기 위해서 만든 Secure Coding 함수가 있음 : mysql_real_escape_string()함수 : mysql_real_escape_string()함수 (PHP에서 사용)
특수문자 중에서 \x00, \n, \r, \,'," and \x1a 앞에 \를 붙여서 Escape처리를 하는것
=> \x : 구분자로 사용, \n :(Line Feed, 줄 내림), \r: (Carriage Return, 커서를 왼쪽 끝으로 이동)
줄바꿈 : \r\n
- mysqli_real_escape_string() : mysql_real_escape_string()를 개량한 버전이었는데,
- mysql_real_escape_string()를 mysql_real_escape_string()에 포함시키기로 결정 => mysql_real_escape_string()만 사용
- gmarket을 ssg에서 인수 => 회원 통합 : ssguid와 같은 쿠키값을 별도로 부여 => 내부적으로 인식가능하도록 사용
* Cookie값의 보안 이슈
- A의 쿠키값을 공격자가 훔쳐가면, 공격자가 A인척 하고 사이트에 접근
- Cookie값의 저장 요청 : 광고회사에서 사용자에 대한 접속 빈도를 측정하기 위해서 쿠키값 저장을 요청 : 비용정산을 위한 근거자료