这个系统之前看过,最近想起,发现有更新。之前看的粗,这次又认真看了一下,有些问题,先讲讲一个前台不用登录的任意代码执行,比较可惜的是在高版本执行不了。
程序的唯一入口是index.php
,根据p
参数来调度各个模块下的文件,
跟进inc\funciton\global.php
接着是加载配置文件
程序往下走,对GET、POST 数据全局变量注册,并且没有加addslashes。
注意,这里的顺序,是先加载配置文件,然后才注册变量,那么这里是可以覆盖配置变量的。
前面说到当p=n-xxx
的时候,会进入到inc\funciton\global_news.php
,而在这里有一个eval()
的代码块。
如果$tttemp
变量可控,那么我们就可以执行任意代码。
首先看一下整体逻辑
我们在eval
后面输出一下$tttemp
。
抓包看一下,不带任何参数,看程序是否会运行到else
里面。
输出$sort['aNiQV']['son']
,那么就不需要管其他太多的代码了。
往上回溯
$ttemp
初始为$sort
,拼接$rs['code']
,最后大概是这样子的$sort['xxx']['son']
。
前面说到数据是没有加addslashes的,那么就可以引入单引号逃逸出来,比如构造$rs['code']
的值为
'];phpinfo();exit();//
那么最终执行的就是$thisarr =$sort['xxx'];phpinfo();exit();//['son'];
跟踪$rs
,其来于$navarr
数组,$navarr
由get_parents()
函数返回
而get_parents
函数传进了两个参数$pageid
,$ym_idsort
。
先看参数$pageid
全局找一下$ym_allsort
,发现是配置文件/config/shop_config.php
里面的变量
前面说到这个加载顺序的问题,是可以覆盖变量的。输出看一下,成功覆盖。
这里还有一个$p
,看到前面的代码:
意思是请求不为news/
下的路径时,$p
的值为n-xxx
中的xxx
那么我们就可以控制ym_allsort
的值,间接控制$pageid
接着看$ym_idsort
,同样也是配置文件的变量,因为加载顺序的问题,一样可以被控制。
接着分析get_parents()
函数的代码
那么我们只要控制$pageid
与我们传入的$ym_idsort
的一维键值一致,就能让函数正常返回到$navarr
,而最后拼接的是$rs['code']
,那我们的$ym_idsort
应该是形如$ym_idsort[$id][code]
这样的,其中$id
的值等于$ym_allsort[$p][id]
的值,而$p
等于n-xxx
的xxx
。
最终请求payload为:(带html的原因是.htaccess,这里就不再讲了)
至此,漏洞分析结束。
此漏洞是由于配置文件加载,在全局变量注册之前,导致可以被覆盖配置变量,又因为没有加addslashes,导致我们可以引入单引号等进行逃逸,最终造成任意代码执行。
系统的高版本对此漏洞进行了修复,调整了两者的顺序,并加上了addslashes,使得变量不能覆盖,更加引入不了单引号等字符进行逃逸。