공개 missions & 가이드라인

실용적인 보안 코딩

보안 코딩 가이드라인을 살펴보고 OWASP 상위 10가지와 같은 소프트웨어 취약점을 이해하고 완화할 수 있으며, 가이드 교육( Missions )을 통해 실제 앱 시뮬레이션을 실습할 수 있습니다.

모두 찾아보기 missions

자세히 보기
생산성 향상
SQL 주입
한 사용자로부터 인터넷 은행 솔루션의 거래 검색 기능에서 SQL 인젝션 취약점을 악용할 수 있었다는 신고를 받았습니다. 이 사용자는 다른 사용자의 거래를 볼 수 있었다고 말하며, 이 취약점을 통해 공격자가 테이블 삭제, 다른 테이블의 데이터 보기, 데이터 삽입 등 데이터베이스에 온갖 종류의 끔찍한 일을 할 수 있다고 지적했습니다. 이 미션에서 사용자가 수행한 작업을 직접 복제해 보세요.
생산성 향상
Spring MvcRequestMatchers
2023년 3월, Spring은 내부적으로 발견된 취약점(CVE-2023-20860)에 대한 수정 사항을 발표했는데, mvcRequestMatchers에서 이중 와일드카드**를 사용하면 Spring Security와 Spring MVC 간에 패턴 불일치가 발생할 수 있습니다. 이로 인해 궁극적으로 사용자가 특정 엔드포인트에 대한 무단 액세스를 얻을 수 있습니다. 몇 개의 엔드포인트로 매우 간단한 뱅킹 애플리케이션을 설정해 보았습니다. 지침에 따라 이 접근 제어 취약점의 영향을 재현해 보세요.
생산성 향상
트로이 목마 소스 - 신뢰할 수 없는 소스의 구성 요소 사용
바이킹 은행 개발자 중 한 명이 신용카드 관리를 위한 관리자 권한 확인을 작성하기 위해 인터넷의 신뢰할 수 없는 소스에서 취약한 구성 요소가 포함되어 있을 가능성이 있는 일부 코드를 순진하게 복사했습니다. 관리자만 이 권한을 가져야 함에도 불구하고 사용자들이 신용카드 한도를 변경하는 것을 발견했습니다. 해당 코드에 문제가 있는 것 같습니다. 코드를 조사하는 미션을 수행해 보세요.
생산성 향상
심령 서명 - 알려진 취약한 구성 요소 사용
CVE-2022-21449는 자바의 심령 서명이라는 가장 멋진 별칭을 가진 취약점입니다. 어떻게 그런 이름이 붙었을까요? 그것은 닥터 후의 초능력 종이에 대한 언급입니다. 누군가에게 이 빈 종이를 보여주면, 그 사람이 예상할 수 있는 내용으로 채워지게 됩니다. Java(버전 15부터 18까지)의 ECDSA 알고리즘 구현에서도 비슷한 일이 발생했으며, 이는 JWT의 서명 확인에 영향을 미칩니다. 유효하지 않은 서명을 제출할 수 있지만 Java는 이를 유효한 것으로 간주합니다. 어떻게 작동하는지 알고 싶으신가요? 시작해 보겠습니다.
생산성 향상
Apache 경로 탐색 - 알려진 취약한 구성 요소 사용
2021년 10월 4일 아파치 팀은 아파치 2.4.48의 경로 탐색 및 원격 코드 실행 취약점(CVE-2021-41773으로도 알려진)을 해결하기 위해 아파치 2.4.49 버전을 출시했습니다. 2021년 10월 7일, 2.4.50 핫픽스의 수정이 완료되지 않아 2.4.51 버전을 출시했습니다. 이 취약점은 CVE-2021-42013으로 추적되었습니다. 이 미션을 통해 이 취약점이 어떻게 악용될 수 있는지 직접 확인해 보세요.
생산성 향상
코드스타시빈 - 안전하지 않은 비밀번호 재설정 기능
CodeStashBin은 세계 최대의 코드 버전 관리 호스팅 회사 중 하나입니다. 비밀번호 찾기 프로세스에 안전하지 않은 비밀번호 재설정 기능 취약점이 있다는 소문이 돌고 있습니다. 권한 있는 사용자의 비밀번호를 변경하여 계정에 액세스할 수 있을지도 모릅니다. 이 미션에 참여하여 문제를 조사해 보세요.
생산성 향상
Log4j - 알려진 취약한 구성 요소 사용
2021년 12월 초, 매우 인기 있는 로깅 라이브러리 Log4j의 0일 익스플로잇(CVE-2021-44228)이 발표되면서 Java 커뮤니티에 폭탄이 떨어졌습니다. Log4Shell이라고 불리는 이 익스플로잇은 Log4j v2 버전 2.0-beta9부터 2.14.1까지 영향을 미치며 원격 코드 실행으로 이어질 수 있습니다. 이 익스플로잇이 어떤 영향을 미치는지 직접 확인할 수 있도록 모의 환경을 설정했습니다. 지금 바로 사용해 보세요.
생산성 향상
'ChatterGPT'의 크로스 사이트 스크립팅(XSS)
이 미션은 2023년 11월 말에 생성된 실제 코드 스니펫을 활용하여 인기 있는 LLM의 익숙한 인터페이스를 보여줍니다. 사용자는 이 코드 조각을 해석하고 의도된 목적에 맞게 사용될 경우 잠재적인 보안 함정을 조사할 수 있습니다.

