bugku web flag在index里

题目描述

bugku web flag在index里_第1张图片
bugku web flag在index里_第2张图片
看到了点击以后的url,尝试了一下?file=index.php,结果失败,啥都没有,上网搜了一下题解,发现这是php中的本地文件包含

本地文件包含 LFI

php的本地文件包含可以参见最后的几个参考博客

在这道题中,用到了php://filter这个漏洞,可以指定要读的内容和编码方式,在这里,php://filter的实现有一个限制,那就是要有include()include_once()函数将传进去的参数作为文件读出来,这里先提前看一下源码

<html>
    <title>Bugku-ctf</title>
    

	error_reporting(0);
	if(!$_GET[file]){echo 'click me? no';}
	$file=$_GET['file'];
	if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
		echo "Oh no!";
		exit();
	}
	include($file); 
//flag:flag{edulcni_elif_lacol_si_siht}
?>
</html>

从源码中可以看到,我们的file参数在最后一个函数的地方被作为include()函数的参数传了进去,因此造成了本地文件包含的漏洞

漏洞利用

在LFI中,php://filter有以下参数可以使用

名称 描述 备注
resource=<要过滤的数据流> 指定了你要筛选过滤的数据流 必选
read=<读链的筛选列表> 可以设定一个或多个过滤器名称,以管道符(|)分隔 可选
write=<写链的筛选列表> 可以设定一个或多个过滤器名称,以管道符(|)分隔 可选
<;两个链的筛选列表> 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链

include()函数当中,直接被作为参数的值,无论是什么类型的文件,都会直接被当作php脚本来执行,但是从上面的源码也可以看到,并不是所有的php脚本执行以后都会输出有效的结果,因此,在这个过程当中,最理想的状态就是我们可以得到php文件的源码,那这就要求我们保证代码不被include()给执行掉,所以我们选择base64对php脚本进行加密,同时指定要读取的文件,最后构造出payload

?file=php://filter/read=convert.base64-encode/resource=index.php

得到flag,base64一转就好
bugku web flag在index里_第3张图片

参考

PHP伪协议总结 - 个人文章 - SegmentFault 思否

chybeta大佬的博客 php文件包含漏洞 | Chybeta

离别歌大佬 谈一谈php://filter的妙用 | 离别歌

文中表格来自于 php://filter 的使用_PHP_hhh-CSDN博客

你可能感兴趣的:(#,bugku)