공개 미션 및 가이드라인

실무에 바로 적용하는 보안 코딩

OWASP Top 10과 같은 소프트웨어 취약점을 이해하고 완화하기 위한 보안 코딩 가이드라인을 살펴보고, 실제 앱 시뮬레이션을 통해 실습할 수 있는 가이드형 교육 미션을 시작해 보세요.

데모 예약하기

모든 미션 보기

더 보기
확장 가능하고 매력적인

SQL 인젝션

인터넷 뱅킹 솔루션의 거래 검색 기능에서 SQL 인젝션 취약점을 악용할 수 있다는 사용자 제보를 받았습니다. 해당 사용자는 이 취약점을 통해 다른 사용자의 거래 내역을 조회할 수 있었으며, 공격자가 데이터베이스 테이블 삭제, 타 테이블 데이터 열람, 데이터 삽입 등 악의적인 행위를 수행할 수 있다고 지적했습니다. 이번 미션에서 사용자가 수행한 공격을 직접 재현해 보십시오.

지금 체험하기
확장 가능하고 매력적인

Spring MvcRequestMatchers

2023년 3월, Spring은 내부적으로 발견된 취약점인 CVE-2023-20860에 대한 수정 사항을 발표했습니다. 이는 mvcRequestMatchers에서 이중 와일드카드(**)를 사용할 경우 Spring Security와 Spring MVC 간의 패턴 불일치가 발생할 수 있는 문제였습니다. 이로 인해 사용자가 특정 엔드포인트에 무단으로 접근할 수 있게 될 위험이 있었습니다. 몇 가지 엔드포인트가 포함된 매우 단순화된 뱅킹 애플리케이션을 준비했습니다. 지침에 따라 이 접근 제어 취약점의 영향을 직접 재현해 보세요.

지금 체험하기
확장 가능하고 매력적인

사이킥 시그니처 - 알려진 취약 구성 요소 사용

CVE-2022-21449는 'Java의 사이킥 시그니처(Psychic Signatures)'라는 아주 흥미로운 별칭을 가진 취약점입니다. 왜 이런 이름이 붙었을까요? 이는 드라마 '닥터 후'에 등장하는 사이킥 페이퍼에서 유래했습니다. 상대방에게 보여주면 그 사람이 기대하는 내용이 적힌 것처럼 보이는 빈 종이 말이죠. Java(버전 15~18)의 ECDSA 알고리즘 구현에서도 이와 유사한 현상이 발생하며, 이는 JWT 서명 검증에 영향을 미칩니다. 즉, 유효하지 않은 서명을 제출해도 Java는 이를 유효한 것으로 인식합니다. 작동 원리가 궁금하신가요? 바로 시작해 보겠습니다.

지금 체험하기
확장 가능하고 매력적인

Apache 경로 탐색 - 알려진 취약점 구성 요소 사용하기

2021년 10월 4일, Apache 팀은 Apache 2.4.48 버전의 경로 탐색 및 원격 코드 실행 취약점(CVE-2021-41773)을 해결하기 위해 2.4.49 버전을 출시했습니다. 이후 2.4.50 핫픽스의 수정 사항이 불완전함이 확인되어 2021년 10월 7일 2.4.51 버전을 추가로 출시했습니다. 이 취약점은 CVE-2021-42013으로 추적되었습니다. 이 미션을 통해 해당 취약점이 어떻게 악용될 수 있는지 직접 확인해 보세요.

지금 체험하기
확장 가능하고 매력적인

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

2021년 12월 초, 널리 사용되는 로깅 라이브러리인 Log4j에서 제로데이 취약점(CVE-2021-44228)이 발표되면서 자바 커뮤니티에 큰 충격을 주었습니다. 'Log4Shell'이라 불리는 이 취약점은 Log4j v2 버전 2.0-beta9부터 2.14.1까지 영향을 미치며, 원격 코드 실행으로 이어질 수 있습니다. 취약점의 영향을 직접 확인하실 수 있도록 모의 환경을 구축했으니 지금 바로 체험해 보세요.

지금 체험하기
확장 가능하고 매력적인

트로이 목마 소스 - 신뢰할 수 없는 출처의 구성 요소 사용

Viking Bank의 한 개발자가 신용카드 관리용 관리자 권한 확인 기능을 작성하던 중, 인터넷의 신뢰할 수 없는 출처에서 취약한 구성 요소가 포함되었을 가능성이 있는 코드를 무심코 복사해 왔습니다. 관리자만 변경할 수 있어야 할 신용카드 한도를 일반 사용자들이 변경하고 있는 정황이 포착되었습니다. 해당 코드에 문제가 있다고 판단되니, 미션을 수행하여 코드를 조사해 보세요.