모든 가이드라인 찾아보기

검색 기준:
필터 숨기기
필터 표시  
필터 지우기
태그
주제
자세히 보기

불충분한 로깅 및 모니터링

모범 사례:

민감한 기능에 대한 로깅 감사
오류 로깅
중앙 집중식 위치에 로그 저장
정해진 기간 동안 로그 보존
PII에 대한 정기적인 로그 감사

로깅과 모니터링은 이미 문제가 발생한 후에나 고려하는 경우가 많지만, 실제로는 적절한 로깅과 모니터링이 이루어지지 않으면 막대한 비용이 발생할 수 있습니다. 극단적인 예로, 보안과 관련된 인시던트가 발생했을 때 로그가 거의 없거나 전혀 없으면 실제로 무슨 일이 일어났는지 파악할 수 없게 됩니다. 다른 극단적인 예로, 너무 많은 데이터를 기록하면 개인정보 보호 문제가 발생하여 규제 기관에 문제를 일으킬 수 있습니다. 불충분한 로깅 및 모니터링을 피하기 위한 모범 사례에 대한 가이드라인을 읽어보세요.

가이드라인 보기

알려진 취약점이 있는 구성 요소 사용

{
 "dependencies": {
   "foo": "1.0.0 - 2.9999.9999",
   "bar": ">=1.0.2 <2.1.2"
 }
}

대부분의 애플리케이션은 대량의 타사 컴포넌트를 사용합니다. 이러한 구성 요소는 로깅, 템플릿, 데이터베이스 액세스 등 모든 것을 제공합니다. 따라서 소프트웨어 개발이 훨씬 쉬워지고 많은 시간을 절약할 수 있습니다. 하지만 이러한 컴포넌트도 사람이 만든 것이기 때문에 일부에는 필연적으로 취약점이 있을 수 있습니다. 자세한 내용은 가이드라인을 참조하세요.

가이드라인 보기

SQL 주입

import mysql.connector
db = mysql.connector.connect
#Bad Practice. 피하세요! 이것은 단지 학습용입니다.
(host="localhost", user="newuser", passwd="pass", db="sample")
cur = db.cursor()
name = raw_input('Enter Name: ')
cur.execute("SELECT * FROM sample_data WHERE Name = '%s';" % name) for row in cur.fetchall(): print(row)
db.close()

SQL 인젝션(SQLi)은 SQL 문에 코드를 삽입하여 애플리케이션에서 중요한 정보를 공격하고 수집합니다. 웹 보안 취약점입니다. 데이터베이스를 조작하여 중요한 정보를 추출하는 가장 일반적인 해킹 기법입니다.

가이드라인 보기

서버 측 요청 위조

