secdim/play-sdk

GitHub: secdim/play-sdk

SecDim Play SDK 是一套用于构建安全攻防演练挑战的开发工具包,帮助社区为安全培训平台创建可验证的漏洞修复练习。

Stars: 30 | Forks: 51

= SecDim Play 挑战构建器 ⚒️ SecDim Play 是一个新颖的平台,旨在通过攻防演练(wargames)学习如何发现、利用和修复安全漏洞。 我们在平台上免费公开托管社区挑战,以促进安全和开发者社区的发展。 此 SDK 用于创建攻防演练挑战。创建挑战的过程非常简单。每个挑战都是一个应用程序,其中包含一个故意设置的安全漏洞,玩家需要识别并修补该漏洞。 这些挑战附带两种类型的测试: 1. **可用性测试 (Usability Tests)** 📋:这些测试定义了应用程序的功能。它们始终会提供给玩家,并且被设计为通过状态,强调在解决安全问题的同时保持功能的重要性。 2. **安全测试 (Security Tests)** 🛡:根据难度的级别量身定制,这些测试充当脚本化的黑客攻击,旨在利用相关的安全漏洞。它们默认被设计为失败,只有在漏洞被修补后才会通过。 == 第 0 步:获得批准 请确保您已阅读我们的 https://secdim.com/reward/[奖励页面] 了解详情。 在构建您的挑战之前,请在 SecDim Discuss 上我们专属的 https://discuss.secdim.com/c/challenge-builder/44[挑战构建器类别] 中提交您的提案以供批准。 这可以确保您的想法符合我们当前的需求和社区目标。您还可以探索社区正在构建的其他挑战。 一旦我们的团队为您开绿灯,您就可以开始了。 == 第 1 步:入门 Fork 此仓库并启动您的 GitHub Codespace image::res/codespace.gif[Setting up GitHub Codespace] TIP: 您也可以在本地工作站上进行设置。安装 https://docs.docker.com/get-docker/[docker] 和 https://www.gnu.org/software/make/[make] 并继续阅读指南的其余部分。 要获取 SDK,请在终端中运行 `./build.sh`,然后选择 `init` 并输入一种语言。 这将创建一个名为 `level` 的目录,其中包含 一个*包含漏洞的示例应用和测试套件*。 查看 level 文件夹,这里包含了您的应用程序。 `src/` 目录将包含主应用程序以及上述两种测试。 根据所选语言的不同,测试可能位于同一个 `src/` 目录中,或者位于单独的 `test/` 目录中。 image::res/initrepo.gif[Initializing the SDK] == 第 2 步:引入漏洞 💀 默认情况下,SDK 附带了一个存在数字溢出漏洞的应用程序。以此为例,您可以实现自己的应用程序,并对安全漏洞进行新颖的设计。 这可以是一个完全不同的漏洞,或者是对现有漏洞的不同演绎。您可以完全重构甚至删除该应用程序,并实现您自己的功能。 TIP: 正在寻找灵感?https://cwe.mitre.org/top25/archive/2023/2023_top25_list.html[CWE Top 25] 或 https://github.com/semgrep/semgrep-rules[SemGrep Rules] 提供了包含漏洞的示例代码。 您可以使用以下命令来构建、运行和测试您的应用程序: . `make build` 构建应用程序的容器镜像。 . `make run` 运行容器。 . `make test` 运行可用性测试。 . `make securitytest` 运行安全测试。由于示例应用程序包含漏洞,安全测试将会失败。这是预期的结果。 . `make debug` 提供一个来自容器的 shell,并将主机的 `src` 目录映射到容器中。 在以下示例中,我们重构了现有应用程序,转而引入了一个 XSS 漏洞: ## [source, java] ``` @RequestMapping(value = "/sayHello", method = RequestMethod.GET) public static ResponseEntity sayHello(@RequestParam(name="name",required=false) String name) throws Exception { if(name == null || name.equals("")){ return new ResponseEntity<>("Tell me who to say hello? e.g. /sayHello/?name=alice", HttpStatus.OK); } return new ResponseEntity<>("

Hello, "+username+"

