欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

bugku web flag在index里

程序员文章站 2022-03-25 08:13:36
...

题目描述

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

本地文件包含 LFI

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

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

<html>
    <title>Bugku-ctf</title>
    
<?php
	error_reporting(0);
	if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
	$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里

参考

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

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

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

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

相关标签: # bugku