0x00背景

写这个文章的原因是太无聊了,然后乱翻大佬的文章看到了一个我不了解的概念,然后自己去试了试发现真的可以,于是记录下来,文末附上大佬博客地址。

0x01正文

有这样一个假想,如果说我在一个服务器不认识的后缀里面写上html的代码,它会去自动识别吗?

我就不像。大佬那么严谨了。我就三个浏览器:

1618044072273

而我的文件内容是这样的:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
    <h2>HelloWorld</h2>
</body>
</html>

毫无疑问上面那个假想解开了。会自动识别内容并解析。

那么这个有什么用?不能上传Html的地方来个存储XSS?

0x02内容嗅探机制

我猜想的是浏览器不认识的文件类型才会这样,比如常见的txt、doc、png、jpg、xlsx等等是不会有这个现象的。

然后就是复制大佬的话:

1.浏览器会检查文件的静态特征然后与已知的文件格式进行对比,推测文件类型。

2.不符合格式特征的文档,如HTML文件,会扫描文件的内容,查找特定的子字符串(如寻找熟悉的标签等等);

3.有些浏览器还会考虑URL里路径部分的文件后缀。

0x03浏览器之间的解析差异

刚刚写的那个最基础的实例确实没差异,可能需要用具体的html的标签才能判断出来。

接下来是复制粘贴:

以HTML文件来说,在进入浏览器的内容检测机制后,

Chrome和Firefox会自动检测在文件起始位置有没有发现某几个预定义的HTML标签;

Firefox只要碰到URL里面有.html这样的文件扩展名,就会急切的把文档判断为HTML类型,即使没有发现可以识别的标签代码。

IE浏览器,默认的就会把文档归为HTML格式处理。

Opera浏览器,会扫描数据里面的前1000个字节,看是否有能识别的HTML标签。

然后就是比较关键的内容了:

0x04如何利用?

其实利用无非就是个XSS,具体是怎么样让浏览器强制进入内容嗅探。

1.格式错误的MIME Type

2.特殊的Content-Type

3.无法识别的Content-Type

4.完全陌生的文件扩展名

5.其他非http内容

其实这么多种方法,说白了还是让浏览器不认识这个文件他就只能解析内容然后触发html代码。

0x05如何防御?

其实在之间的测试中就遇到了几个特殊的响应头:

  • Content-Type

    通过Web方式访问的时候,Content-Type是文件类型最权威的描述,此时文件扩展名在大多数情况下都会被忽略。这个是什么意思呢。就是说例如上传文件中定义了Content-type的内容那么再传其他的文件也不可能被解析了。

  • X-Content-Type-Options

    X-Content-Type-Options: nosniff

    这个直接就禁用浏览器的内容嗅探机制。

  • Content-Disposition

    将数据体设定为附件

    Content-Disposition: attachment[;filename="文件名"]

    这个时候大部分的浏览器碰到这个响应头呃时候,不会直接解析或显示其返回的数据,而是显示文件下载对话框。 按我理解的就是因为直接下载了所以压根不解析。进场见到不解析的服务器都是这样做的。直接让你下载。这个可能也是绝大多数的基本防御手段了。

大佬博客:楼兰大佬