Missions 및 지침

보안 코딩의 실용적 구현

OWASP Top 10과 같은 소프트웨어 취약점을 이해하고 완화하기 위한 안전한 코딩 지침을 살펴보고, 실제 애플리케이션 시뮬레이션 훈련을 위한 가이드형 missions 참여하세요.

배울 BG

모든 missions 살펴보세요

더 보기
생산성을 높이세요
주입 SQL
한 사용자가 온라인 뱅킹 솔루션의 거래 검색 기능에서 SQL 인젝션 취약점을 악용할 수 있었다고 보고했습니다. 해당 사용자는 다른 사용자의 거래 내역을 조회할 수 있었으며, 이 취약점을 악용하면 공격자가 데이터베이스 내에서 테이블 삭제, 타 테이블 데이터 조회, 데이터 삽입 등 다양한 악의적인 행위를 수행할 수 있다고 지적했습니다. 이 임무에서 사용자가 수행한 작업을 재현해 보십시오.
생산성을 높이세요
Spring MVC 요청 매처
2023년 3월, Spring은 내부적으로 발견된 취약점(CVE-2023-20860)에 대한 패치를 공개했습니다. 이 취약점은 MvcRequestMatchers에서 이중 제네릭 **을 사용할 경우 Spring Security와 Spring MVC 간에 패턴 불일치가 발생할 수 있는 문제였습니다. 이는 결국 사용자가 특정 엔드포인트에 무단으로 접근할 수 있는 결과를 초래할 수 있었습니다. 우리는 몇 개의 엔드포인트로 구성된 매우 단순화된 은행 애플리케이션을 구축했습니다. 지침을 따라 이 접근 제어 결함의 영향을 재현해 보십시오.
생산성을 높이세요
심령 서명 - 알려진 취약점 구성 요소 활용
CVE-04-21494는 취약점 중 가장 멋진 별칭인 '자바의 심령 서명(Psychic Signatures)'을 가지고 있습니다. 이 이름은 어떻게 붙여졌을까요? 닥터 후(Doctor Who)의 심령 기사(psychic articles)를 참고한 것입니다. 누군가에게 보여줄 때, 이 빈 종이들은 그가 보고 싶어 하는 내용으로 채워졌습니다. 비슷한 현상이 Java(버전 15~18)의 ECDSA 알고리즘 구현에서 발생했는데, 이는 JWT 서명 검증에 영향을 미칩니다. 우리는 유효하지 않은 서명을 제출할 수 있지만, Java는 이를 유효한 것으로 인식합니다. 어떻게 작동하는지 보고 싶으신가요? 시작해 보죠.
생산성을 높이세요
아파치 경로 트래버설: 알려진 취약한 구성 요소 활용
2021년 10월 4일, Apache 팀은 Apache 2.4.48의 경로 탐색 및 원격 코드 실행 취약점(CVE-2021-41773으로도 알려져 있음)을 수정하기 위해 Apache 2.4.49 버전을 출시했습니다. 2021년 10월 7일, 2.4.50 패치의 수정 사항이 완전하지 않아 2.4.51 버전을 추가로 공개했습니다. 이 취약점은 CVE-2021-42013으로 등록되었습니다. 이 취약점이 어떻게 악용될 수 있는지 직접 확인해 보려면 이 미션을 시도해 보세요.
생산성을 높이세요
Log4j - 취약한 구성 요소 사용
2021년 12월 초, 인기 있는 로깅 라이브러리 Log4j에서 발견된 제로데이 취약점(CVE-2021-44228) 발표는 자바 커뮤니티에 폭탄 같은 충격으로 다가왔다. 'Log4Shell'이라 명명된 이 취약점은 Log4j v2의 2.0-beta9부터 2.14.1 버전까지 영향을 미치며 원격 코드 실행을 유발할 수 있습니다. 저희는 이 취약점을 시뮬레이션할 수 있는 환경을 구축하여 직접 그 영향을 확인해 보실 수 있도록 했습니다. 지금 바로 시도해 보세요.
생산성을 높이세요
트로이 목마 소스 - 신뢰할 수 없는 출처의 구성 요소 사용
바이킹 뱅크의 한 개발자가 신용카드 관리를 위한 행정 권한 제어 기능을 작성하는 데 도움을 주기 위해, 잠재적으로 취약한 구성 요소를 포함할 수 있는 신뢰할 수 없는 인터넷 출처의 코드를 순진하게 복사했습니다. 사용자들이 신용카드 한도를 변경하는 현상이 발생했는데, 이는 관리자만 해당 권한을 보유해야 합니다. 해당 코드에 문제가 있다고 판단됩니다. 코드 분석 임무를 수행해 보십시오.
생산성을 높이세요
Codestashbin - 비보안 비밀번호 재설정 기능
CodeStashbin은 세계 최대 규모의 코드 버전 관리 호스팅 기업 중 하나입니다. 소문에 따르면, 비밀번호 재설정 기능의 보안 취약점으로 인해 비밀번호 분실 처리 과정에 결함이 있다고 합니다. 이를 통해 특권 사용자의 비밀번호를 변경하고 해당 계정에 접근할 수 있을지도 모릅니다. 이 문제를 조사하기 위해 이 임무에 참여하십시오.
생산성을 높이세요
「ChatterGPT」에서의 사이트 간 스크립팅(XSS)
이 임무는 인기 있는 대규모 언어 모델(LLM)의 익숙한 인터페이스를 보여주며, 2023년 11월 말에 생성된 실제 코드 조각을 사용합니다. 사용자는 이 코드 조각을 해석하고, 의도된 목적으로 사용될 경우 발생할 수 있는 잠재적 보안 취약점을 분석할 수 있습니다.

