$_SERVER['SCRIPT_NAME']变量在路由传参时,可引入恶意代码,从而导致xss以及恶意代码注入。
PS:本文仅做技术讨论与分享,严禁用于任何非法用途。
$_SERVER['SCRIPT_NAME']变量是PHP中定义的变量,可用于自动获取当前文件在网站中的路径。就目前而言,人们对其是完全信赖的。没有对该变量获取的值进行过滤。
举个例子,我们创建一个test.php,源码如下:
我们访问这个文件,看看会输出什么。
可以看到输出了test文件在当前网站中的路径。
我们尝试拼接参数试试。
该变量仍然没有被污染。就这点来看,该变量的获取在一定程度上还是可靠的。
然而,该变量真的没有安全问题吗?我们再试试构造其他payload
是的!这返回了非预期的数据。这并不是我们希望看到的。
根据我的测试。我们只要在路由传参末尾加上“ /”,也就是空格+/,$_SERVER['SCRIPT_NAME']便会获取“ /”到域名之间的所有字符。该变量只会在路由传参中获取我们传入的payload,从而污染参数。若是动态的参数传递,如:test?id=123 这种的传参方式则不会带入其他数据。
基于此,我们可以对一些路由传参的开源cms构造恶意payload,从而实现任意代码写入,或者实现反射型xss。
反射型XSS,payload:
index.php/product/c7.html/%EF%BC%9F'%20onload=alert(123)%20//
如国内的蝉知cms,其6.6版本就是路由传参。我们就可以构造如下payload,对其进行恶意代码注入。
根据以上payload,我们可在:
www\system\tmp\cache\zh-cn\page\mobile\product_browse
路径下找到我们注入恶意代码的缓存文件。
可以看到我们构造的PHP代码已经写入这一缓存文件中。
根据笔者本地测试,该漏洞至少影响:
修复建议:
缓解措施:对$_SERVER['SCRIPT_NAME']进行过滤
解决方案:重新实现$_SERVER['SCRIPT_NAME']变量的获取
*本文作者:飞檐哈哈哈,转载请注明来自FreeBuf.COM