" , HttpStatus.OK); } ``` == 第 3 步:添加可用性测试 📋 为了确保您的应用程序按预期工作,并且玩家的安全补丁不会破坏核心功能,您需要定义可用性测试。 这些测试是应用程序功能的规范。您可以将默认测试作为参考,并根据应用程序的功能实现您自己的测试。 **这些测试默认必须始终通过**,因为测试失败意味着应用程序已被破坏。 以下是针对 XSS 示例应用程序的可用性测试示例: ## [source, java] ``` @Test public void test_should_say_hello() throws Exception { this.mockMvc.perform(get("/sayHello").param("name", "John")) .andExpect(status().isOk()).andExpect(content().string(containsString("Hello, John"))); } @Test public void test_when_request_status_should_return_200() throws Exception{ this.mockMvc.perform(get("/status")).andExpect(status().isOk()); } ``` == 第 4 步:添加安全测试 🛡 准备好挑战应用程序后,我们现在需要模拟对相关漏洞的利用。 我们通过安全测试来实现这一点,在测试中我们编写脚本来测试漏洞。 **这些测试默认必须失败**,因为这是需要玩家解决的任务。也就是说,必须修补安全漏洞才能使测试通过。 以下是针对 XSS 示例应用程序的安全测试示例: ## [source, java] ``` @Test public void test_sayHello_shouldEscapeHtmlResponse() throws Exception { this.mockMvc.perform(get("/sayHello").param("name", "")) .andExpect(status().isOk()).andExpect(content().string(containsString("<script>alert(1)</script>"))); } ``` 完成此实现后,您就可以看到安全测试和应用程序的运行情况了。 . 测试标题应包含测试的内容和预期结果:`test_whenAmountisIntMax_shouldThrowRangeErrorException` . `make build && make securitytest` 运行安全测试。它们应该会失败。 image::res/securitytestfail.gif[Running the security tests for the application] == 第 5 步:创建补丁 🩹 为了确保挑战是可以解决的,我们需要为漏洞创建一个补丁。 首先为补丁创建一个单独的分支: . `git checkout -b patch` 创建一个补丁分支 . 修补程序 . `make build && make test && make securitytests` 运行所有测试。它们应该会通过。 NOTE: 这个打了补丁的分支不会提供给玩家, 它仅用于验证关卡是否可解。 针对安全漏洞的补丁不得使用任何新的依赖项,这意味着修复应仅使用现有的依赖项。 == 第 6 步:验证 🔎 * [ ] `./build.sh` > `verify`:验证一切是否正常 * [ ] 更新 `level/Readme.adoc`(不是此文件!)添加关卡故事/事件、级别以及任何前置条件。 * [ ] 删除不必要的文件和目录 == 第 7 步:推送 git push `main` 和 `patch` 两个分支。 ## [source,bash] ## git push git push -u origin patch 将 `pi3ch` 添加为您仓库的贡献者/协作者之一。 SecDim 团队成员将审核您的关卡 并带领您完成后续步骤。 *大功告成!* 🎉 == 重要说明 . 记住要推送 `main` 和 `patch` 两个分支。 . *可用性测试* 在 `main` 和 `patch` 分支中必须始终通过。 . *安全测试* 在 `patch` 分支中必须通过,但在 `main` 分支中必须失败。 == 故障排除 请在 https://discuss.secdim.com[SecDim Discuss] 上提问 = 奖励 🎁 我们为成功提交者提供多项奖励。 详情请参阅我们的 https://secdim.com/reward/[奖励页面]。 祝您修补顺利! == 实用资源 * link:https://play.secdim.com/browse[实验室] 🧪:探索并试验现有漏洞 * link:https://play.secdim.com[演练场] 🎮:修复安全漏洞并获得评分 * link:https://learn.secdim.com[学习] 📖:了解安全漏洞及其修复方法 * link:https://discuss.secdim.com[讨论区] 💬:与志同道合的 AppSec 开发者进行协作讨论的社区论坛 * https://cwe.mitre.org/top25/archive/2023/2023_top25_list.html[CWE Top 25]:漏洞与示例代码 * https://github.com/semgrep/semgrep-rules[SemGrep rules]:不安全的示例代码与漏洞 image::https://secdim.com/assets/images/logo.svg[SecDim Play Logo, 200, 200]
标签:DevSecOps, JS文件枚举, 上游代理, 代码安全审计, 安全靶场, 应用安全(AppSec), 请求拦截, 软件开发工具包(SDK), 逆向工具