0x00 前言

vulhub是一个集成好漏洞环境的开源项目

接下来,将跟着环境进行复现调试。

0x01 thinkphp/2-rce/

index.php?s=/index/index/name/${@phpinfo()}

顺便研究下框架

  1. 先是去加载thinkphp,thinkphp会记录一些加载时间和变量环境定义,如tp2要求php大于5,然后去加载runtime

  2. PHPSTORM格式化代码快捷键:

    windows平台:Ctrl+Alt+L

  3. runtime,然后定义一些变量,加载一些方法。

  4. ThinkPHP的util里放了一些类方法,里面有一些处理session等的类

  5. 可以看到经过一波瞎jb调试后我来到了漏洞点,他是在处理路由的时候发生的,经过C方法一大堆配置后,调用dispatch方法,

又检查了一大堆路由的配置,然后默认规则调度URL,在

$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
正则是@(\w+)/([^/\/]+)@e

匹配路由的paths也就是name/${@phpinfo()}

有点奇怪,一般用的是/作为分隔符但这里由于表达式里有/所以用@分割而且式子中匹配${@phpinfo()}的是[^//]也就是只要不是/就可以了,那为何写俩?

然后就会执行命令

可以看出,tp的方法是先用thinkphp去初始化模块,再用runtime去调用一些类方法如app类,先init配置路由等信息,再exec调用对应的model和action

if (!preg_match('/^[A-Za-z_0-9]+$/', MODULE_NAME)) {
    throw_exception(L('_MODULE_NOT_EXIST_'));
}
先是匹配module name,必须要是英文和数字

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

反序列 Previous
solidity Next