18.fileclude
include函数:包含并执行变量或者文件。
if:是if语句用来判断。
isset:判断变量是否存在,值是否为NULL。
$_GET:接收表单提交数据,并把数据附加到url链接当中。
逻辑运算符&&:条件都满足才会执行。
关系运算符!:不、反的意思。
empty函数:只用来判断变量的值是否为NULL。
file_get_contents() 函数:把整个文件读入一个字符串中。
===:判断值是否相同并且判断值的类型是否相同。
else:条件都不满足的时候才会执行它。
die函数:输出内容并退出程序。
打开题目场景发现有if嵌套语句,存在flag.php,并且可以执行这个文件。
第一个if语句说的是如果file1和file2这两个变量都存在并且值不是空的,就会存放这两个数据的from表单,并将这个数据表单发送到url中。
第二个if语句说的是如果这两个变量都不为NULL,则返回true,并执行,但是前面加的有关系运算符!,所以说这两个值都是空的才会返回true,并执行。显而易见这两个变量都是存在的,但是值都是空的。???????
第三个if语句说的是file_get_contents() 函数包含file2变量,当满足file2的值等于hello ctf以及值的类型两者相同(类型是字符串),才会执行包含在include函数中的file1变量。(所以说这里咱们需要用到php://input绕过)
当这三个条件都不满足就会输出NONONO这个字符串。(显然可见这是不可能的)
解题:
执行构造好的payload
file1的写法是构造php伪协议的规则
?file1=php://filter/convert.base64-encode/resource=flag.php
关于后面跟的file2
file1=php://filter/read=convert.base64-encode/resource=flag.php 以Base64的格式读取文件flag.php中的语句;
file2=data://text/plain,hello ctf 以纯文本格式写入题目要求的内容hello ctf~
简单的通过post传参hello ctf是不可以的,下图中点击执行后并没有反应
php://input可以读取没有处理过的POST数据
file_get_contents函数是打开文件读取的,所以我们这里需要利用php的data伪协议写入数据,也就是上面的写法
?file1=php://filter/convert.base64-encode/resource=flag.php&file2=data://text/plain,hello ctf