前言

这段时间比较少,自己也好久没搞php了,准备一边学java,一边捡一捡php

web569

直接看开发手册的url模式有说道:https://www.kancloud.cn/manual/thinkphp/1697

下面还说道

直接访问:/index.php/admin/login/ctfshowlogin就得到flag了

web570

题目打开给了原码直接下载
然后打开题目

说有闭包路由后门,去看开发手册

在源码里面common模块里面conf控制器里面看到

开发手册里面有关于common模块的说明

试着访问一下

/index.php/ctfshow/assert/phpinfo();

直接构造函数读目录文件

/index.php/ctfshow/system/ls

然后想读根目录的时候突然发现 / 好像不太好构造,他会被url解析为目录的结构,所以想到用post传参

构造

/index.php/ctfshow/assert/eval($_POST[a]);

解释两个地方,第一个参数为什么不能用eval,因为eval不是可变函数,他属于语言结构,所以不能这样构造,换句话说,call_usr_func会检测第一个参数是否是函数,也就是说会给传入的第一个参数后面加上()去检测,但是eval()只能作为整体出现,而第二个参数并没有函数检测。

第二个地方,我之前想传入 /index.php/ctfshow/assert/$_POST[a]; 但是很明显是不能的,这里和eval解析有点像,因为不管在php里面还是eval里面,都只能解析一次,也就是说如果这样传上去,只会把参数的名字解析为post[a],但并没有解析post的值,也就是post[a]只是一个字符串而已,不具有任何含义,所以还需要一个eval去解析他。这样传后eval把post的值解析出来,然后交给assert的是一个可以传参的值,不再是一个字符串了。

payload:

/index.php/ctfshow/assert/eval($_POST[a]);
a=system('ls /');
a=system('cat /f*');

web571

也给了源码

打开环境

说到控制器后门,在Home/Controller/IndexController.class.php里有个参数n可以传

下载完整源码然后跟进一下show函数

再跟进一下display,这里的$content就是我们传入的n

继续跟进fetch

有一个判断模板是否为php的,这个试一下就知道了,如果是的话直接构造就可以解析
payload:

/index.php/Home/Index/index?n=<?=system('cat /f*')?>

直接就得到flag了

web572

打开题目

有提示说爆破次数最多365次,容易想到日期,也就能想到日志文件了,而在thinkphp开启debug的情况下会在Runtime目录下生成log文件,文件的名称是以年_月_日.log来命名的,网上找一下默认日志文件路径,也就是 /Application/Runtime/Logs/home/21_01_01 然后直接爆破

这里注意控制器和各个参数的大小写

看到在index.php下有个传参<?php phpinfo();?> 盲猜可能有命令执行,cat一下

index.php?showctf=<?=system('cat /f*');?>

拿到flag

未完待续。