본문 바로가기

4-3. 2023-2 심화 스터디/웹 취약점 분석

[2023.09.30]드림핵 웹해킹 로드맵 수강 - 스테이지 3개

Command Injection

    • Injection: 악의적인 데이터를 프로그램에 입력하여 이를 시스템 명령어, 코드, 데이터 베이스 쿼리 등으로 실행되게 하는 기법
    • Command Injection: 이용자의 입력을 시스템 명령어로 실행하게 하는 취약점이며 명령어를 실행하는 함수에 이용자가 임의의 인자를 전달할 수 있을 때 발생
    • Meta Character: 특수한 의미를 가진 문자
    • Command Injection은 명령어를 실행하는 함수에 이용자가 임의의 인자를 전달할 수 있을 때 발생한다. 웹 개발 과정에서 시스템 함수를 사용하면 이용자의 입력을 소프트웨어의 인자로 전달할 수 있다. 그러나 이러한 시스템 함수를 사용할 때 이용자의 입력을 제대로 검사하지 않고 실행하게 되면 임의 명령어가 동작할 수 있다. 따라서 공격자는 이러한 취약점을 노려 임의 명령어를 실행할 수 있다. &&, ;, | 등의 메타 문자를 사용하여 여러 개의 명령어를 연속으로 실행시킬 수 있다.

  • Command Injection의 취약점이 발생하는 원인은 단순하지만 치명적인 공격으로 이어질 수 있기에 개발자는 이용자의 입력을 반드시 검사해야하며, 시스템 함수의 사용을 되도록 자제할 필요가 있다.

 

File Vulnerability

  • File Vulnerability(파일 취약점): 파일을 업로드하거나 다운로드 할 때 발생하는 취약점이며 업로드와 다운로드 과정에서 발생하는 취약점으로 구분됨
  • File Upload Vulnerability(파일 업로드 취약점): 웹 서비스를 통해 이용자의 파일을 서버의 파일 시스템에 업로드하는 과정에서 발생하는 보안 취약점이며 이용자가 업로드될 파일의 이름을 임의로 정할 수 있을 때 발생한다. 이용자가 업로드될 파일의 이름을 임의로 정할 수 있을 때 발생한다. 파일 이름에 이용자의 이메일, 닉네임 등을 포함시키는 등의 소스 코드 패턴이 취약점을 발생시킬 수 있다.
  • 파일 업로드 취약점은 크게 Path Traversal과 악성 파일 업로드로 분류할 수 있는데 Path Traversal 취약점은 특정 디렉터리에만 파일 업로드를 허용하는 등의 제약을 우회하여, 임의 디렉터리에 파일을 업로드할 수 있는 취약점을 의미한다. 아래의 사진은 Path Traversal 취약점이 존재하는 코드이다.

  • 위의 코드 중 /fileUpload는 post의 요청을 받으면 클라이언트가 전송한 파일을 ./uploads에 저장한다. f.filename이라는 이용자가 입력한 파일 이름을 그대로 사용하기에 Path Traversal 취약점이 있다.
  • 악성 파일 업로드: 이용자가 파일을 업로드할 때 제대로 검사하지 않아서 발생하는 취약점이다. .php, .jsp, .asp와 같은 확장자의 파일을 실행하고 그 결과를 이용자에게 반환한다. 웹 브라우저는 파일의 확장자나 응답의 content-type에 따라 요청을 다양하게 처리한다. 만약, 요청한 파일의 확장자가 .html이거나 반환된 content-type 헤더가 text/html일 경우 응답은 HTML엔진으로 처리된다.
  • 또, 파일의 확장자가 .png, .jpg 등의 이미지 확장자이거나, content-type이 image/png일 경우에는 이미지로 렌더링된다. 만약 공격자가 서버에 exploit.html을 업로드하고 이에 접근하는 URL이 https://dreamhack.io/uploads/exploit.html이라면, 브라우저는 이를 HTML로 해석한다. exploit.html에 악의적인 스크립트를 삽입하면 XSS공격으로 이어질 수 있는 것이다.
  • Download Vulnerability(다운로드 취약점): 웹 서비스를 통해 서버의 파일 시스템에 존재하는 파일을 내려받는 과정에서 발생하는 보안 취약점이며, 이용자가 다운로드할 파일의 이름을 임의로 정할 수 있을 때 발생한다. 웹 서비스는 이용자가 업로드한 파일을 다운로드받거나 이미지를 불러올 때 특정 디렉터리에 있는 파일만 접근하도록 해야 한다.

 

Server side Request Forgery(SSRF)

  • SSRF: 웹 서비스의 요청을 변조하는 취약점으로, 브라우저가 변조된 요청을 보내는 CSRF와는 다르게 웹 서비스의 권한으로 변조된 요청을 보낼 수 있음
  • 구분 문자(Delimiter): 일반 텍스트 또는 데이터 스트림에서 별도의 독립적 영역 사이의 경계를 지정하는데 사용하는 하나의 문자 혹은 문자들의 배열
  • URL 필터링은 URL에 포함된 문자열을 검사하여 부적절한 URL로의 접근을 막는 보호 기법을 뜻하며 제어 방식에 따라 블랙리스트 필터링과 화이트리스트 필터링으로 나뉜다.

  • 위의 코드는 이용자가 전달한 URL에 요청을 보내는 예제 코드이다. 위 경로에 접속하면 image_downloader에서는 http://127.0.0.1:8000/request_info URL에 HTTP 요청을 보내고 응답을 반환한다. 반환한 값을 확인해보면 브라우저로 request_info 엔드포인트에 접속했을 때와 다르게 브라우저 정보가 python-requests/<LIBRARY_VERSION>인 것을 확인할 수 있다.이처럼 이용자가 웹 서비스에서 사용하는 마이크로서비스의 API 주소를 알아내고, image_url에 주소를 전달하면 외부에서 직접 접근할 수 없는 마이크로서비스의 기능을 임의로 사용할 수 있다.
  • SSRF는 웹 애플리케이션의 요청을 변조할 수 있기 때문에 상황에 따라 매우 치명적인 취약점이 될 수 있다. SSRF를 예방하기 위해서는 입력값에 대한 적절한 필터링과 도메인 또는 아이피에 대한 검증이 필수적이다.