打开链接,在网页源码里找到提示
要求以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过滤掉了







![[ValueError: not enough values to unpack (expected 3, got 2)]](https://img-blog.csdnimg.cn/edd0002b40e2424b920816c0fbce5dd0.png)







![练[GYCTF2020]EasyThinking](https://img-blog.csdnimg.cn/img_convert/4f92eff3de45a3a5f254d1f13fe99f7b.png)




