PHP文件操作漏洞
今天师傅们在群里聊到一个问题,有关于PHP文件操作对目录和文件判定相关的一个点,看了师傅们找到的一篇文章,感觉很有意思
PHP底层实现存在的一些问题,导致PHP写入、读取时对畸形文件名存在一些错误处理,导致漏洞产生
例一
file_put_contents和fopen等函数,使用了PHP的底层封装流,面对/var/www/html/index.php/. 这种畸形路径时会将其解析为正常的/var/www/html/index.php,导致对后缀名的绕过,而对于rename,unlink等函数,则会直接将此路径在Linux下进行系统调用,得到not a directory的错误,无法删除
此问题在Linux与Windows系统下均存在
例二
/var/www/html/null/../index.php
在其中设置一个不存在的null目录,再使用..跳出,在Linux识别到未知目录时会引发找不到目录的错误,而Windows在不存在目录后接..则会忽略该目录,但PHP在处理时会因为Linux下的这个问题导致对已存在的index.php的重写
例三
PHP超全局变量$_FILES可以获取上传的全部文件,$_FILES[‘file’][‘name’]会获取上传文件名中最后一个/后的内容,而上传的文件会存在于一个tmp目录下,该名称可以由$_FILES[‘file’][‘tmp_name’]获取,并在move_uploaded_file时使用该名称进行移动,tmpfile的名称为php+六位随机字符串,在脚本执行结束时删除。
如果边提交文件边访问phpinfo界面,其会显示$_FILES的内容,也就是可以获取到tmp_name,虽然此时脚本已经允许完毕文件被删除,但可以尝试条件竞争进行getshell
贴一个链接
https://blog.csdn.net/adminuil/article/details/104398823
并且这里的$_FILE[‘file’]这里的file是上传时提交的一项参数,如果检测只对$_FILE[‘file’]进行检测,而上传使用了其他的函数将所有收到的文件进行保存的话,就可以随便上传一个文件,把file改成随便什么东西就可以进行绕过了