요약
인증 스킴 : 클라이언트가 서버에 자신의 신원을 인증하기 위해 사용하는 특정 규칙과 프로토콜의 집합
+@
블랙리스트 우회 : < ruby>XSS
방지책
DOMPurify : JavaScript 기반의 라이브러리로, 웹 애플리케이션에서 사용자로부터 입력된 HTML을 안전하게 처리하기 위해 설계
HTML 정제, 보안 특성 유지, 브라우저 호환성, 커스터마이징 가능하다는 특징이 있다
웹 서비스 분석
엔드포인트
취약점 분석
익스프로잇
location.herf : 전체 URL을 반환, URL을 업데이트 가능
document.cookie : 페이지에서 사용하는 쿠키를 읽고, 쓰기 가능
쿠키 탈취
주로 이용자의 입력값이 출력되는 페이지에서 발생, 타 이용자의 브라우저에 저장된 쿠키 및 세션 정보를 탈취 가능
악성 태그를 필터링하는 HTML Sanitization을 사용하거나 엔티티 코드로 치환하는 방법을 통해 해결
드림핵 문제 1
=> 문제 풀이 후 보고서 작성(문제 풀이 완료 / 보고서 작성 예정)
드림핵 강의 2
셀레늄 : 웹 애플리케이션 테스팅에 사용되는 파이썬 패키지
API를 통해 크롬 사파리등 웹 드라이버 사용 가능
=> 웹 브라우저를 사용한 페이지 방문과 같은 역할을 한다.
엔드포인트
/vuln
/memo
/flag
드림핵 문제 2
=> 문제 풀이 후 보고서 작성(문제 풀이 중 / 보고서 작성 예정)
[사이트 구축 후 링크 삽입(예정)]
핸들러 클래스 : 이벤트 처리, 오류 처리 또는 다른 유형의 작업을 처리하는 데 사용되는 객체 지향 프로그래밍의 개념.
주로 프로그램이나 시스템에서 발생하는 이벤트나 예외를 캐치하고 처리하는 데 사용
과정
1. 링크 생성
2. 배포
3. 피해자 클릭
4. GET 요청
5. 피해자 모르게 GET 요청 처리
여러 요청중 GET 요청이 가장 CSRF 공격에 취약하다
=> 데이터를 그대로 반사할때 질의 매개변수를 읽기 때문
ex) 이미지 파일이 DOM에 로딩시 GET 요청 발생, 이를 이용해 공격
1. 0 X 0 픽셀의 이미지를 삽입해 게시
2. 사용자가 이미지 로딩 시도 및 로딩 시 GET 요청 발생
3. 사용자의 인증 쿠키 서버로 전송
4. 사용자의 쿠키는 공격자에게 전송 but 사용자는 알지 못함
+@) img 뿐만 아니라 video 도 가능하다.
주의점은 브라우저의 설정에 따라 공격이 불가한 경우도 있다.
*<"form"><"/form"> : 웹 양식에 대한 지원 제공. ex) 로그인 폼, 배송지 정보 등 정보 입력이 가능한 창
form 태그 종류 : method, name, action, target, autocomplete etc..
*scr attribute : 이미지 소스의 URL을 명시
ex) "<"img src="/images/test.png" alt="테스트 이미지"">"
CSRF는 사용자의 인증된 세션을 악용하는 공격, XSS는 인증된 세션 없이도 공격을 진행 가능
CSRF는 웹 어플리케이션이 이미 인증된 사용자의 요청은 신뢰한다, XSS는 사용자가 특정 사이트를 신뢰한다. 를 노린 공격
CSRF는 사용자의 송금, 제품 목록, 구입 내역 등 사용자의 입력 정보를 탈취하는 것을 목적, XSS는 사용자의 정보를 탈취하는 것이 목적
스크립트를 웹 페이지에 작성해 공격한다는 점은 동일하다, 둘다 클라이언트를 대상으로 하는 공격
실습 문제 풀이
+@)
1. 브라우저는 CSRF 취약점을 방지하기 위한 보안 메커니즘을 제공한다
2. 서버에서 이용자를 식별하기 위해 쿠키를 사용하고 있어야 CSRF 취약점으로 공격할 수 있다
3. 서버에서 HTTP의 GET 메소드가 아닌 POST 메소드로 데이터를 받아도 CSRF에 안전하지 않다
4. CSRF 공격이 불가능할 때 XSS 공격은 가능하다
추가 문제
(p.200 간접 XXE)
XML 이 사용중인지 아닌지 여부를 알기 어려울 때 => 웹 애플리케이션을 소유한 회사의 배경을 조사
이때, 회사 소프트웨어 라이선스 관련 정보를 확인 할 수도 있다.
XXE의 공격 목적은 보안성이 떨어지더라도 많이 사용되는 표준.
SQL 인젝션 : 데이터베이스를 타겟으로 삼는 인젝션 공격
악의적 사용자가
1. 기존 SQL 질의에 매개 변수 삽입
2. 기존 질의를 다른것으로 대체
목표는 상승된 권한으로 DB 침해
# 인터프리터
: 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경
특징 : 즉각적 실행(디버깅 유리), 플랫폼 독립성(호환성 높), 동적 타입 검사()
ex) python, javascript, ruby, php, perl
장점
1. 코드 실행과 테스트가 즉각적으로 가능
2. 코드 수정 후 재컴파일 필요 없음
3. 디버깅이 용이하고, 높은 가독성
단점
1. 실행 속도가 컴파일된 언어에 비해 느림
2. 실행 시점에 오류가 발견될 수 있음
컴파일러의 반의어라고 보면 될듯 (원시코드를 기계어로)
SQL 인젝션 이외에도 CLI도 가능
예시
1. SQL 이스케이프 문자와 SQL 코드가 포함된 페이로드를 API 엔드포인트에 전송
2. 사용자 입력 값을 DB에 질의
3. SQL 인터프리터가 인스케이프되어 SQL 질의 실행 사용자 권한 상승
4. 사용자에게 결과값은 출력되지 않을수 있으나, 질의 실행으로 인해 서버는 피해를 입음
PHP의 뷰 로직 데이터 코드 사이의 구분이 느슨해진것이 원인
즉 어디가 뭔지 모를 정도로 코드가 섞여있다..
근래 PHP 코딩 표준이 엄격, SQL 인젝션 발생을 줄여주는 도구가 나옴 => 개발자가 PHP를 선택하는 일이 줄고 있음
WHY?.. :
결과적으론 이로인해 SQL 인젝션은 줄어듦..
특정한 매개변수만 받아들여야하는 인터프리터가 정제를 제대로 하지 않는 바람에 페이로드를 읽어들이게 된다.
과정
1. HTTP 요청을 위조해 요청(커스텀 명령 추가)
2. 로컬 CLI에서 명령 실행
3. 명령 문자열을 해석 및 실행
4. 원래의 의도와 다르게 실행
5. 원시코드 실행 / 기존의 의도된 기능에서 벗어남
SQL 인젝션은 일차적으로는 인젝션 공격이며 이차적으로는 코드인젝션 공격이다?
=> 1차로는 애플리케이션의 입력을 통해 외부 데이터를 주입하여 쿼리의 동작을 변경해 공격
2차로 주입된 SQL 코드가 데이터베이스 엔진에 의해 실행되기 때문에, 이는 코드 인젝션 공격의 특성을 가짐
CLI에 추가로 명령을 주입하는 방법
CLI 아키텍처에 따라 변경
CLI를 사용하는 곳 보다 DB를 사용하는 곳이 더 많기 때문에 많이 알려지지 않았다.
API 엔드포인트의 정상적인 작동을 방해하는 커스텀 명령(배시 명령)을 추가..
작동 원리
과정
1. HTTP 요청 변조 후 요청, 이때 커스텀 배시 명령을 추가
2. 변조된 배시 명령을 서버에 대해 실행
3. 배시 인터프리터가 명령을 받아 실행
4. 시스템 보안침해
=> 대부분의 서버 는 유닉스 기반이기 때문에 배시명령 공격을 받는다면, 피해가 클수 밖에 없다.
ex)
/etc/passwd : os 전체 사용자 계정
/etc/shadow : 암호화된 사용자 패스워드
~/.ssh : ssh 키
/etc/apache2/httpd.conf : 아파치 구성 파일
/etc/nginx/nginx.conf : nginx 구성 파일
가능한 피해
+ @ 유닉스 기반 os에서는 퍼미션 지정을 통해 엔드포인트의 침해로 인한 피해를 줄여주어 위험을 완화할수 있다.
=> 퍼미션 시스템을 통해 소유자, 그룹, 다른 사용자별로 읽기, 쓰기, 실행 권한을 설정하고 관리, 이를 통해 시스템의 보안을 강화하고, 엔드포인트 침해로 인한 피해를 최소화함
배시명령을 문자열로 이어 붙여 공격 가능
예시) test.txt && rm -rf /경로
예방 방법
1. 사용자 입력 검증
2. 특수 문자 이스케이프
3. 직접 호출 대신, 보안 라이브러리를 사용
인젝션 공격은 사용자 입력을 지나치게 신뢰하기에 생김
DBMS
DBMS(Relational DataBase Management System)
SQL(Structured Query Language)
RDBMS(관계형 DBMS, Relational DataBase Management System)
드림핵 강의 1-1
SQLite란?
: MySQL, MSSQL, Oracle 등과 유사한 형태의 데이터베이스 관리 시스템이지만, 다른 프로그램과의 차이점은 경량화된 시스템이다.(데이터 관리를 위한 필수 기능만 지원)
주로 임베디드 장비, 독립실행형 프로그램에서 사용
문제의 접근법 2가지
1. 로그인을 우회해 푸는 법
2. 비밀번호를 알아내 로그인하는 법
예시)
SELECT * FROM users WHERE userid="admin"-- " AND userpassword="DUMMY"
1-2.
ID: admin" or "1 , PW: DUMMY
userid 검색 조건 뒤에 "OR" 조건을 추가해 뒷 내용이 무엇이든, admin 이 반환
예시)
SELECT * FROM users WHERE userid="admin" or "1" AND userpassword="DUMMY"
1-3.
ID: admin, PW: DUMMY" or userid="admin
userid 검색 조건에 admin을 입력, userpassword 조건에 임의 값을 입력한 뒤 or 조건을 추가하여 userid가 admin인 것을 반환
예시)
SELECT * FROM users WHERE userid="admin" AND userpassword="DUMMY" or userid="admin"
1-4.
ID: " or 1 LIMIT 1,1-- , PW: DUMMY
userid 검색 조건 뒤에 or 1을 추가해, 테이블의 모든 내용을 반환, LIMIT 절을 이용해 두 번째 Row인 admin을 반환
예시)
SELECT * FROM users WHERE userid="" or 1 LIMIT 1,1-- " AND userpassword="DUMMY"
각 SQL 별 주석 처리 방식
MySQL : #
Oracle : --
MSSQL : --
MariaDB : --, #
Sybase IQ : --, //, %
Sybase ASE : --
DB2 : --
(여러 줄 주석 : /* */)
NRDBMS, NoSQL(비 관계형 DBMS, Non-Relational DBMS)
Not Only SQL
RDBMS의 단점을 보완하기 위해 고안됨
: 저장해야 하는 데이터가 많아지면 용량의 한계에 다다를 수 있다는 단점
SQL을 사용하지 않고 저장 및 검색 추가 가능
정해진 문법이 없고 여러가지 다양한 DBMS가 존재하는데 각각의 구조, 문법을 알아야함
ex) Redis, Dynamo, CouchDB, MongoDB 등
1. MongoDB
*컬렉션 : 데이터베이스의 하위 개념
데이터 삽입, 조회의 예시 코드
$ mongosh
// 여기서부터 삽입 ( insertOne 을 사용해 삽입 )
.> db.user.insertOne({uid: 'admin', upw: 'secretpassword'}) => 이게 명령어
{ acknowledged: true, insertedId: ObjectId("5e71d395b050a2511caa827d")} => 이건 결과값
// 여기는 조회 ( find 사용 )
.> db.user.find({uid: 'admin'}) => 이게 찾는 문구
[{ "_id" : ObjectId("5e71d395b050a2511caa827d"), "uid" : "admin", "upw" : "secretpassword" }] => 이건 결과값
<예시문제>
1. 각 DBMS에서 status의 값이 "A"이고, qty의 값이 30보다 작은 데이터를 조회하는 쿼리문 작성
RDBMS의 경우
select *
from DBMS
where status = "A" and qty < 30;
MongoDB의 경우
db.DBMS.find(
{ $and: [
{ status: "A"},
{ qty: {$lt:30}}
]}
)
<추가 문법>
insert => insertOne()
delete => remove()
update => updateOne()
Redis
<명령어>
GET : GET key / 데이터 조회
MGET : MGET key[key ...] / 여러 데이터를 조회
SET : SET key value / 새로운 데이터 추가
MSET : MSET key value [key value ...] / 여러 데이터를 추가
DEL : DEL key [key ...] / 데이터 삭제
EXISTS : EXISTS key [key ...] / 데이터 유무 확인
INCR : INCR key / 데이터 값에 1 더함
DECR : DECR key / 데이터 값에 1 뺌
INFO : INFO [section] / DBMS 정보 조회
CONFIG GET : CONFIG GET parameter / 설정 조회
CONFIG SET : CONFIG SET parameter value / 새로운 설정을 입력
<예시>
SET key "test1123"
GET key
3. CouchDB
<예시>
DELETE /{db}
DELETE /mydatabase
PUT /mydatabase
$ curl -X PUT http://{username}:{password}@localhost:5984/users/guest -d '{"upw":"guest"}'
{"ok":true,"id":"guest","rev":"1-22a458e50cf189b17d50eeb295231896"}
=> 계정 정보 업데이트 요청
$ curl http://{username}:{password}@localhost:5984/users/guest
{"_id":"guest","_rev":"1-22a458e50cf189b17d50eeb295231896","upw":"guest"}
=> 계정 조회 요청
Mongo DB 문제 풀이 강의
서버의 가용성 침해부터 기능 무력화까지 가능
위험 수준은 경미. 정규 표현식 파서의 위치에 따라 달라짐
수학적 의미의 정규식과 상이하다.
역추적 하는 특징을 악용한 방법
정규 표현식의 비효율적인 패턴 매칭을 악용하여 시스템 자원을 과도하게 사용해, 서비스 거부 상태까지 도달
이때의 표현식을 악의적 정규 표현식이라 함
과정
1. 악의적 사용자가 리소스를 많이 먹는 API를 반복 요청
2. 일반 사용자 서비스 요청시 응답속도 저하 및 미응답
작동 원리
시스템의 설계 결함이나 논리적 오류를 이용해 정상적인 기능을 방해 ex) 무한 루프
시스템이 상태를 유지하는 방식에 결함이 있는 경우 이를 악용
비즈니스 로직의 약점을 공격하여 정상적인 비즈니스 프로세스를 방해 ex) 상품 가격을 변경해 대량 구매 시도
DoS 취약점은 모든 종류의 소프트웨어 에서 찾을 수 있다.
리소스를 많이 사용하는 웹 애플리케이션 예시
복잡한 API 호출이라면 예시 중 2가지 이상 처리함
이때 걸리는 시간은 알기 힘들기 때문에 요청 시작과 완료시간을 측정, 해당 과정을 반복해 관찰해 요청시간의 평균을 내는것을 추천..
다 대 일 공격
이때 공격자는 사람일수도 봇 넷일 수도 있다
목적 : 웹 사이트나 온라인 서비스를 중단 또는 속도 저하
과정
1. 공격자 1~n 서버의 대량 요청 시도
2. 서버 과부화
3. 성능 저하
( 봇넷 구축 => 명령 전달 => 트래픽 증폭 => 공격 실행 )
공격 종류
API 엔드포인트* : 웹 애플리케이션에서 클라이언트가 서버에 요청을 보내는 특정 URL 경로
+@) 테스트 목적으로 봇넷을 사용하거나 시뮬레이션 할땐 네트워크 수준과 애플리케이션 수준의 공격을 조합하는
것이 현명하다??
=>
네트워크 수준 공격은 네트워크 트래픽을 대상으로한 공격이며, 주로 대량의 데이터를 전송해 대역폭 소비 또는 네트워크 장비 리소스를 고갈시키는 것이 목표..
ex) SYN Flood / UDP Flood / ICMP Flood
애플리케이션 수준의 공격 특정 앺이나 서비스를 대상으로 한공격이고, 해당 서비스의 자원을 소진 시키는 것이 목표..
ex) HTTP GET / POST 플러드 / Slowloris / XML 파싱 공격
why? : 단일 유형만 사용해 공격한다면 쉽게 차단될 가능성이 있다, 시스템 전체의 성능을 더 정확히 평가 가능..
[부록]
UDP Flood : UDP protocol을 사용해 대량의 데이터그램을 목표 시스템으로 보내는 방식의 공격
ICMP Flood : ICMP protocol을 사용해 대량의 핑 요청을 보내는 공격
HTTP GET/POST Flood : 웹 서버에 다량의 HTTP 요청을 보내 서버의 자원을 소진시키는 공격
Slowloris : HTTP 연결을 가능한 한 오래 유지하면서 서버의 연결 자원을 고갈시키는 방식의 공격
XML 파싱 공격 : XML 데이터를 처리하는 애플리케이션의 취약점을 악용해 서버의 자원을 소진시키는 공격
ex) XML 폭탄(XML Bomb) : 매우 복잡하거나 중첩된 XML 데이터를 보내 파싱시 서버의 메모리를 소진 시키는 역할을 함
: 외부 라이브러리, 패키지, 또는 모듈에 포함된 취약점을 악용하여 시스템을 공격하는 방식
수많은 제품들이 OSS 기반으로 구축된다
빌트위드 라는 어플을 사용하면 기술 스택 확인 가능
OSS에 의존한다는 것은 직접 개발한 코드와 같은 강도로 감사를 거치지 않은 코드베이스에 의존함을 의미한다.
=> 즉 코드에 대한 충분한 이해가 덜 되었기에, 문제가 생겼을 때 즉시 대처하기 어려울수 있음.
OSS 통합과 의존성은 보안상 가장 취약한 부분일 수 있다..
현재는 Git 기반의 VCS에서 호스팅 된다
특징으론 분산적이며, 쉽게 수정 업로드가 가능하다.
브랜치 특징
: 동일한 저장소 내에서 생성
: 가볍고 빠르며, 메인 브랜치로 쉽게 병합 가능
: 기능 개발, 버그 수정 등 동일 프로젝트 내 협업에 주로 사용
포크 특징
: 저장소의 전체 복사본을 만들어 독립적인 저장소로 사용
: 원본 저장소와 독립적으로 관리
: 오픈 소스 프로젝트에 기여하거나 독립적인 프로젝트 개발에 주로 사용
예시 : 워드프레스
위와 같은 통합된 애플리케이션을 사용하게 되면
1. 시간이 흐른 뒤 취약점을 찾아 해결하기 어려워진다(위치 찾기 어려움)
2. 백도어의 원격코드 실행을 초래할수 있다
ex) 자바스크립트, 자바, NuGet, Conan, Spack, etc..)