我最近在没有经过适当验证的情况下了解到overlong encodings cause a security risk。从前面提到的帖子中的答案:
例如,字符<通常表示为字节0x3C,但是 也可以使用超长UTF-8序列0xC0 0xBC来表示 (甚至更冗余的3或4字节序列)。
和
如果您接受此输入并以基于Unicode的字节为基础处理它 工具,然后该工具中使用的任何字符处理步骤都可以 被回避。
这意味着如果我对使用超长编码的字符串使用htmlspecialchars
,那么输出仍然可以包含标记。我还假设您可以发布类似的字符(如"
或;
),这些字符也可用于SQL注入。
也许是我,但我相信这是一种安全风险,相对来说很少有人考虑甚至了解。我已编码多年,现在才发现这一点。
无论如何,我的问题是:我可以使用哪些工具来发送超长编码数据?熟悉此风险的人:您如何在网站上执行测试?我想将一堆超长字符发布到我的网站,但我不知道如何做到这一点。
在我的情况下,我主要使用PHP和MySQL,但我真正想知道的是测试工具,所以我认为后端情况并不重要。
答案 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文件发布的文本很长)