c1oud
昂波利玻玻
March 7th, 2022
这段时间比较少,自己也好久没搞php了,准备一边学java,一边捡一捡php
直接看开发手册的url模式有说道:https://www.kancloud.cn/manual/thinkphp/1697
下面还说道
直接访问:/index.php/admin/login/ctfshowlogin就得到flag了
题目打开给了原码直接下载然后打开题目
说有闭包路由后门,去看开发手册
在源码里面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*');
也给了源码
打开环境
说到控制器后门,在Home/Controller/IndexController.class.php里有个参数n可以传
下载完整源码然后跟进一下show函数
再跟进一下display,这里的$content就是我们传入的n
继续跟进fetch
有一个判断模板是否为php的,这个试一下就知道了,如果是的话直接构造就可以解析payload:
/index.php/Home/Index/index?n=<?=system('cat /f*')?>
直接就得到flag了
打开题目
有提示说爆破次数最多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
未完待续。
前言
这段时间比较少,自己也好久没搞php了,准备一边学java,一边捡一捡php
web569
直接看开发手册的url模式有说道:https://www.kancloud.cn/manual/thinkphp/1697
下面还说道
直接访问:/index.php/admin/login/ctfshowlogin就得到flag了
web570
题目打开给了原码直接下载
然后打开题目
说有闭包路由后门,去看开发手册
在源码里面common模块里面conf控制器里面看到
开发手册里面有关于common模块的说明
试着访问一下
直接构造函数读目录文件
然后想读根目录的时候突然发现 / 好像不太好构造,他会被url解析为目录的结构,所以想到用post传参
构造
解释两个地方,第一个参数为什么不能用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:
web571
也给了源码
打开环境
说到控制器后门,在Home/Controller/IndexController.class.php里有个参数n可以传
下载完整源码然后跟进一下show函数
再跟进一下display,这里的$content就是我们传入的n
继续跟进fetch
有一个判断模板是否为php的,这个试一下就知道了,如果是的话直接构造就可以解析
payload:
直接就得到flag了
web572
打开题目
有提示说爆破次数最多365次,容易想到日期,也就能想到日志文件了,而在thinkphp开启debug的情况下会在Runtime目录下生成log文件,文件的名称是以年_月_日.log来命名的,网上找一下默认日志文件路径,也就是 /Application/Runtime/Logs/home/21_01_01 然后直接爆破
这里注意控制器和各个参数的大小写
看到在index.php下有个传参<?php phpinfo();?> 盲猜可能有命令执行,cat一下
拿到flag
未完待续。