我正在撰写一篇关于HTML中的XML注入攻击的报告。因此,我将HTML(内容)作为HTML的内容。因此,我试图将我的HTML内容包装在CDATA块中,但它似乎确实正确呈现。
我有(validated by W3C)文件:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>report</title>
</head>
<body>
<div><![CDATA[AuthType=<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>">]]></div>
</body>
</html>
根据我对Wikipedia article的理解,这意味着内容应该“标记为解析器只能解释为字符数据,而不是标记”。所以输出应该是
AuthType=<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>">
但是,在Chrome 21.0.1180.60 m
和Firefox 14.0.1
中,所有呈现的内容都是
]]>
发生了什么事?不应该是<![CDATA[
到第一个]]>
的所有内容都出现在屏幕上,好像每个角色都已被转义一样?
答案 0 :(得分:4)
CDATA部分仅在XML解析模式下被浏览器识别。在传统的HTML模式中,正如您所见,会发生奇怪的事情。
因此,您需要配置服务器以使用XHTML Content-Type发送文档。这反过来会阻止旧版本的IE(直到IE 8)完全不渲染文档。
将HTML标记显示为HTML文档内容的实用方法是:
a)将每个<
显示为<
,将每个&
显示为&
。适用于XHTML中的旧版HTML和。
b)将数据包装在xmp
元素中。在遗留HTML中工作(仅限 - 因此没有XML Content-Type,但只是声明XHTML doctype无关紧要,无论如何都会被忽略)。例如:
<xmp><![CDATA[AuthType=<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>">]]></xmp>
xmp
标记还暗示了等宽字体和pre
- 就像渲染空白一样。但是这些可以用CSS覆盖。 xmp
元素很久以前就从HTML规范中删除了,但浏览器很好地支持了它。