我有一个bash脚本,我是通过普罗梅尔(Procmail)开始的。 Procmail通过 主题 从电子邮件作为论点到bash脚本的字段。由于这些值以任何方式都没有设置,因此我试图弄清楚是否有任何可以利用的注射漏洞,如果这样,我可以采取什么措施来防止这些漏洞。这是一些示例代码来说明发生了什么:

#!/bin/bash
/usr/sbin/sendmail -t <<EOF
From: "myhost Administrator" <admin@myhost.example.com>
To: john_doe@gmail.com
Subject: An email subject

You've received a new email.
It has a subject of "$2"
It was sent from "$1".
EOF

Procmail将使用一个.procmailrc脚本来调用此BASH脚本:

:0
* ^From:\s*\/.*
{
 FROM = "$MATCH"
}

:0
* ^Subject:\s*\/.*
{
 SUBJECT = "$MATCH"
}

:0 c:
* ^To:.*@example.com
| /home/john_doe/examplescript.bash "$FROM" "$SUBJECT"

我想知道注射漏洞的两个领域是脚本的实例化:

/home/john_doe/examplescript.bash "$FROM" "$SUBJECT"

以及脚本中变量的用法。

/usr/sbin/sendmail -t <<EOF
From: "myhost Administrator" <admin@myhost.example.com>
To: john_doe@gmail.com
Subject: An email subject

You've received a new email.
It has a subject of "$2"
It was sent from "$1".
EOF

如果您好奇, 这是使我想到这个问题的实际用例

有帮助吗?

解决方案

为了避免注射问题,您还可以通过脚本将所有消息移交给您关心的地址的所有消息,该脚本读取STDIN的消息,并原生地解析了您感兴趣的标题。

然后,您可以使用您选择的脚本语言中可用的库来向本地运行的邮件服务器讲SMTP。

这样,就不会执行命令,也无需担心将不设置的输入用作程序的参数。

其他提示

我不是安全专家,但是在任何非销售用户输入中都存在注射漏洞 - 尤其是如果您将原始输入发送到可能具有特权访问权限的系统命令时。在执行此操作之前,请务必验证您的输入。

查看 $1$2 为了确保它们仅包含可打印的字符,并且在将其发送到您的邮件系统之前,将它们的长度(如1000个字符)(例如1000个字符)。

这并不是太难了,并且可以防止您从某些未知的利用中受到打击。

我喜欢Perl的一件事是 污点模式 除非您首先清理数据,否则这会阻止您做这样的事情。

外壳脚本本身是非常安全的。邮件中最脆弱的部分是标题,您不允许邮件发件人更改其中的任何内容。

我在脚本中看到的唯一方法是,有人可以在单行上传递点,这将过早结束邮件。并且可能有使用这样的uuencode嵌入附件的情况:

Subject: subject
From: sender@example.com
To: receiver@example.com

text line 1
text line 2

begin 644 file-containing-abc
$86)C"G]_
`
end

我担心 .procmailrc, ,因为我不知道引用规则。这可能是攻击者可以注入代码的地步,因此您需要查找手册中的规则并测试它们以确保。您应该测试的一些字符是 $, ", \, ,新线。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top