모든 지침을 살펴보세요

찾아보기:
필터 숨기기
선정
필터 표시
선정
필터 지우기
발리스
슈퍼 아이콘 [★]
테마
더 보기

부족한 기록 및 감시

모범 사례:

민감한 기능에 대한 감사 기록:
오류 기록:
중앙 집중식 로그 저장소:
로그를 지정된 기간 동안 보관:
개인 정보에 대한 로그 정기 감사:

기록과 감시는 종종 문제가 발생한 후에야 뒷전으로 밀려나지만, 실제로 적절한 기록과 감시를 확보하지 못하면 매우 큰 비용을 초래할 수 있습니다. 한편, 보안 관련 여부를 막론하고 사고 발생 시 로그가 부족하거나 아예 없을 경우 실제 상황을 파악하는 것이 불가능해집니다. 반대로 지나치게 많은 데이터를 기록하면 개인정보 보호 문제가 발생할 수 있으며, 이는 규제 기관과의 분쟁으로 이어질 수 있습니다. 부족한 로그 기록 및 모니터링을 방지하기 위한 모범 사례를 알아보려면 가이드를 참조하십시오.

지침 표시

알려진 취약점을 가진 구성 요소 사용

{
« dépendances » : {
« foo » : « 1.0.0 - 2.9999.9999",
« barre » : « >=1,0.2 <2.1.2 »
}
}

대부분의 애플리케이션은 다량의 타사 구성 요소를 사용합니다. 이러한 구성 요소는 로깅부터 모델 생성, 데이터베이스 접근 등에 이르기까지 모든 것을 제공합니다. 이는 소프트웨어 개발을 크게 용이하게 하고 많은 시간을 절약해 줍니다. 하지만 이들도 사람이 만든 것이므로 일부에는 필연적으로 취약점이 존재할 수밖에 없습니다. 자세한 내용은 가이드를 참조하세요.

지침 표시

주입 SQL

importer mysql.connector
base de données = mysql.connector.connect
Pratique #나쁜 코드. 피하세요! 학습용입니다.
(host="localhost », user="newuser », passwd="pass », db="sample »)
cur = db.cursor ()
name = raw_input ('이름을 입력하세요 : ')
cur.execute (« SELECT * FROM sample_data WHERE Name = '%s' ; » % name) pour la ligne dans cur.fetchall () : print (row)
db.fermer ()

