因为公司的项目很多是用phpcms做的网站,在公司上班过程中遇到一个关于phpcms v9的问题。
开始经理让我检测这个网站,初次扫描整个网站,我并没有发现有什么高危漏洞,后来他给我看了一家网络安全检测公司的检测整改报告,才发现存在如下问题:
第一个就不多说了,这里主要讨论我遇到的第二个问题,也就是XSS的漏洞。
看到报告我才知道,原来xss的参数也可以是http的头部参数,这点我万万没想到(可能接触太少了)
这里先解释一下什么是Referer参数:HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
问题来了,当我们直接从地址栏打一个链接时是没有referer参数的,因为不是从一个地址链接过去,那么我们就可以抓包,对referer进行伪造(当然就算有这个参数也可以改包)。于是便出现了这个漏洞:Referer: '">alert(141)(这里我把它打全会被简书过滤掉)
于是我开始研究phpcms的框架结构,发现了base.php的入口文件,找到下面这句话:
显然没有经过任何过滤,直接把$_SERVER['HTTP_REFERER']取得的值给了头部HTTP_REFERER。
好,找到了根源,开始过滤吧,在base.php文件中的类函数里加了一个xss过滤函数,替换或删除掉敏感字符
然后再在前面载入这个函数:
这里$a就是经过处理后的头部信息啦,把它赋给HTTP_REFERER
再次抓包,改包,注入,不再出现反射XSS。
以下附一个常用过滤函数的网址: