我们先打开题目场景,如图:
函数理解:
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这个字符串。(显然可见这是不可能的)
二、 解题思路:
解题关键是在第三个if语句中,我们可以用php://input输入流来绕过file_get_contents函数,达到执行file1变量的目的,用php://filter伪协议来读取源代码,用来拿到flag。
php://input可以读取没有处理过的POST数据。
php://filter伪协议规则:
php://filter/过滤器|过滤器/resource=待过滤的数据流
构造php://filter伪协议规则:
php://filter/convert.base64-encode/resource=flag.php
完整代码:
?file1=php://filter/convert.base64-encode/resource=flag.php&file2=php://input
?是起始符可以理解为连接拼接的意思,file1是场景代码中的变量,=是赋值的意思。
convert转换,base64,encode编码。
&引用,不同名字访问同一变量的内容。
resource=flag.php转换到flag.php文件中,就是说把flag.php文件转换为base64编码格式。
我们先引用file2变量用来请求数据,把flag.php文件的内容赋值给file1变量,因为最终执行的是file1变量。分析到这里就可以了。
三、解题:
用到的工具有:
火狐浏览器FireFox和Max HackBar火狐浏览器插件(之前那个收费了,这个也可以替代之前那个工具,这个插件可以在火狐浏览器扩展哪里搜索并添加)
1、用火狐浏览器打开场景,并按F12找到Max HackBar插件并点击进入。(如果空白可以刷新下页面)
2、在url链接后边添加伪协议和绕过并在Max HackBar那个页面点击Load URL用来在地址栏那里加载URL地址。(和Split URL性质一样只是把url给分割多行了。)
3、✔Post Data。(传递数据)
4、输入hello ctf。
5、点击Execution。
6、拿到base64编码。
base编码解码拿到flag: