前言

这个系统之前看过,最近想起,发现有更新。之前看的粗,这次又认真看了一下,有些问题,先讲讲一个前台不用登录的任意代码执行,比较可惜的是在高版本执行不了。

系统简介

程序的唯一入口是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数组,$navarrget_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-xxxxxx

最终请求payload为:(带html的原因是.htaccess,这里就不再讲了)

http://127.0.0.1/n-xxx.html?ym_allsort[xxx][id]=1&ym_idsort[1][code]=121%27][%271%27];phpinfo();exit();//

至此,漏洞分析结束。

此漏洞是由于配置文件加载,在全局变量注册之前,导致可以被覆盖配置变量,又因为没有加addslashes,导致我们可以引入单引号等进行逃逸,最终造成任意代码执行。

漏洞修复

系统的高版本对此漏洞进行了修复,调整了两者的顺序,并加上了addslashes,使得变量不能覆盖,更加引入不了单引号等字符进行逃逸。

源链接

Hacking more

...