💡 공격 수행 시 사전 정보 보유 여부
있다 → 모의 해킹
없다 → 취약점 진단
모의 해킹 | 취약점 진단 |
---|---|
시나리오 기반 | 취약점 별 항목 기반 |
블랙박스 기반 점검 | 화이트박스 기반 점검 |
대상에 대한 정보 하나만을 가지고 공격 수행 | 담당자에게 정보 요청 |
Zero Base → 공격수행 | 담당자 정보 요청 → 정보수령 → 공격수행 |
동적 진단 | 소스코드(정적) 진단 |
서비스 1개 | URL 1개 |
시간 소요 ↑ (최소 1개월-최대 3개월) | 상대적으로 시간 소요 ↓ (짧으면 2-3일, 길면 일주일) |
💡 환경분석 목적
1. 제한된 시간에 효율적으로 취약점 진단을 하기 위함
2. 서비스에 대한 이해를 위함
JDK 다운로드
Burp Suite 다운로드
픽픽 다운로드
PortSwigger
💡 Operator
가장 많은 패킷을 잡고 싶을 경우OR
옵션 사용
패킷에서 구체적인 부분으로 범위를 줄이고 싶을 경우AND
옵션 사용
특정 페이지나 기능에 악의적인 스크립트를 삽입하여 공격자가 의도한대로 행동하도록 하는 공격
✅ 계좌 번호, 계정, 패스워드 등의 사용자 정보를 유출 및 탈취하는 피싱 공격
✅ 사용자 인증 도용
✅ 악성코드 유포 및 브라우저 무한 반복 등의 공격
✅ 사용자로부터 입력되어 들어오는 파라미터 값
Ex. 게시판 내용, 게시판 제목, 검색어 조건 등 사용자의 모든 입력 값
Reflected XSS
✅ 사용자(웹 브라우저) → 서버 → 사용자(웹 브라우저) ▶ 공격 발생
DOM-Based XSS
✅ 서버를 거치지 않는 XSS
✅ 단독으로 수행 불가
✅ 사용자(웹 브라우저) → 정적 컨텐츠(JS)
Stored XSS
✅ 사용자(웹 브라우저) → 서버 → DB → 서버 → 사용자(웹 브라우저)
✅ 제 3자에게도 손쉽게 피해를 입힐 수 있어 가장 위험한 XSS
✅ DB(서버)에 악의적인 스크립트가 저장되어 지속적으로 호출될 수 있으므로 위험성 ↑
CSRF
✅ 공격자가 명확한 목적을 가지고 작성한 XSS 스크립트 구문을 활용하여 자동화한 XSS 공격
✅ 사용자(피해자)가 눈치채지 못하게 자동 공격 수행
최선 > 차선 > 차차선 적용
Stored XSS 취약점 확인
DOM Based XSS 취약점 확인
💡 HTML 태그 문법 관련해서 참고 사이트
검색창에 아무 값이나 입력해 Burp Suite로 Response 확인
Reflected XSS(XSS 우회) 취약점 확인
검색창에 script 구문 입력 후 검색
상단은 필터링이 되고 있으나 하단은 필터링이 안되고 있는 것을 확인
📢 웹 사이트는 특정 문자열 패턴을 찾아 필터링하거나 이스케이프하기 위해 <script> 태그를 찾아 처리하게 된다고 한다. 그러나 이런 처리가 완벽하게 되지 않았을 때 <script> 태그가 여러 개 연속으로 나타났다면 첫 번째 태그만 필터링하거나 이스케이프하고 나머지 태그를 놓치는 경우도 있을 수 있다고 한다.
Stored XSS 취약점 확인 및 CSRF 공격 구문 작성
💡 CSRF
웹 사이트 내 XSS 취약점을 이용하여 사용자가 의도하지 않는 요청을 송신하도록 하는 공격을 의미하며 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 하여 특정 웹 페이지를 보안에 취약하게 한다거나 수정, 삭제 등의 작업을 하게 만드는 공격 방법
스크립트가 정상 실행되는 것을 보아 댓글에 스크립트 필터링이 제대로 되지 않고 있음을 알 수 있고 csrf 공격 구문의 삽입이 가능하다는 것도 확인 가능
<script>
var req = new XMLHttpRequest();
req.addEventListener('load', handleResponse);
req.open('get','/my-account',true);
req.send();
function handleResponse() {
var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1];
var changeReq = new XMLHttpRequest();
changeReq.open('post', '/my-account/change-email', true);
changeReq.send('csrf='+token+'&email=test@test.com')
};
</script>
📢 XMLHttpRequest
JavaScript에서 HTTP 요청을 만들 수 있는 내장 브라우저 객체
OWASP Injection 공격 중 한 형태
특정 페이지나 기능 사용 시 입력 값에 대한 DB 쿼리 유효성 검증을 하지 않아 DB 쿼리가 조작되어 공격자가 의도한 대로 행동하도록 하는 공격
✅ DB 내 주요 정보 유출
✅ DB 내 데이터 수정/삭제
✅ 인증 우회
✅ 게시판 view/write/edit 시 DB의 쿼리 문에 포함되는 파라미터 값
✅ 첨부 파일 다운로드 시 DB의 쿼리문에 포함되는 파라미터 값
Boolean Based SQL Injection
✅ 쿼리 요청 시 응답 값의 참/거짓 반응을 통해 DB 결과 조회
Error Based SQL Injection
✅ 쿼리 실행 시 오류나 예기치 않은 예외 상황이 발생될 때 클라이언트 측에서 DB 정보가 노출되는 공격
Time Based SQL Injection
✅ DB 시간 관련 함수를 활용해 참과 거짓을 반응을 통해 DB 결과 조회
✅ 인자화된 질의문 사용
✅ 자바의 경우 prepared Statement 클래스와 하위 메소드 executeQuery(), execute(), executeUpdate() 사용
SQL Injection 취약점 확인 및 관리자(administrator) 계정으로 로그인
Injection 공격은 Repeater를 주로 사용
→ 변경사항이 많이 생기기 때문
Injection 공격은 크게 두 가지 형태
여기서 SQL문은 주석으로 -- 대신 #을 넣을 수도 있음
① ' or 1=1--
② 'and 1=1--
쿼리문
SELECT * FROM users WHERE username='입력한_아이디' AND password='입력한_비밀번호'
SELECT * FROM users WHERE username='administrator' OR 1=1--' AND password='입력한_비밀번호'
💡 %20은 공백문자를 의미
에러 발생
로그인 성공
위의 결과로 추측 가능한 것
✔ 해당 서버는 # 필터링
✔ DBMS를 MySQL이 아닌 다른 sql을 사용 중
SQL Injection 취약점 확인 및 Blind SQL Injection 공격을 통해
관리자(administrator) 계정의 비밀번호 획득 후 로그인 시도
users 테이블이 존재하는지 여부 확인
→ Welcome Back이 뜨므로 참
user 테이블 안에 administrator 계정이 존재하는지 여부 확인
→ Welcome Back이 뜨므로 참
administrator 계정의 password 길이 확인
→ Welcome Back이 뜨므로 참
하지만 여기서 정확한 패스워드의 길이를 알고자 한다면?
→ Intruder 기능 사용
→ 확인 결과, 20부터는 Welcome Back이 뜨지 않으므로 패스워드는 20자리라는 것을 알 수 있음
administrator 패스워드 확인
→ Welcome Back이 뜨지 않으므로 패스워드 첫번째 자리가 a가 아님을 확인
→ 아까와 마찬가지로 반복적인 작업을 위해 Intruder 사용
→ 메모장에 abc 등의 소문자 영단어 전체와 123 등의 숫자 전체를 적고 저장한 후 Load로 저장한 메모장을 불러와 Start attack
→ Welcome Back이 f에서 뜨므로 패스워드 첫번째 자리가 f임을 확인 가능
→ 패스워드의 두번째 자리를 알아내기 위해 Positions로 돌아가 1을 2로 바꿔준 후 Start attack 클릭
→ Welcome Back이 x에서 뜨므로 패스워드 두번째 자리가 x임을 확인 가능
※ 패스워드
→ fx~~
게시판 등에서 악성 파일 업로드에 대한 검증이 없을 경우 이를 악용해 악성 스크립트(웹쉘) 파일이 업로드되어 원격 명령 실행, 권한 획득 등의 공격이 실행될 수 있는 보안 취약점
업로드 파일이 서버에 저장되고 해당 경로를 공격자가 파악할 수 있을 때 공격이 가능하며 업로드 후 공격자는 해당 파일에 접근해서 원하는 행위(원격 명령 실행 등)를 수행
✅ 게시판의 첨부파일
✅ 게시판 내부의 이미지 삽입 박스
✅ 게시판 내부의 동영상 첨부 부분
✅ 업로드 검증 로직이 존재할 경우 BlackList/WhiteList인지 확인
✅ 환경 분석을 통한 환경에 맞는 웹쉘 사용
최선
✅ 확장자 검증(화이트리스트)
차선
✅ 확장자 검증(블랙리스트)
✅ 파일 타입 검증
✅ Path Traversal 경로순회 특수 문자(.././;%#) 검증
✅ 파일명을 경로로 받지 않고 UUID
✅ 업로드 경로의 디렉토리나 파일 실행 권한 삭제
차차선
✅ 업로드 경로 노출 제한
파일 업로드 취약점 확인 후 서버 내 /home/carlos/secret 값 확인
# test.php
<? php
$fp = fopen("/home/carlos/secret", "r");
while( !feof($fp) )
{
echo fgets($fp);
}
fclose($fp);
?>
→ 악의적인 웹쉘 코드가 삽입되었음을 확인
파일 업로드 취약점 확인 후 서버 내 /home/carlos/secret 값 확인
→ 403 에러 발생
<? php
echo file_get_contents('/home/carlos/secret');
?>
💡 .htaccess 파일
서버의 설정을 바꿀 수 있는 파일 중 하나
백도어 역할의 파일
보안 상 안전 X
# 파일을 php 파일 타입으로 변환
AddType application/x-httpd-php .abcdef
→ .htaccess 파일로 인해 abcdefg 파일이 php 파일로 인식됐다는 것을 확인 가능
웹을 통해 웹 어플리케이션의 소스파일 및 시스템 파일을 다운로드 할 수 있는 취약점
다운로드 경로의 인수 값에 ../
문자열 등을 입력해 상위 디렉터리로 접근해서 일반적으로 접근이 불가능한 경로의 파일이 접근 또는 다운로드가 가능
리눅스 및 유닉스 계열의 웹 서버에서는 /etc/passwd
와 같은 시스템 파일도 다운로드 가능
첨부파일 또는 특정파일들의 다운로드 소스로 붙어있는 파라미터 값 변조
Ex. http://www.test.com/../../../../board/dbconn.inc
Ex. http://www.test.com/download.asp?path=/board/download/&filename=test.jpg
파일이 위치하는 경로를 변수로 사용하지 말고 해당 파일의 키 값을 변수로 사용하여 다운로드
Ex. http:// www.test.com/download.do?path=5&filename=test.jpg
파일 위치 경로 변수를 사용할 경우 "../", "\", ".\", "%"
등 특수문자의 보안 필터링 적용
Directory Traversal 취약점 확인 후 서버 내 /etc/passwd 값 확인
→ 현재 경로의 위치를 모르기 때문에 한 단계씩 상위 경로로 이동
→ 400 응답과 No such file 출력
→ 아까와 값은 결과 값 출력 확인
→ 세 차례 정도 이동하니 루트 경로로 이동한 것을 확인
→ ../../../etc/passwd가 시스템 상의 루트라는 것과 데이터 조회 가능 여부 확인
→ 호스트 파일 확인
Directory Traversal 취약점 확인 후 서버 내 /etc/passwd 값 확인
→ 그러나 아무리 입력해봐도 No such file만 뜨고 공격이 이뤄지지 않음을 확인
→ ../
이 필터링되고 있음을 유추
→ 이런 경우, URL 인코딩 후 filename의 인자 값으로 입력해서 접근
→ Encode as를 클릭해 URL 선택
→ 그러나 여전히 No such file이 뜨는 것을 확인
→ Encode as를 클릭해 URL 선택
→ 루트의 값이 정상적으로 뜨는 것을 확인 가능
→ 해당 서비스는 URL 서버 쪽에서 URL 디코딩을 한번, 내지는 두번 정도는 풀어서 사용 중이라고 유추 가능
접근제어 우회 가능성
✅접근 제어 부분을 클라이언트에서 Javascript를 이용하여 체크할 경우, Javascript 구문을 삭제 후 우회 공격
비인증 상태로 중요 page 접근 가능성
✅ 로그인 확인 모듈이 존재하지 않는 페이지에서 강제 브라우징하여 내부 page 접근 가능
일반 계정 권한 상승 가능성
✅ 일반 계정 로그인 상태에서 관리자 page에 접근 가능
✅ 인증, 권한, 제어, 확인 등의 과정을 처리하는 부분은 Javascript
가 아닌 Server Side Language
로 구현
✅ 인증이 필요한 페이지의 경우 해당 페이지 주소를 직접 입력하여 접근하지 못하도록 페이지 각각에 대하여 로그인 체크 및 권한 체크를 하도록 접근제어통제(ACL
)를 수립하여 계정권한에 맞게 접근제어 설정
권한 검증이 취약한 페이지 확인 후 carlos 계정 삭제
💡 robots.txt
웹 사이트 검색 로봇이 접근하는 것을 방지하기 위한 국제 규약으로, 일반적으로 접근 제한에 대한 설정을 robots.txt 파일에 적용하며 WEB Root 밑에 존재해야 적용됨
Ex.abc.abc.com/robots.txt
→ administrator 패널이 검색 로봇에 의해 크롤링 되지 못하도록 설정
→ 그러나 반대로 공격자는 Disallow
설정을 통해 /administrator-panel
이란 경로가 존재함을 유추 가능
→ 인증이 미흡할 경우 노출된 경로를 통해 타고 들어가는 것이 가능
→ 계정 옆에 자리한 Delete 버튼을 클릭해 계정 삭제 가능
권한 검증이 취약한 페이지(기능) 확인 후 wiener 계정의 권한을 Admin으로 변경
→ carlos 계정만 권한이 변경된 것을 확인 가능
Cookie: session=wjYcd9KdQO7eYs0FoYb9KTyEK61Ruru4
→ administrator(ADMIN) 세션 값
session=xaDeuEPpiafo418X2RaoNP0jOsufIs0J
→ wiener(NORMAL) 세션 값
→ 권한 검증을 하는 듯한 값 출력
💡 HTTP Referer
① 사용자 요청의 출처를 표시하기 위함 (= Origin 헤더)
② 사용자의 대상 서버로의 요청이 올바른지 확인하기 위함
③ 사용자의 요청 값을 확장하여 서버로 전달하기 위함
④ 분석, 로깅, 최적화 된 캐싱 등 활용
→ wiener 계정임에도 불구하고 Admin panel이 뜨는 것을 보아 wiener 계정에 관리자 권한이 부여됐음을 확인 가능