一.代码审计
flag就在flag.php中,get两个变量存在file1和file2中。
file_get_contents() 把整个文件读入一个字符串中。该函数是用于把文件的内容读入到一个字符串中的首选方法。
file_get_contents()的参数也为文件名,直接file2=hello%20ctf时file2为字符串,需要用data://协议使它当做文件。
二.伪协议介绍
1.file://协议:用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响
file:// [文件的绝对路径和文件名]
2.php://协议:访问各个输入/输出流(I/O streams);
php://filter用于读取源码。
php://input用于执行php代码。
php://filter/convert.base64-encode/resource=文件路径 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。
3.zip://协议:可以访问压缩包里面的文件。
4.data://协议:可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。从而导致任意代码执行。
三.构造payload
首先file2,我们需要将hello ctf变为文件名,所以用data://协议,用法为:data://text/plain,base64
text/plain的意思是将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理。
接着file1用php://协议,根据前文的php://filter/convert.base64-encode/resource=文件路径 ,
可以得出file1=php://filter/convert.base64-encode/resource=flag.php
最后得出:payload=
?file1=php://filter/convert.base64-encode/resource=flag.php&file2=data://text/plain,hello ctf
最后解码,即可得到flag:cyberpeace{8a3302966724e851a3b230a205932260}