지금 체험하기
확장 가능하고 매력적인

코드스태시빈 - 취약한 비밀번호 재설정 기능

CodeStashBin은 세계 최대 규모의 코드 버전 관리 호스팅 기업 중 하나입니다. 소문에 따르면 비밀번호 찾기 프로세스에 취약한 비밀번호 재설정 기능 결함이 있다고 합니다. 권한이 있는 사용자의 비밀번호를 변경하여 계정에 접근할 수 있을지도 모릅니다. 이 미션에 참여하여 문제를 조사해 보세요.

지금 체험하기
확장 가능하고 매력적인

‘ChatterGPT’ 내 교차 사이트 스크립팅(XSS)

이 미션은 대중적인 LLM의 익숙한 인터페이스를 보여주며, 2023년 11월 말에 생성된 실제 코드 스니펫을 활용합니다. 사용자는 이 스니펫을 해석하고 의도된 목적으로 사용될 경우 발생할 수 있는 잠재적인 보안 취약점을 조사할 수 있습니다.

지금 체험하기

모든 가이드라인 보기

분류 기준:
필터 숨기기
선택
필터 표시
선택
필터 초기화
태그
슈퍼 아이콘 [★]
주제
더 보기

로깅 및 모니터링 미흡

모범 사례:

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

로깅과 모니터링은 문제가 발생한 뒤에야 뒤늦게 고려되는 경우가 많지만, 적절한 로깅 및 모니터링 체계를 갖추지 못하면 막대한 비용을 치를 수 있습니다. 극단적인 경우, 보안 관련 여부를 떠나 사고가 발생했을 때 로그가 거의 없거나 전혀 없다면 정확히 무슨 일이 일어났는지 파악하는 것이 불가능합니다. 반대로 너무 많은 데이터를 로깅하면 개인정보 보호 문제가 발생하여 규제 당국과의 마찰로 이어질 수 있습니다. 불충분한 로깅 및 모니터링을 방지하기 위한 모범 사례 가이드를 확인해 보세요.

가이드라인 보기

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

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

대부분의 애플리케이션은 다수의 타사 구성 요소를 사용합니다. 이러한 구성 요소는 로깅, 템플릿, 데이터베이스 액세스 등 다양한 기능을 제공하여 소프트웨어 개발을 훨씬 수월하게 만들고 많은 시간을 절약해 줍니다. 하지만 사람이 만드는 만큼, 일부 구성 요소에는 필연적으로 취약점이 포함될 수 있습니다. 자세한 내용은 가이드를 확인하세요.

가이드라인 보기

SQL 인젝션