SQL 인젝션(SQLi)은 SQL 명령어에 코드를 삽입하여 애플리케이션으로부터 중요한 정보를 공격하고 수집하는 기술입니다. 이는 웹 보안 취약점이며, 데이터베이스를 조작하여 핵심 정보를 추출하는 가장 흔한 해킹 기법입니다.

지침 표시

보안 설정 오류

많은 프레임워크는 또한 활성화할 수 있는 일련의 엔드포인트를 제공하여 프로덕션 환경이나 테스트/개발 환경에서 애플리케이션을 모니터링할 수 있게 합니다. 여기에는 다음 항목이 포함될 수 있습니다:

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

보안 설정 오류는 일종의 포괄적 용어로, 잘못된 코드보다는 애플리케이션의 구성 설정으로 인해 발생하는 일반적인 취약점을 포괄합니다. 이는 기술 인프라와 같은 요소에 크게 좌우되는 매우 다양한 주제입니다. 이러한 문제 해결은 설정 파일 수정이나 단일 코드 줄 변경처럼 간단해 보일 수 있지만, 해당 취약점의 영향과 결과는 심각할 수 있습니다. 이 취약점에 대한 자세한 내용과 완화 방법을 알아보려면 저희 가이드를 참고하세요.

지침 표시

서버 요청 위조

ts
let url = request.params.url ;

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

return render.export() ;

서버 측 요청 위조 취약점은 사용자가 애플리케이션으로 하여금 공격자가 지정한 도메인으로 HTTP 요청을 전송하도록 유도할 때 발생합니다. 애플리케이션이 사설/내부 네트워크에 접근할 수 있는 경우, 공격자는 애플리케이션이 내부 서버로도 요청을 전송하도록 유도할 수 있습니다. 이 지침에서 실제 작동 방식을 더 잘 이해하기 위해 몇 가지 예시를 통해 이를 자세히 살펴보겠습니다.

지침 표시

비밀번호 저장

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

사용자 인증을 수행하는 애플리케이션이라면, 해당 애플리케이션이 비밀번호도 처리할 가능성이 매우 높습니다. 사용자 비밀번호 관리는 매우 중요하며, 이를 적절히 처리하는 것은 더욱 중요합니다. 애플리케이션이 공격을 받아 사용자 비밀번호가 인터넷에 유출되어 누구나 볼 수 있게 되는 상황보다 더 나쁜 시나리오는 상상하기 어렵습니다. 비밀번호를 안전하게 저장하고 모범 사례에 부합하도록 관리하는 방법은 무엇일까요? 몇 가지 방법을 살펴보겠습니다.

지침 표시

대량 위선

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 매개변수를 모델에 자동 바인딩하고 이를 검증 없이 사용하는 라이브러리/프레임워크를 사용할 때 발생할 수 있습니다. 요청을 객체에 자동 바인딩하는 기능은 매우 유용할 수 있지만, 모델에 사용자에게 노출되어서는 안 되는 속성이 존재할 경우 보안 문제를 야기할 수 있습니다. 자세한 내용은 가이드라인을 참조하십시오.

지침 표시

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

