본문 바로가기

WEB 정리

Command Injection & SSRF

Command Injection

- 이용자의 입력을 시스템 명령어로 실행하게 하는 취약점

 

- 시스템 함수를 사용하면 이용자의 입력을 소프트웨어의 인자로 전달할 수 있다.
ex):os.system(“cat [user-input]”) 파일을 읽는 함수

- 이용자의 입력을 제대로 검사하지 않으면 임의 명령어가 실행될 수도 있다.

- 시스템 함수는 셸 프로그램에 명령어를 전달하여 실행하는데, 셸 프로그램은 다양한 메타 문자를 지원하기 때문.

 

 

메타문자 예시

`` 명령어 치환
``안에 들어있는 명령어를 실행한 결과로 치환된다.
$() 명령어 치환
$()안에 들어있는 명령어를 실행한 결과로 치환, 이 문자는 위와 다르게 중복 사용이 가능하다.
&& 명령어 연속 실행
한 줄에 여러 명령어를 사용하고 싶을 때 사용, 앞 명령어에서 에러가 발생하지 않아야 뒷 명령어를 실행한다.
|| 명령어 연속 실행
한 줄에 여러 명령어를 사용하고 싶을 때 사용하며 앞 명령어에서 에러가 발생해야 뒷 명령어를 실행한다. 
; 명령어 구분자
한 줄에 여러 명령어를 사용하고 싶을 때 사용, ;은 단순히 명령어를 구분하기 위해 사용하며, 앞 명령어의 에러 유무와 관계 없이 뒷 명령어를 실행.
| 파이프
앞 명령어의 결과가 뒷 명령어의 입력으로 들어갑니다.

Command Injection 방지 방법

- XSS 기법에서 보았던 필터링을 통해서 위 표의 메타문자들을 필터링하는 방법으로 방지할 수 있다.

 

Server-side Request Forgery(SSRF)

웹 개발 언어는 HTTP 요청을 전송하는 라이브러리를 제공한다.

 

 

EX) PHP: php-curl
       NodeJS: http
       Python: urlib, requests


클라이언트, 서버 간 통신을 위해 사용됨.

 

최근의 웹 서비스는 지원하는 기능이 증가함에 따라 구성요소가 증가함

마이크로서비스들로 웹 서비스를 구현하는 추세이며 이때 각 마이크로서비스는  HTTP, GRPC 등을 사용해 API 통신한다.

 

웹 서비스는 외부에서 직접 접근할 수 없는 내부망 서비스와 통신할 수 있다.

 

만약 공격자가 SSRF 취약점을 통해 웹 서비스의 권한으로 요청을 보낼 수 있다면 공격자는 외부에서 간접적으로 내부망 서비스를 이용할 수 있고, 이는 곧 기업에 막대한 피해를 입힐 수 있다.


이 HTTP 통신이 이뤄질 때 요청 내에 이용자의 입력값이 포함됨.
이용자의 입력값으로 포함되면 개발자가 의도하지 않은 요청이 전송이 될 수 있음.

SSRF: 웹 서비스의 요청을 변조하는 취약점,웹 서비스의 권한으로 변조된 요청을 보낼 수 있음.

 

웹 서비스가 보내는 요청을 변조하기 위해서는 요청 내에 이용자의 입력값이 포함돼야 한다.

 

대표적인 예시는 아래와 같다.

 

- 이용자가 입력한 URL에 요청을 보내는 경우

- 웹 서비스의 요청 URL에 이용자의 입력값이 포함되는 경우

- 이용자가 입력한 값이 HTTP Body에 포함되는 경우

 

블라인드 SSRF

- Blind SSRF 공격은 반드시 데이터를 반환하는 것은 아니며, 서버 백엔드에 무단 작업을 수행하는데 초점을 둠. 
- 서버의 무언가를 변경하거나, 파일을 수정, 삭제하거나 권한을 바꾸는 등의 다양한 무단 작업을 실행하는데 초점을 둠.

가시적인 응답이나 데이터를 끌어내는 것이 아니라 서버를 대신해 유해한 작업을 수행하는데 초점을 둔다는 점에서 이 유형의 SSRF 공격을 '블라인드' SSRF라고 한다.

 

SSRF 공격을 방지하는 방법

1. 내부 애플리케이션과 접촉하는 입력에 대해 사용자가 영향을 미치지 못하도록 하는 것.

- 내부 애플리케이션은 무조건적으로 입력을 신뢰하거나 정상적인 사용자로부터의 입력이라고 가정해서는 안 됨.

- 사용자 입력은 항상 삭제하거나 유효성을 검사해야 됨.


2. 얼로우리스트(Allowlist)와 디나이리스트(denylist)

프로그램의 로직을 수정할 수 없고 URL이 절대적으로 필요할 때 사용.

얼로우리스트,화이트리스팅(Whitelisting): 프로그램이 허용된 객체, 또는 특정 위치에서만 접근을 허용해 프로세스의 보안을 높임.

 

디나이리스트: 선택된 특정 위치(EX: localhost)에 대해서만 접근을 거부하고 나머지는 모두 허용한다.

하지만 공격자가 예를 들어 HTTP 리디렉션, 난독화된 URL, DNS 리바인딩 등을 통해 우회로를 찾을 위험이 존재한다.

 

3. 애플리케이션에서 HTTP 또는 HTTPS만 사용하여 요청하는 경우 이러한 URL 스키마만 허용한다.

file:///, dict://, ftp:// 및 gopher:// 와 같은 URL 스키마를 사용하지 않도록 설정하면 공격자는 웹 애플리케이션을 사용하여 이러한 URL 스키마를 사용하여 위험한 요청을 할 수 없다.

 

참조

SSRF(서버 측 요청 위조)란 무엇입니까? 튜토리얼 & 예제 | 웹 보안 아카데미 (portswigger.net)

 

What is SSRF (Server-side request forgery)? Tutorial & Examples | Web Security Academy

In this section, we'll explain what server-side request forgery is, describe some common examples, and explain how to find and exploit various kinds of SSRF ...

portswigger.net

서버 측 요청 위조 공격 (beaglesecurity.com)

 

Server Side Request Forgery Attack

What is a Server Side Request Forgery Attack?

beaglesecurity.com

드림핵 - Web Hacking Command Injection, SSRF 해커들의 놀이터, Dreamhack

 

해커들의 놀이터, Dreamhack

해킹과 보안에 대한 공부를 하고 싶은 학생, 안전한 코드를 작성하고 싶은 개발자, 보안 지식과 실력을 업그레이드 시키고 싶은 보안 전문가까지 함께 공부하고 연습하며 지식을 나누고 실력 향

dreamhack.io

'WEB 정리' 카테고리의 다른 글

OWASP ZAP & Web Crawring(Web Scrapping)  (0) 2023.05.25
버프 스위트(Burp Suite) 사용 및 조작 (Proxy & Intruder)  (0) 2023.05.25
XSS 실습  (0) 2023.05.24
File download & upload vunerablity 정리  (0) 2023.05.24
XSS & CSRF 정리  (0) 2023.05.24