一、payload如下:
第一处getshell :
http://localhost/dede/sys_verifies.php?action=getfiles&refiles[]=\";phpinfo();//
第二处getshell :
http://localhost/dede/stepselect_main.php?action=addenum_save&ename=233&issign=1&egroup=;phpinfo();$
二、效果图:
第一处getshell :
第二处getshell :
三、具体分析:
第一处getshell :
漏洞发生在 /dede/sys_verifies.php 文件中,当 $action 为 getfiles 时,程序会将数组 $refiles 的所有内容,写到 /dede/modifytmp.inc 文件中。
在该 else if 语句的尾巴处包含了/dede/templets/sys_verifies_getfiles.htm 文件(这里要注意一下 $doneStr 的内容)
可以看到程序又请求了 /dede/sys_verifies.php 文件,且 $action 为 down 。跟进 down
会发现程序直接将 /data/modifytmp 文件包含进来,导致我们刚刚注入的代码被执行了。(我们注入的是refiles[]=\";phpinfo();
)
第二处getshell :
这一处漏洞入口在 stepselect_main.php 文件中。我们进入到 $action=’addenum_save’ 添加枚举类的处理语句中,$ename 和 $egroup 都是我们可以控制的,而且程序在运行时,会先判断 dede_sys_enum 表中是否存在 egroup= $egroup 的记录,如果不存在,则用 INSERT 语句将我们传入的$ename 和 $egroup 插入数据库,然后执行 WriteEnumsCache 函数。
WriteEnumsCache 函数存在于 enums.func.php 文件中,它的作用是更新所有枚举缓存。我们跟进该函数,发现该函数会将所有的 egroup=$egroup 记录写入 /data/enums/$egroup.php 文件中,这也最终导致了getshell。