ts
let url = request.params.url;

let response = http.get(url);
let render = response.render();

return render.export();

서버 측 요청 위조 취약점은 사용자가 애플리케이션이 공격자가 지정한 도메인에 HTTP 요청을 하도록 만들 수 있을 때 발생합니다. 애플리케이션이 사설/내부 네트워크에 액세스할 수 있는 경우 공격자는 애플리케이션이 내부 서버에 요청을 하도록 만들 수도 있습니다. 이 가이드 라인에서 실제로 어떻게 작동하는지 더 잘 이해하기 위해 몇 가지 예를 통해 자세히 살펴보겠습니다.

가이드라인 보기

보안 구성 오류

또한 많은 프레임워크에는 프로덕션 환경이든 테스트/개발 환경이든 애플리케이션을 모니터링할 수 있는 엔드포인트 세트를 활성화할 수 있습니다. 여기에는 다음이 포함될 수 있습니다:

메트릭(Prometheus)
로그
환경 정보
경로/URL 매핑

보안 설정 오류는 잘못된 코드가 아닌 애플리케이션의 구성 설정으로 인해 발생하는 일반적인 취약점을 포괄하는 용어입니다. 이는 광범위한 주제이며 기술 스택과 같은 요인에 따라 크게 달라집니다. 이러한 문제를 해결하는 것은 구성 파일이나 코드 한 줄을 변경하는 것처럼 간단해 보이지만, 이러한 취약점으로 인한 영향과 결과는 심각할 수 있습니다. 이 취약점에 대한 자세한 내용과 취약점을 완화하는 방법을 알아보려면 가이드라인을 읽어보세요.

가이드라인 보기

비밀번호 저장

기능 암호화 해시 암호 해시 속도 매우 빠름 의도적으로 느림 작업 계수 조정 가능 아니오 예

애플리케이션이 사용자를 인증하는 경우, 비밀번호도 처리할 가능성이 높습니다. 사용자 비밀번호를 처리하는 것은 정말 큰 문제이며, 이를 적절하게 처리하는 것은 더 큰 문제입니다. 애플리케이션이 공격을 받아 사용자 비밀번호가 인터넷을 통해 모든 사람이 볼 수 있도록 유출되는 것보다 더 나쁜 시나리오는 상상하기 어렵습니다. 비밀번호를 모범 사례에 따라 안전하게 보관하려면 어떻게 해야 할까요? 몇 가지 방법을 살펴보겠습니다.

가이드라인 보기

보안 구성 오류 - XXE 상세 정보

xml
<?xml version="1.0" ?>
<!DOCTYPE outerElement [
   <!ENTITY externalEntity SYSTEM  "file:///etc/passwd" > ]>
<outerElement>&externalEntity;</outerElement>

"XML 외부 엔티티"(XXE) 취약성 클래스는 XML 파서와 관련된 보안 구성 오류입니다. XML 표준에는 파일 및 URL과 같은 '엔티티'를 참조하는 방법이 포함되어 있습니다. 파서가 외부 엔티티를 완전히 해석하는 것이 기본값인 경우가 많기 때문에 XML 문서가 잠재적인 공격자에게 파일 및 기타 민감한 정보를 노출할 수 있습니다. 자세한 내용은 전체 가이드라인을 참조하세요.

가이드라인 보기

질량 할당

html
<form method="POST">
     <input name="Id" type="hidden" value="666">
     <input name="Name" type="text" value="Bad guy">
     <input name="EmailAddress" type="text" value="hacker@attacker.com">
     <input name="IsAdmin" type="hidden" value="true">
     <input type="submit">
</form>  

대량 할당은 API 엔드포인트가 사용자가 관련 객체의 어떤 속성을 수정할 수 있는지 제한하지 않는 취약점입니다. 이 취약점은 HTTP 매개변수를 모델에 자동으로 바인딩한 다음 유효성 검사 없이 계속 사용할 수 있는 라이브러리/프레임워크를 사용할 때 발생할 수 있습니다. 요청에서 객체에 대한 자동 바인딩을 사용하는 것은 때때로 매우 유용할 수 있지만, 모델에 사용자가 액세스할 수 없는 속성이 있는 경우 보안 문제가 발생할 수도 있습니다. 자세한 내용은 가이드라인을 참조하세요.

