公共missions 和指南

安全编码实用化

探索安全编码指南,了解并减少软件漏洞(如 OWASP Top 10),并深入到指导培训Missions ,在真实世界的应用程序模拟中进行实践。

浏览全部missions

查看更多
提高生产力
SQL 注入
我们收到一位用户的报告,称他们利用了网上银行解决方案交易搜索功能中的 SQL 注入漏洞。他们指出,他们可以查看属于其他用户的交易,并指出这个漏洞可以让攻击者对数据库进行各种令人讨厌的操作,如删除表、查看其他表中的数据、插入数据等。请尝试复制该用户在此次任务中的操作。
提高生产力
Spring MvcRequestMatchers
2023 年 3 月,Spring 发布了针对内部发现的漏洞(称为 CVE-2023-20860)的修复程序,在该漏洞中,mvcRequestMatchers 中使用双通配符 ** 可能会导致 Spring Security 和 Spring MVC 之间出现模式错配。这最终可能导致用户未经授权访问某些端点。我们设置了一个非常简单的银行应用程序,其中只有几个端点。请按照说明尝试重现此访问控制漏洞的影响。
提高生产力
木马病毒源 - 使用来自不可信来源的组件
我们维京银行的一名开发人员天真地从互联网上一个可能包含易受攻击组件的不可靠来源复制了一些代码,以帮助编写管理信用卡的管理员授权检查。我们注意到用户一直在更改他们的信用卡限额,尽管只有管理员才有此权限。我们认为这段代码有问题。尝试执行任务,调查代码。
提高生产力
通灵签名 - 使用已知易受攻击的组件
CVE-2022-21449 有一个最酷的漏洞别名--Java 中的通灵签名。这个名字是怎么来的?它参考了《神秘博士》中的通灵纸。当给别人看时,这些空白纸片上会填上他们期望看到的内容。类似的情况也发生在 ECDSA 算法的 Java(15 至 18 版)实现中,这对 JWT 的签名验证产生了影响。我们可以提交一个无效的签名,但 Java 会认为它是有效的。想看看它是如何工作的吗?让我们开始吧。
提高生产力
Apache 路径遍历 - 使用已知易受攻击的组件
2021 年 10 月 4 日,Apache 团队发布了 Apache 2.4.49 版本,以解决 Apache 2.4.48 中的路径遍历和远程代码执行漏洞(也称为 CVE-2021-41773)。2021 年 10 月 7 日,由于 2.4.50 热修复程序中的修复尚未完成,他们发布了 2.4.51 版本。该漏洞被追踪为 CVE-2021-42013。请尝试执行此任务,亲自了解如何利用此漏洞。
提高生产力
Codestashbin - 不安全的密码重置功能
CodeStashBin 是世界上最大的代码版本控制托管公司之一。有传言称,忘记密码程序存在不安全的密码重置功能漏洞。有可能更改特权用户的密码并访问其账户。跳转到此任务中调查问题。
提高生产力
Log4j - 使用已知易受攻击的组件
2021 年 12 月初,非常流行的日志库 Log4j 宣布了一个 0-day 漏洞(CVE-2021-44228),这在 Java 社区投下了一颗重磅炸弹。该漏洞被称为 Log4Shell,影响 Log4j v2 2.0-beta9 至 2.14.1 版本,可导致远程代码执行。我们已经建立了一个模拟该漏洞的环境,因此您可以亲眼目睹其影响。现在就试试吧。
提高生产力
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
#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 请求时,就会出现服务器端请求伪造漏洞。如果应用程序可以访问专用/内部网络,攻击者还可以让应用程序向内部服务器发出请求。在本指南中,我们将通过一些示例对此进行深入探讨,以便更好地理解其实际效果。

查看指南

安全配置错误

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

Metrics (Prometheus)
Logs
Environment information
Path/Url Mappings

安全配置错误在某种程度上是一个总括术语,涵盖了因应用程序的配置设置而非不良代码而产生的常见漏洞。这是一个涉及面很广的话题,在很大程度上取决于技术堆栈等因素。很多时候,解决这些问题看似简单,比如更改一个配置文件甚至一行代码,但这些漏洞可能会造成严重的影响和后果。阅读我们的指南,了解有关该漏洞的更多信息以及如何缓解该漏洞。

查看指南

密码存储

功能 加密哈希值 密码哈希值 速度 非常快 故意慢 工作系数可调整 否 是

如果您的应用程序需要对用户进行身份验证,那么很可能也需要处理密码。处理用户密码是一件大事,而正确处理用户密码更是一件大事。很难想象还有什么比应用程序遭到攻击、用户密码在互联网上泄露给所有人更糟糕的情况了。如何根据最佳实践安全地存储密码?让我们来看看几种方法。

查看指南

安全配置错误 - XXE 详细

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

XML eXternal Entities"(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 参数自动绑定到模型上,然后不经任何验证即可使用,那么就会出现此漏洞。使用从请求到对象的自动绑定有时非常有用,但如果模型具有用户无法访问的属性,也会导致安全问题。请阅读指南了解更多详情。

查看指南

注入 - 路径遍历


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

return file.read(path);

路径遍历是另一种相当常见的注入漏洞。当构建 URI(无论是 URL、文件路径还是其他)时,如果不能正确确保完全解析的路径不会指向目标路径的根目录之外,就会出现这种情况。路径遍历漏洞的影响在很大程度上取决于发生遍历的上下文以及已完成的整体加固。阅读指南,了解更多信息。

查看指南

注入 - 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/JavaScript 注入)
路径遍历(路径/Url 注入)
命令注入
代码注入

最著名的漏洞类别之一往往是注入漏洞,尤其是毫无争议的后起之秀--SQL 注入漏洞: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);

让我们来看看命令注入本身。我们主要将重点放在几个不同的示例上,这样可以更容易地看到它在实际操作中的样子。因此,作为快速复习,当用户输入使用了操作系统命令的一部分时,就会出现命令注入漏洞。阅读指南了解更多信息。

查看指南