xml
< ? version xml = « 1.0 » ? >
< ! Élément extérieur DOCTYPE [
< ! ENTITY ExternalEntity SYSTEM « file : ///etc/passwd » >] >
<outerElement>&Entité externe ;</outerElement>

XML 외부 엔티티(XXE) 취약점 클래스는 XML 파서와 관련된 보안 구성 오류입니다. XML 표준은 파일 및 URL과 같은 '엔티티'를 참조하는 방법을 포함합니다. 기본적으로 파서들은 외부 엔티티를 완전히 해결하므로, XML 문서는 잠재적 공격자에게 파일 및 기타 민감한 정보의 유출을 초래할 수 있습니다. 자세한 내용은 전체 지침을 참조하십시오.

지침 표시

주입 - 궤도 교차

pseudo
let BaseFolder = « /var/www/api/documents/ » ;
let path = BaseFolder + request.params.filename ;

renvoie file.read (chemin) ;

경로 탐색(Path Traversal)은 또 다른 유형의 상당히 흔한 주입 취약점입니다. 이는 URI(URL, 파일 경로 등) 생성이 완전히 해결된 경로가 예상 경로 루트 외부로 가리키지 않도록 제대로 보장하지 못할 때 발생하는 경향이 있습니다. 경로 탐색 취약점의 영향은 탐색이 발생하는 맥락과 수행된 전반적인 강화 조치에 크게 좌우됩니다. 자세한 내용은 가이드를 참조하십시오.

지침 표시

인증 및 권한 부여

cs

//Assurez-vous que le comportement par défaut est d'authentifier les demandes et de vérifier si elles sont d'origine administrative
[Authentifier]
[Autoriser (« Admin »)]
classe publique SecureController : Controller
{

}

classe publique MyController : SecureController
{

//Remplace l'attribut Authorize hérité pour permettre à n'importe quel utilisateur d'accéder à la page

지침 표시

인젝션 - XSS

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

크로스 사이트 스크립팅(XSS)은 공격자가 제어하는 스크립트가 다른 사용자의 브라우저에서 실행되도록 하는 또 다른 유형의 인젝션 취약점입니다. XSS는 HTML/JavaScript 인젝션 취약점으로 간주될 수도 있습니다. 이제 여러분이 접할 수 있는 XSS 유형을 살펴보겠습니다.

지침 표시

주입 101

가장 일반적인 주입 유형으로는 다음과 같습니다:

SQL 주입
크로스 사이트 스크립팅 (HTML/JavaScript 주입)
경로 탐색 (경로/URL 주입)
명령어 주입
코드 주입

가장 잘 알려진 취약점 범주 중 하나는 일반적으로 인젝션 관련 취약점이며, 특히 누구도 놀라지 않을 만큼 확실한 대표 사례는 SQL 인젝션입니다. 기술계에서 SQL 인젝션에 대한 이야기를 듣지 않는 것은 거의 불가능하므로, 간단히 설명해 보겠습니다. 인젝션 결함에 대한 간략한 소개를 위해 계속 읽어보세요.

지침 표시

파일 다운로드

chaîne publique UploadProfilePicture (FormFile UploadedFile)
{
//Génère le chemin pour enregistrer le fichier téléchargé dans
var path = $ ». /uploads/avatars/ {request.user.id}/{uploadedFile.FileName} » ;

//Sauvegarde du fichier
var LocalFile = File.OpenWrite (chemin) ;
LocalFile.write (UploadedFile.readToEnd ()) ;
Fichier local .Flush () ;
LocalFile.close () ;

//Mise à jour de la photo de profil
UserProfile.UpdateUserProfilePicture (request.User, chemin)

chemin de retour ;
}

애플리케이션은 사용자가 애플리케이션 내 어디에서든 파일을 다운로드할 수 있도록 허용해야 하는 경우가 매우 흔합니다(사용하거나 단순히 저장하기 위해). 이는 상당히 간단해 보이지만, 파일 다운로드 관리와 관련된 잠재적 위험으로 인해 이 기능의 구현 방식은 상당히 중요할 수 있습니다. 자세한 내용은 가이드라인을 참조하십시오.

지침 표시

명령어 주입

let ip = request.params.IPAddress ;

système (« ping" + ip) ;

명령어 주입 자체를 살펴보겠습니다. 주로 몇 가지 다른 예시에 집중하여 실제 작동 모습을 더 쉽게 파악할 수 있도록 하겠습니다. 참고로, 명령어 주입 취약점은 사용자의 입력이 운영체제 명령어의 일부를 활용할 때 발생합니다. 자세한 내용은 해당 지침을 참조하십시오.

지침 표시