CD's second night

AWS-SQS and Lambda SQL Injection

type
status
date
slug
summary
tags
category
icon
password
背景:
在无服务器架构中,将 AWS Lambda 与 SQS 结合使用来处理消息是很常见的,如果这些用户提供的数据用于数据库查询,则会出现危险的情况。这强调了安全编码实践的重要性,尤其是当输入源不受信任或可公开访问时。Lambda 函数中的暴力破解属性值也是一种现实生活中的威胁。
根据题目信息设置一下config后,安装aws-enumerator并枚举我们当前用户的权限
枚举一下存在的service aws-enumerator enum -services all
 
可以看到对lambda和sqs都有权限 直接dump他们 aws-enumerator dump -services lambda,sqs
查看lambda函数有个
有个huge-logistics-stock方法 但是没有权限访问
虽然没有权限访问源代码但是我们有执行权限
notion image
提示我们参数不全 尝试fuzz参数
首先下载 Burp Suite 参数名称 wordlist。
我们可以将一个快速的 bash 脚本放在一起,以尝试不同的参数名称并报告任何有效的参数名称。
运行脚本一分钟后,我们得到了一个结果!这次 Lambda 返回不同的错误,确认参数正确。
notion image
看到需要ID 查看sqs里面有没有想要的信息
trackingID和DESC、HLT8255关联
多执行几次
notion image
我们会看到不同的客户端,包括VELUS CORP.Google inc.Adidas
给定属性的结构,我们可以在下面创建自己的包含此属性的消息,并尝试将其发送到队列。在下面的消息中,我们指定了自己的 trackingID 值。--message-body
aws sqs send-message --queue-url https://eu-north-1.queue.amazonaws.com/254859366442/huge-analytics --message-attributes '{ "Weight": { "StringValue": "1337", "DataType":"Number"}, "Client": {"StringValue":"VELUS CORP.", "DataType": "String"}, "trackingID": {"StringValue":"HLT1337", "DataType":"String"}}' --message-body "Testing"
notion image
 
 
接下来我们就能invoke执行payload了 aws lambda invoke --function-name huge-logistics-stock --payload "{\"DESC\":\"HLT1337\"}" output
aws v2版本下的命令
aws lambda invoke --cli-binary-format raw-in-base64-out --function-name huge-logistics-stock --payload '{"DESC":"HLT1337"}' output.txt
 
使用不存在client会输出空数组
 
尝试一下 SQL注入 VELUS CORP.\”
执行这个命令后,消息将被发送到指定的 SQS 队列 huge-analytics,并且消息将包含指定的属性和主体内容。
表明存在 SQL 注入漏洞,因为添加双引号导致查询公司名称的 SQL 语句出错。"DB error"
简短总结一下流程:

系统机制:

  1. 用户/系统组件:通过 SQS 消息发送数据(负载)。
  1. SQS 队列:消息临时存储在 SQS 队列中,等待处理。
  1. Lambda 函数:按计划或由事件触发,从 SQS 队列中读取消息进行处理。
  1. 数据库交互:处理过程中,SQS 消息中的数据用于与数据库的交互,可能作为 SQL 查询的一部分。

攻击思路:

  • 二阶 SQL 注入:攻击者可以发送恶意构建的 SQS 有效负载,旨在创建二阶 SQL 注入。这种注入不会立即显现结果,因为攻击者的输入首先存储在系统(如队列或数据库)中,后来仅用于易受攻击的 SQL 查询。
 
下面的脚本将包含用户输入的特制消息发送到 SQS 队列,然后调用 Lambda 函数来处理该消息。如果 Lambda 响应包含文本 “Invalid” ,则该过程将重复,否则脚本将显示输出。
首先,我们需要确定表中的列数。我们尝试了一个语句,但结果导致了数据库错误。接下来,我们可以尝试使用 UNION SELECT 语句。在使用 UNION SELECT 语句时,确定原始查询中的列数至关重要,因为 UNION 运算符用于组合两个 SELECT 语句的结果,这些语句的结果集必须具有相同数量的列。
SQL 负载成功了!让我们解包这些发现:
  • "UNION SELECT null, null, null, @@version;-- -"

发现:

  1. 表中有四列
  1. @@version 是特定于 MySQL 和 MariaDB 的,用于检索数据库服务器的版本。
  1. 服务器版本是 8.0.33(截至 2023 年 6 月 16 日,Amazon Relational Database Service (Amazon RDS) for MySQL 现在支持 MySQL 次要版本 5.7.42 和 8.0.33)。
  1. 最后一列是可注入的,并且在属性中显示输出(实际上所有四列都是可注入的,并且输出到相应的属性)。
我们选择第四列来注入我们的负载,并修改脚本以过滤此属性以显示干净的 SQL 输出。
 
获取表名
一个 TrackingData 一个 customerData
查看数据 flag 就是 VELUS CORP 地址的 字段了cardUsed
 
Loading...