import mysql.connector
db = mysql.connector.connect
#나쁜 관행입니다. 피하세요! 학습용으로만 작성되었습니다.
(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 문에 코드를 삽입하여 애플리케이션을 공격하고 중요한 정보를 탈취하는 웹 보안 취약점입니다. 이는 데이터베이스를 조작하여 핵심 정보를 추출하는 가장 일반적인 해킹 기법입니다.

가이드라인 보기

보안 설정 오류

많은 프레임워크에는 운영 환경이나 테스트/개발 환경에서 애플리케이션을 모니터링할 수 있도록 활성화할 수 있는 엔드포인트 세트가 포함되어 있습니다. 여기에는 다음이 포함될 수 있습니다:

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

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

가이드라인 보기

서버 측 요청 위조

ts
let url = request.params.url;

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

return render.export();

서버 사이드 요청 위조(SSRF) 취약점은 사용자가 애플리케이션을 조작하여 공격자가 지정한 도메인으로 HTTP 요청을 보내게 할 때 발생합니다. 애플리케이션이 비공개 또는 내부 네트워크에 접근할 수 있는 경우, 공격자는 이를 이용해 내부 서버로 요청을 보내도록 만들 수도 있습니다. 본 가이드에서는 몇 가지 예제를 통해 이 취약점이 실제로 어떻게 나타나는지 자세히 알아보겠습니다.

가이드라인 보기

비밀번호 저장

Feature Cryptographic hash Password hash Speed Very fast Intentionally slow Work factor can be adjusted No Yes

애플리케이션에서 사용자 인증을 수행한다면 비밀번호를 다룰 가능성이 높습니다. 사용자 비밀번호를 처리하는 것은 매우 중요한 일이며, 이를 적절하게 관리하는 것은 더욱 중요합니다. 애플리케이션이 공격을 받아 사용자 비밀번호가 인터넷에 유출되어 모두에게 공개되는 상황보다 더 끔찍한 일은 상상하기 어렵습니다. 비밀번호를 모범 사례에 따라 안전하게 저장하려면 어떻게 해야 할까요? 몇 가지 방법을 살펴보겠습니다.

가이드라인 보기

대량 할당

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>  

대량 할당(Mass Assignment)은 API 엔드포인트가 사용자에 의해 수정 가능한 객체 속성을 제한하지 않을 때 발생하는 취약점입니다. 이 취약점은 HTTP 매개변수를 모델에 자동으로 바인딩하는 라이브러리나 프레임워크를 사용하면서, 이후 별도의 검증 과정을 거치지 않을 때 발생할 수 있습니다. 요청 데이터를 객체에 자동으로 바인딩하는 기능은 매우 유용할 수 있지만, 모델에 사용자가 접근해서는 안 될 속성이 포함되어 있을 경우 보안 문제를 초래할 수 있습니다. 자세한 내용은 가이드라인을 참조하세요.

가이드라인 보기

보안 설정 오류 - XXE 상세 정보

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

“XML 외부 엔티티”(XXE) 취약점 유형은 XML 파서와 관련된 보안 설정 오류입니다. XML 표준에는 파일이나 URL과 같은 “엔티티”를 참조하는 방법이 포함되어 있습니다. 파서가 외부 엔티티를 완전히 해석하도록 설정되는 경우가 많기 때문에, XML 문서를 통해 공격자에게 파일이나 기타 민감한 정보가 노출될 수 있습니다. 자세한 내용은 전체 가이드라인을 참조하세요.

가이드라인 보기

인젝션 - 경로 탐색(Path Traversal)

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

return file.read(path);

경로 탐색(Path Traversal)은 매우 흔한 인젝션 취약점 유형 중 하나입니다. 이는 URI(URL, 파일 경로 등)를 구성할 때, 최종적으로 해석된 경로가 의도한 경로의 루트 외부를 가리키지 않도록 적절히 제어하지 못할 때 주로 발생합니다. 경로 탐색 취약점의 영향은 탐색이 발생하는 맥락과 적용된 전반적인 보안 강화 수준에 따라 크게 달라집니다. 자세한 내용은 가이드라인을 확인하세요.

가이드라인 보기

인증 및 권한 부여

cs

// 요청 인증을 기본 동작으로 설정하고 관리자 권한 여부를 확인
[Authenticate]
[Authorize("Admin")]
public class SecureController : Controller
{

}

public class MyController : SecureController
{

    // 상속된 Authorize 속성을 재정의하여 모든 사용자가 페이지에 접근할 수 있도록 허용

가이드라인 보기

주입 - XSS

```html
<!--- 위험: htmlSnippet은 이스케이프 처리 없이 해석됩니다 ---&gt;
@Html.Raw(htmlSnippet)
```

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

가이드라인 보기

주사 기초 가이드

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

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

가장 잘 알려진 취약점 유형 중 하나는 단연 인젝션 취약점이며, 그중에서도 가장 대표적인 사례는 놀랍지 않게도 SQL 인젝션입니다. 기술 업계에서 SQL 인젝션에 대해 들어보지 않기가 더 어려울 정도이니, 이번 기회에 확실히 짚고 넘어가겠습니다. 인젝션 결함에 대한 간략한 소개를 계속 읽어보세요.

가이드라인 보기

파일 업로드

public string UploadProfilePicture(FormFile uploadedFile)
{
    // 업로드된 파일을 저장할 경로 생성
    var path = $"./uploads/avatars/{request.User.Id}/{uploadedFile.FileName}";

    // 파일 저장
    var localFile = File.OpenWrite(path);
    localFile.Write(uploadedFile.ReadToEnd());
    localFile.Flush();
    localFile.Close();

    // 프로필 사진 업데이트
    UserProfile.UpdateUserProfilePicture(request.User, path)

    return path;
}

애플리케이션을 운영하다 보면 어떤 방식으로든 사용자가 파일을 업로드(사용 또는 저장 목적)할 수 있도록 허용해야 하는 경우가 매우 흔합니다. 간단해 보일 수 있지만, 파일 업로드 처리 방식에 따른 잠재적 위험 때문에 이 기능을 어떻게 구현하느냐가 매우 중요합니다. 자세한 내용은 가이드라인을 확인해 주세요.

가이드라인 보기

명령 주입(Command Injection)

let ip = request.params.ipAddress;

system("ping " + ip);

명령 주입에 대해 자세히 알아보겠습니다. 실제 사례를 통해 이해하기 쉽도록 몇 가지 예시를 중심으로 살펴보겠습니다. 간단히 복습하자면, 명령 주입 취약점은 사용자 입력값이 운영 체제 명령의 일부로 사용될 때 발생합니다. 자세한 내용은 가이드라인을 참조하세요.

가이드라인 보기