가이드라인 보기

주입 - 경로 탐색

pseudo
let baseFolder = "/var/www/api/documents/";
let path = baseFolder + request.params.filename;

return file.read(path);

경로 통과는 또 다른 매우 일반적인 유형의 인젝션 취약점입니다. URL, 파일 경로 등 URI를 구성할 때 완전히 확인된 경로가 의도한 경로의 루트 외부를 가리키지 않도록 제대로 보장하지 않을 때 발생하는 경향이 있습니다. 경로 트래버스 취약점의 영향은 트래버스가 발생하는 컨텍스트와 전반적인 강화 정도에 따라 크게 달라집니다. 자세한 내용은 가이드라인을 참조하세요.

가이드라인 보기

인젝션 - XSS

```html
<!--- UNSAFE: The htmlSnippet will get interpreted without any escaping --->
@Html.Raw(htmlSnippet)
```

XSS라고도 하는 크로스 사이트 스크립팅은 다른 사용자의 브라우저에서 공격자가 제어하는 스크립트가 평가되도록 하는 또 다른 유형의 인젝션 취약점입니다. XSS는 HTML/JavaScript 인젝션 취약점이라고도 할 수 있습니다. 발생할 수 있는 XSS의 유형을 살펴보겠습니다.

가이드라인 보기

파일 업로드

public string UploadProfilePicture(FormFile uploadedFile)
{
    // Generate path to save the uploaded file at
    var path = $"./uploads/avatars/{request.User.Id}/{uploadedFile.FileName}";

    // Save the file
    var localFile = File.OpenWrite(path);
    localFile.Write(uploadedFile.ReadToEnd());
    localFile.Flush();
    localFile.Close();

    // Update the profile picture 
    UserProfile.UpdateUserProfilePicture(request.User, path)

    return path;
}

애플리케이션에서 사용자가 애플리케이션 내 어딘가에 파일을 업로드(사용 또는 저장용)할 수 있도록 허용해야 하는 경우가 매우 흔합니다. 이 기능은 간단해 보이지만 파일 업로드 처리 방식과 관련된 잠재적 위험으로 인해 이 기능을 구현하는 방식이 매우 중요할 수 있습니다. 자세한 내용은 가이드라인을 참조하세요.

가이드라인 보기

주입 101

가장 일반적인 인젝션 유형은 다음과 같습니다:

SQL 인젝션
크로스 사이트 스크립팅(HTML/자바스크립트 인젝션)
경로 탐색(경로/URL 인젝션)
명령 인젝션
코드 인젝션

가장 잘 알려진 취약점 유형 중 하나는 인젝션 취약점이며, 특히 놀랍게도 누구도 부인할 수 없는 포스터 자식인 인젝션 취약점입니다: SQL 인젝션입니다. 기술 업계에서 SQL 인젝션에 대한 이야기를 피하기는 어렵기 때문에 오늘은 이에 대해 이야기해 보려고 합니다. 인젝션 결함에 대한 간략한 소개를 읽어보세요.

가이드라인 보기

인증 및 권한 부여

cs

// Ensure the default behaviour is to authenticate requests, and check if they are admin
[Authenticate]
[Authorize("Admin")]
public class SecureController : Controller
{

}

public class MyController : SecureController
{

    // Overrides the Authorize attribute inherited to allow any user to access the page

가이드라인 보기

명령 주입

let ip = request.params.ipAddress;

system("ping " + ip);

명령 인젝션 자체에 대해 살펴보겠습니다. 명령 인젝션이 실제로 어떻게 작동하는지 쉽게 알 수 있도록 몇 가지 예시를 중심으로 살펴보겠습니다. 간단히 정리하자면, 명령 인젝션 취약점은 사용자 입력이 운영 체제 명령의 일부를 사용할 때 발생합니다. 자세한 내용은 가이드라인을 참조하세요.

가이드라인 보기