1.文件包含
首先我们开启题目
看到的是一大串代码
我们仔细看一下php代码,重点是
if (!strpos($_GET["file"], "flag")) {
include $_GET["file"];
这里有一个strpos(string,find,start)函数
意思在string字符串中找find的位置,start是查找的开始位置
那么这句代码的意思就是如果file中没有flag字符串就执行下面的include $_GET["file"]
否则就输出Hacker。
再看一眼shell
是将ctfhub传的参数用php执行
题目的目的也是让我们执行shell木马那么我们就输入
?file=shell.txt
shell中要传的参数为ctfhub=system("ls");
接着返回上一级目录,发现flag,接下来打开flag
找到Flag。
2.php://input
首先进入题目也是先看代码
代码中说如果file 名中六个字符是 “php://” 就执行后面的include函数
这里其实就应该想到的是php://伪协议
php://filter
和php://input
,php://filter
用于读取源码,php://input
用于执行php代码。
而执行php://input
伪协议条件是allow_url_include是On
那么我们就开始做题
直接构造file的值为php://input
post参数为<?php system("ls")?>
因为php://input是执行后面的PHP命令所以要写成php代码形式
可以显示出网站的文件
接着返回上一级文件
找到flag后,cat
找到flag
3.读取源代码
首先进入题目看代码
首先file的前六个字母要是php://
而且也没有木马文件可以用,但是它说flag在 /flag当中
那么我们就用到了php://filter
伪协议,它用来用于读取源码
php://filter 参数 | 描述 | |
---|---|---|
resource=<要过滤的数据流> | 必须项。它指定了你要筛选过滤的数据流。 | |
read=<读链的过滤器> | 可选项。可以设定一个或多个过滤器名称,以管道符(*\ | *)分隔。 |
write=<写链的过滤器> | 可选项。可以设定一个或多个过滤器名称,以管道符(\ | )分隔。 |
<; 两个链的过滤器> | 任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。 |
比如php://filter/resource=[文件名]
读取文件源码
而它说flag在 /flag当中那么我们直接?file=php://filter/resource=/flag
得到flag
4.远程包含
进入题目
就说了file当中不能有flag
PHPinfo当中也表明php://input可以用
那么就和php://input一样了直接找出flag