公开任务与指南

让安全编码变得实用

探索安全编码指南,了解并缓解 OWASP Top 10 等软件漏洞,并通过引导式训练任务在真实的应用程序模拟中进行实践。

预约演示

浏览所有任务

查看更多
可扩展且引人入胜

SQL 注入

我们收到用户报告称,他们利用了网上银行解决方案中交易搜索功能的 SQL 注入漏洞。据其所述,他们能够查看属于其他用户的交易,并指出该漏洞可能允许攻击者对数据库进行各种恶意操作,例如删除表、查看其他表中的数据、插入数据等。请尝试在本任务中复现该用户的操作。

立即尝试
可扩展且引人入胜

Spring MvcRequestMatchers

2023 年 3 月,Spring 发布了针对内部发现的漏洞 CVE-2023-20860 的修复程序。该漏洞中,在 mvcRequestMatchers 使用双通配符 ** 可能导致 Spring Security 和 Spring MVC 之间的模式匹配不一致,最终可能导致用户获得某些端点的未经授权访问权限。我们搭建了一个包含少量端点的简化版银行应用程序。请按照说明操作,尝试复现此访问控制漏洞的影响。

立即尝试
可扩展且引人入胜

心灵感应签名 - 使用已知易受攻击的组件

CVE-2022-21449 是漏洞界最酷的别名,即 Java 中的“心灵感应签名”。这个名字是怎么来的呢?它源自《神秘博士》中的“心灵感应纸”。当人们看到这些空白纸张时,上面会自动浮现出他们期望看到的内容。Java(15 至 18 版本)在实现 ECDSA 算法时也出现了类似的情况,这会影响 JWT 的签名验证。我们可以提交一个无效签名,但 Java 却会将其判定为有效。想了解其原理吗?让我们开始吧。

立即尝试
可扩展且引人入胜

Apache 路径遍历 - 使用已知易受攻击的组件

2021 年 10 月 4 日,Apache 团队发布了 2.4.49 版本,以修复 Apache 2.4.48 中存在的路径遍历和远程代码执行漏洞(即 CVE-2021-41773)。由于 2.4.50 热修复补丁不完整,他们于 2021 年 10 月 7 日又发布了 2.4.51 版本,该漏洞被追踪为 CVE-2021-42013。快来尝试这个任务,亲身体验该漏洞是如何被利用的。

立即尝试
可扩展且引人入胜

Log4j - 使用已知易受攻击的组件

2021 年 12 月初,广受欢迎的日志库 Log4j 曝出一个 0-day 漏洞(CVE-2021-44228),在 Java 社区引发了巨大震动。该漏洞被称为 Log4Shell,影响 Log4j v2 2.0-beta9 至 2.14.1 版本,可能导致远程代码执行。我们搭建了一个模拟该漏洞的环境,让您可以直观地了解其影响。立即尝试。

立即尝试
可扩展且引人入胜

特洛伊木马源 - 使用来自不可信来源的组件

Viking Bank 的一名开发人员在编写用于管理信用卡的管理员授权检查代码时,天真地从互联网上的不可信来源复制了一些代码,其中可能包含易受攻击的组件。我们发现,尽管只有管理员才有此权限,但普通用户却能够更改其信用卡额度。我们认为那段代码有问题。请尝试完成此任务以调查该代码。

立即尝试
可扩展且引人入胜

Codestashbin - 不安全的密码重置功能

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 语句,从而攻击应用程序并窃取重要信息。这是一种常见的 Web 安全漏洞,也是黑客操纵数据库并从中提取关键信息最常用的手段。

查看指南

安全配置错误

许多框架还提供了一组可启用的端点,用于监控应用程序,无论是在生产环境还是测试/开发环境中。这些端点包括:

指标 (Prometheus)
日志
环境信息
路径/URL 映射

安全配置错误是一个涵盖范围较广的术语,指的并非代码缺陷,而是由应用程序配置设置不当所引发的常见漏洞。这是一个涉及面很广的主题,且在很大程度上取决于您的技术栈等因素。解决这些问题看似简单,往往只需修改配置文件或单行代码,但这些漏洞可能带来的影响和后果却十分严重。阅读我们的指南,深入了解该漏洞及其缓解措施。

查看指南

服务端请求伪造

ts
let url = request.params.url;

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

return render.export();

当用户能够诱导应用程序向攻击者指定的域名发起 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>  

批量赋值是一种漏洞,表现为 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 文档可能会导致文件及其他敏感信息泄露给潜在攻击者。阅读完整指南以了解更多信息。

查看指南

注入 - 路径遍历

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

return file.read(path);

路径遍历是另一种相当常见的注入漏洞。当 URI(无论是 URL、文件路径还是其他路径)的构建未能确保最终解析的路径不指向预期根目录之外时,往往会发生此类漏洞。路径遍历漏洞的影响在很大程度上取决于遍历发生的环境以及已实施的整体加固措施。阅读本指南以了解更多信息。

查看指南

身份验证与授权

cs

// 确保默认行为是验证请求,并检查其是否为管理员
[Authenticate]
[Authorize("Admin")]
public class SecureController : Controller
{

}

public class MyController : SecureController
{

    // 覆盖继承的 Authorize 属性,允许任何用户访问该页面

查看指南

注入 - XSS

```html
<!--- 不安全:htmlSnippet 将在没有任何转义的情况下被解析 --->
@Html.Raw(htmlSnippet)
```

跨站脚本攻击(简称 XSS)是另一种注入漏洞,会导致攻击者控制的脚本在其他用户的浏览器中执行。XSS 也可被视为一种 HTML/JavaScript 注入漏洞。让我们来看看您可能会遇到的 XSS 类型。

查看指南

注射基础知识

一些最常见的注入类型包括:

SQL 注入
跨站脚本攻击 (HTML/Javascript 注入)
路径遍历 (路径/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;
}

应用程序在运行过程中,难免需要在某个环节允许用户上传文件(无论是为了使用还是仅用于存储)。虽然这看起来很简单,但由于文件上传的处理方式涉及潜在风险,其实现方式至关重要。请阅读本指南以了解更多信息。

查看指南

命令注入

let ip = request.params.ipAddress;

system("ping " + ip);

让我们单独探讨一下命令注入。我们将重点分析几个不同的示例,以便您更直观地了解其攻击表现。简单回顾一下,当用户输入被包含在操作系统命令中时,就会产生命令注入漏洞。阅读指南以获取更多信息。

查看指南