为什么我们不能在printf语句中传递程序的输入?

时间:2011-11-04 11:06:15

标签: c printf

可能存在哪些安全漏洞?或任何攻击?

2 个答案:

答案 0 :(得分:2)

printf函数的哪个参数?

printf("%s\n", untrusted_string);基本上没问题,但如果输出到终端,并且终端响应控制代码,那么它可能会使终端设置陷入困境,超出所有认可。

显然,当程序的输出将用作可执行代码时,它也会变得有趣。它可能并不总是很明显。例如,假设您编写了一个扫描Web服务器日志的程序,并生成一个列出所有访问过的URL的HTML报告。进一步假设我访问http://example/<script>...</script>。我收到一条错误消息,但仍然记录了该URL。如果您在未经修改的情况下打印输入,那么当您查看报告文件时,您可能会参加教育晚会。用户输入需要在沿线的某处进行消毒。

回复用户提供的数据,回复同一个用户,更安全一些。然而,再次在Web环境中,XSRF攻击是一种常见的技术 - 您可能认为您的用户自己编写输入,而实际上他们没有,所以实际上您正在回应一些攻击者的数据返回给用户。即使在命令行程序中也是如此 - 如果用户提供文件作为命令行参数,但是文件(如我上面的服务器日志)是由攻击者编写的,然后将该文件的一部分打印回用户可能会产生用户从未想过的后果。

其中没有一个必然是不这样做的理由。与安全性一样,您无法确定特定操作“是”还是“不安全”,因为它取决于该操作发生的上下文。

printf(untrusted_string);绝对没有用,因为提供的字符串可能是“%s”,具有未定义的行为。你可能会想到自己,“哦,好吧,只有读取它不应该在哪里,可能会造成什么危害?”在这种情况下,你最终会加入一长串人物,他们对这种机智感到惊讶,攻击者通过结合多个错误来创造可行的攻击。阅读你不应该明确可以导致DoS,但也结合其他问题可能泄漏敏感信息。

答案 1 :(得分:1)