缘起
此为 WordPress 搜索跨站脚本攻击(XSS)漏洞修复方法(感谢 360,让我发现此漏洞)的后续。
前些日子,收到 360 的提醒,说我的网站竟然高危,仅仅获得 2 分,速度打开,一看,满屏幕的跨站脚本攻击漏洞(WEB2.0),细细查看,愣了我半天。主要是说我的网站的 s 参数(搜索参数)和 replytocom 参数(回复参数)存在漏洞。可是,我不知道 360 得出的这个结果从何而来,我反复访问所谓的漏洞页面和正常页面进行检测,发现(也许是我眼花)毫无漏洞。而且那个搜索参数漏洞我之前才修复,并且进过检测确认没有已漏洞了,真不知道那个漏洞从何而来。
360 提示的漏洞截图:
为了防止有人看不清楚,我把文字也发上来:
漏洞上线时间:2011-07-02
漏洞名称:跨站脚本攻击漏洞(WEB2.0)
漏洞类型:跨站脚本攻击(XSS)
所属服务器类型:通用
漏洞风险:
- 存在 “非法读取用户信息” 风险
- 安全性降低40%
- 7个站长进行了讨论
检测时间:2014-02-20 18:29:13
漏洞证据:
<script>
漏洞地址:https://www.nikbobo.net/about/
解决方案:
方案一:站在安全的角度看,必须过滤用户输入的危险数据,默认用户所有的输入数据都是不安全的,请根据自身网站程序做代码修改。
方案二:使用开源的漏洞修复插件。( 需要站长懂得编程并且能够修改服务器代码 )
漏洞上线时间:2011-07-02
漏洞名称:跨站脚本攻击漏洞(WEB2.0)
漏洞类型:跨站脚本攻击(XSS)
所属服务器类型:通用
漏洞风险
存在 “非法读取用户信息” 风险
安全性降低40%
7个站长进行了讨论
检测时间:2014-02-20 18:37:28
漏洞证据:<script>
漏洞地址:https://www.nikbobo.net/
解决方案:
方案一:站在安全的角度看,必须过滤用户输入的危险数据,默认用户所有的输入数据都是不安全的,请根据自身网站程序做代码修改。
方案二:使用开源的漏洞修复插件。( 需要站长懂得编程并且能够修改服务器代码 )
纳闷
令人感到纳闷的是,我尝试过一些操作,比如对 replytocom 参数(回复参数)进行 intval()
过滤等等,可是依旧报漏洞,这次我真不知道 360 这个漏洞从何而来到底该如何修复。
被逼无奈之下,只好采取了一个下下之策,这回终于不报漏洞了。
分析
仔细观察 360 的漏洞地址,推断 360 的漏洞测试方法,发现主要集中在 alert()
、confirm()
这两个 JavaScript 函数上,那么,能不能针对这几个函数进行过滤,如果一有发现,直接拦截掉,这样就起到了修复(屏蔽)的作用了。
但是,要警惕的是,这个方法也许是掩耳盗铃之举,毕竟 360 测试都是用比较温和的函数,不会导致太多的风险,而真正的恶意攻击者可不会那么仁慈,他们所使用的,肯定是极为恶劣的函数和极为危险的动作。
解决
终上所述,再了解到恶意 URL 通常包含 eval()
base64
等等危险字符和函数,一份 XSS 漏洞修复(屏蔽)通用傻瓜方法就出来了,在你的主题的 Functions.php 添加以下内容:
<?php if (strpos($_SERVER['REQUEST_URI'], "eval(") || strpos($_SERVER['REQUEST_URI'], "base64") || strpos($_SERVER['REQUEST_URI'], "alert(") || strpos($_SERVER['REQUEST_URI'], "confirm(") ) { wp_die('您输入的内容包含危险字符,安全起见,已被本站拦截', '恶意请求防火墙', array('response' => '403')); } ?>
提示的文字可以自己修改,分别为提示内容、提示标题、返回 HTTP 状态码,我这里返回 403。
其实恶意 URL 还有一个特征,那就是长度 > 255,你也可以针对这个特征添加以下内容到 Functions.php,但是,这个拦截可能会和 WordPress 一些功能产生冲突,会导致这些功能不可用,目前已知会导致的冲突有后台常用的批量操作,清空操作等,你可以酌情考虑是否使用。
<?php if (strlen($_SERVER['REQUEST_URI']) > 255) { wp_die('您您请求的 URL 长度 > 255,安全起见,已被本站拦截', '恶意请求防火墙', array('response' => '414')); } ?>
哎,再次吐槽一下 360 网站安全检测,你能不能非要拦截了才能确认已经修复了这个漏洞?我觉得,漏洞修复的不应是对这个漏洞进行拦截,而是当你访问所谓的漏洞地址时,情况和正常地址一样,一切如常,这才是真正高明的漏洞修复。就像我有一次在朋友家,需要使用他的电脑,他给我用,然后就出去了,我用完后,百无聊赖的打开他那个杀毒软件,好像叫 ClamAV 吧,记得不是很清楚了,全盘杀毒,杀出了一堆病毒,这时正好他回来了,我跟他说你的电脑怎么一堆病毒,他笑了,默默地打开发现病毒的文件夹,找到那个病毒,双击,顿时,我一下子就跳了起来,你怎么能双击病毒呀!可是,结果出乎我的意料,病毒没有运行,而是弹出“选择程序运行”,那时,我才知道有 Linux 这个玩意儿(后来学习知道,他的电脑没有安装 Wine),这个不怕病毒的小众玩意儿。这才是真正高明的,电脑一堆病毒,可是病毒却跑不起来,只能留下尸体。咳~好吧,扯远了~