$_SERVER[SCRIPT_NAME]变量可值注入恶意代码 – 作者:飞檐哈哈哈

$_SERVER[‘SCRIPT_NAME’]变量在路由传参时,可引入恶意代码,从而导致xss以及恶意代码注入。

PS:本文仅做技术讨论与分享,严禁用于任何非法用途。

$_SERVER[‘SCRIPT_NAME’]变量是PHP中定义的变量,可用于自动获取当前文件在网站中的路径。就目前而言,人们对其是完全信赖的。没有对该变量获取的值进行过滤。

举个例子,我们创建一个test.php,源码如下:

1.png

我们访问这个文件,看看会输出什么。

2.png

可以看到输出了test文件在当前网站中的路径。

我们尝试拼接参数试试。

3.png

该变量仍然没有被污染。就这点来看,该变量的获取在一定程度上还是可靠的。

然而,该变量真的没有安全问题吗?我们再试试构造其他payload

4.png

是的!这返回了非预期的数据。这并不是我们希望看到的。

根据我的测试。我们只要在路由传参末尾加上“ /”,也就是空格+/,$_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,对其进行恶意代码注入。

5.png

根据以上payload,我们可在:

www\system\tmp\cache\zh-cn\page\mobile\product_browse

路径下找到我们注入恶意代码的缓存文件。

6.png

可以看到我们构造的PHP代码已经写入这一缓存文件中。

根据笔者本地测试,该漏洞至少影响: 

修复建议:

缓解措施:对$_SERVER[‘SCRIPT_NAME’]进行过滤

解决方案:重新实现$_SERVER[‘SCRIPT_NAME’]变量的获取

*本文作者:飞檐哈哈哈,转载请注明来自FreeBuf.COM

来源:freebuf.com 2018-04-03 16:00:20 by: 飞檐哈哈哈

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论