如何使用超长编码发布数据来测试漏洞?

时间:2012-10-25 14:33:18

标签: php encoding

我最近在没有经过适当验证的情况下了解到overlong encodings cause a security risk。从前面提到的帖子中的答案:

  

例如,字符<通常表示为字节0x3C,但是   也可以使用超长UTF-8序列0xC0 0xBC来表示   (甚至更冗余的3或4字节序列)。

  

如果您接受此输入并以基于Unicode的字节为基础处理它   工具,然后该工具中使用的任何字符处理步骤都可以   被回避。

这意味着如果我对使用超长编码的字符串使用htmlspecialchars,那么输出仍然可以包含标记。我还假设您可以发布类似的字符(如";),这些字符也可用于SQL注入。

也许是我,但我相信这是一种安全风险,相对来说很少有人考虑甚至了解。我已编码多年,现在才发现这一点。

无论如何,我的问题是:我可以使用哪些工具来发送超长编码数据?熟悉此风险的人:您如何在网站上执行测试?我想将一堆超长字符发布到我的网站,但我不知道如何做到这一点。

在我的情况下,我主要使用PHP和MySQL,但我真正想知道的是测试工具,所以我认为后端情况并不重要。

2 个答案:

答案 0 :(得分:4)

  

我想将一堆超长字符发布到我的网站,但我不知道该怎么做。

除了使用curl等手动请求工具对其进行测试外,浏览器内测试的简单解决方法是覆盖表单提交的编码。使用例如Firebug / Chrome调试器,更改您正在测试的表单以添加属性:

accept-charset="iso-8859-1"

现在,您可以键入当编码为Windows代码页1252(*)时,成为您想要的UTF-8超长字节序列的字符。

例如,在表单中输入café,您将获得字节序列c a f 0xC3 0xA9,以便应用程序认为您键入了café。输入À¼foo,将提交序列0xC0 0xBC f o o,可以将其解释为<foo。请注意,您不会在任何输出页面源中看到<foo,因为现代浏览器不会解析网页中的超长UTF-8序列,但您可能会收到�foo或其他指示右。

要更深入地访问医生输入并检查webapp的输出,请参阅像Burp这样的专用sec工具。

答案 1 :(得分:1)

要测试您的网站是否容易受到攻击,请使用curl使用post和utf8 long编码来填充页面并发布utf8长编码信息(您可以通过将文本编辑器编码设置为utf8来使用文本编辑器您使用curl和php文件发布的文本很长)

http://php.net/manual/en/function.curl-setopt.php