WordPress插件 WP Statistics安装量超过50万,12.6.7之前版本中存在非授权的存储型XSS漏洞。该漏洞默认设置下是不受该漏洞影响的,只有特定配置下才受该漏洞的影响。
时间轴
2019/06/26 – 发现漏洞并联系开发者
2019/06/27 – 开发者回应,公开漏洞
2019/06/30 – 补丁开发完毕
2019/07/01 – 12.6.7版本发布,漏洞修复
通过IP操作的存储型XSS
该插件在特定配置下,网站可以用header来找到访问者的IP地址。
但是如果访问者使用防火墙时,网站看到的IP地址其实是防火墙的,而不是用户自己的。
为什么使用防火墙需要使用Header
默认情况下,网站可以很容易地获取访问者的IP地址。即执行请求的IP地址,如下图所示:
在没有防火墙的情况下访问网站的请求
当使用网站防火墙时,情况就会有一点点不一样。因为用户在访问网站前首先会经过防火墙,网站不能使用连接的地址来找出是谁执行了用户和防火墙之间的请求。
有防火墙的情况下访问网站的请求,会忽略原始IP地址
为了解决这个问题,防火墙就需要在加上一个含有原始用户IP的header。
防火墙转发用户IP到网站的访问请求
这样,网站就可以识别原始用户和自己的IP地址。
多级防火墙
如果攻击者发出转发IP,服务器就可能会混淆原始IP。当有多级防火墙时,就会出现这个问题,因为每一层都会有一个IP地址。
这完全依赖于防火墙的配置方法,以及处理现有转发值的方式。
发送转发IP的用户会使服务器迷惑
大多数防火墙会在定制的header中加入用户IP地址,比如字段X_SUCURI_CLIENTIP。
该header有用户的IP地址值,但这不应该出现在防火墙的环境中。如果已经存在了,就会被覆写。
在有多级代理的场景中,你可能需要获取客户端的IP地址,而不是最后一个连接的IP地址。这样的话,就可以使用含有多个IP地址的X-forwarded-for header。
如果header在到达防火墙之前已经有了一个值,就执行以下操作:
· 将用户IP加到现有IP之后;
· 不添加或替换现有值;
· 清除header,移除所有值;
· 用用户IP来覆写header。
会根据使用的防火墙以及配置产生以上不同的结果,并允许多级防火墙正确地发送用户信息到服务器。
漏洞
插件的漏洞就在于没有正确处理或验证用户的IP的场景。只有当插件使用header来识别访问者的IP地址时该漏洞才可能被利用。
插件设置页,使用X_Forwarded_For header来识别IP
如果要成功利用该漏洞,必须满足以下任一条件:
· 防火墙必须是可以绕过的。 也就是说网站必须被配置为可以接收来自任意用户的连接,而不仅仅是防火墙转发的连接。
· 防火墙如果存在header,比如:
不处理转发IP的防火墙请求
这两个设置的组件是攻击者完全控制的转发值。
使用WAF并不会受该漏洞的影响,除非可以被绕过或被配置为leave the IP as-is。
如果之前使用WAF,但没有更新插件的设置,可能就会存在漏洞。
因为根据防火墙和配置,header可以含有多个IP地址,所以插件首先要设置用户IP为完整的header值,然后如果有多个值就替换为最右侧的有效值。
在所有有漏洞的配置中,完整的IP变量都是攻击者控制的。这样就可以将恶意JS代码作为IP地址注入,管理页也就会存储并执行。
技术细节
该插件使用了class-wp-statistics.php文件上的get_IP方法。
IP变量的默认值是设置中提供的header,默认情况下为REMOTE_ADDR。如果有多个IP地址用,分开,插件就会使用最后一个有效的作为其IP。
因为IP地址的默认值是header值,而且没有经过FILTER_VALIDATE_IP方法进行正则或有效性处理,因此如果header中没有多个IP地址就会按原来的形式保存。
当访问者IP使用时就会成为页面输出结果的一部分,这也是插件概览页的一部分。
结论
特定类型的信息可能是安全的,比如访问者的IP地址,但现实和想象的往往不一样。由于开发者的特定假设,访问者有可能注入恶意代码到管理页面中,导致网站被攻击者(访问者)接管。
本文翻译自:https://blog.sucuri.net/2019/07/wordpress-plugin-wp-statistics-unauthenticated-stored-xss-under-certain-configurations.html如若转载,请注明原文地址: https://www.4hou.com/info/news/19234.html