PHP文件包含小总结

2023-05-26 0 679

1.1.邻近地区Cadours

彼时辨认出url两个模块file=/home/task.php,突发奇想,把/home/task.php换成了../../../../../../etc/passwd
PHP文件包含小总结
接著推送暗含php标识符的允诺,先phpinfo试一试看。
PHP文件包含小总结
hondayz包涵笔记了,觉得马上要是降落了,结论很忽然,no such file了,又换了两个方向,却是这种。
PHP文件包含小总结
没配套措施而已试一试包涵呵呵配置文档,结论….那样。
PHP文件包含小总结
这可怎么办,眼看着要是getshell了,没方向啊,忽然想不到除了两个ssh log能试著包涵呵呵,马上来了信念头,砰痛打敲,拇指放到二百六十名上,迟疑,这回了!忽然我双眼一闭,重重的挪动quarterfinal,当我渐渐睁开眼时,目瞪口呆,总算没no such file 了
PHP文件包含小总结
接下去就很单纯了间接ssh相连:ssh ‘<?=eval($_REQUEST[1])?>’@remotehost包涵ssh log文档,接着继续执行下指示:id。获得成功!
PHP文件包含小总结

2.文档包涵小科学知识

2.1.包涵表达式

1、PHP共计4个与文档包涵有关的表达式:

include

require

include_once

require_once

2、Include与include_once的区别:

(1)Include:会将指定的文档载入并继续执行里面的程序;重复引用的情况下加载多次。

例如:

PHP文件包含小总结
这里include两次1.php文档,所以就会包涵1.php两次。

(2)Include_once:会将指定的文档载入并继续执行里面的程序;此行为和include语句类似,唯一区别是如果该文档中已经被包涵过,则不会再次包涵。

例如:

PHP文件包含小总结

这里include_once了两次1.php文档,但只会包涵1.php一次。

(3)require和requireonce的用途与上面两个那样,但区别就是require和requireonce会加载页面最开始继续执行。Include和include_once会按标识符顺序执行。

2.2.支持的协议和封装协议

File:// ——访问邻近地区文档系统

http(s):// ——访问HTTP(s)网址

ftp:// ——访问FTP(s) URLs

php:// ——访问各个输入/输出流(I/O streams)

zlib:// ——压缩流

data:// ——数据(RFC 2397)

glob:// ——查找匹配的文档方向模式

phar:// ——PHP归档

ssh2:// ——Secure Shell 2

rar:// ——RAR

ogg:// ——音频流

expect:// ——处理交互式的流

2.3.常用伪协议讲解:

1. file://

(1)这个协议能展现邻近地区文档系统,默认目录是当前的工作目录。

(2)例如:file:///etc/passwd、file://key.txt

2. php://

(1) php://input是个能访问允诺的原始数据的只读流,能访问允诺的原始数据的只读流,将post允诺中的数据作为php标识符继续执行。

(2) php://filter是一种元封装器,设计用于数据流打开时的筛选过滤应用。

PHP文件包含小总结

3、phar://

(1)phar://数据流包装器自PHP5.3.0起开始有效

(2)例如:phar://E:/phpstudy/www/1.zip/phpinfo.txt

phar://1.zip/phpinfo.txt

2.4.伪协议利用方式小归纳:

PHP文件包含小总结

3.getshell归纳

3.1.Getshell之session

条件:session文档方向已知,且session文档中内容部分可控。

1、session文档的保存方向能在phpinfo的session.save_path看到。
PHP文件包含小总结

2、默认方向:

/var/lib/php/sess_PHPSESSID

/var/lib/php/sess_PHPSESSID

/tmp/sess_PHPSESSID

/tmp/sessions/sess_PHPSESSID

session的文档名格式为sess_[phpsessid]。而phpsessid在推送的允诺的cookie字段中能看到。
PHP文件包含小总结

利用:

1.要包涵并利用的话,需要能控制部分sesssion文档的内容。能先包涵进session文档,观察里面的内容,接着根据里面的字段来辨认出可控的变量,从而利用变量来写入payload,并之后再次包涵从而继续执行php标识符。

2.例如现在有两个session.php可控用户会话信息值:

PHP文件包含小总结

3.能看到这个session.php文档中的用户会话信息username的值是用户可控制的,那我们就能传入恶意标识符进行攻击利用。

PHP文件包含小总结

4.将恶意标识符传入以后,接下去要是利用文档包涵漏洞去包涵这个恶意标识符。

PHP文件包含小总结

5.从返回结论来看,我们的payload和恶意标识符已经正常解析和继续执行。

3.2.Getshell之笔记

3.2.1.访问笔记

条件:需要知道服务器笔记的存储方向,且笔记文档可读。

笔记存储默认方向:

1.apache+Linux笔记默认方向:/etc/httpd/logs/accesslog或/var/log/httpd/accesslog

2.apache+win2003笔记默认方向:D:xamppapachelogsaccess.log、D:xamppapachelogserror.log

3.IIS6.0+win2003默认笔记文档:C:WINDOWSsystem32Logfiles

4.IIS7.0+win2003 默认笔记文档:%SystemDrive%inetpublogsLogFiles

5.nginx 笔记文档:笔记文档在用户安装目录logs目录下,假设安装方向为/usr/local/nginx,那笔记目录就是在/usr/local/nginx/logs下面

利用:

1.多数情况,web服务器会将允诺写入到笔记文档中,比如说apache。在用户发起允诺时,会将允诺写入access.log,当发生错误时将错误写入error.log。默认情况下,笔记保存方向在/etc/httpd/logs/下。

2.但如果是间接发起允诺,会导致一些符号被编码使得包涵无法正确解析。能使用burp截包后修改。

PHP文件包含小总结

3.正常的php标识符已经写入了 /etc/httpd/logs/access.log。接着包涵即可继续执行标识符。

PHP文件包含小总结

4.但有的时候,log的存放地址会被更改。这个时候能通过读取相应的配置文档后,再进行包涵。

中间件默认配置文档存放方向:

1.apache+linux 默认配置文档

/etc/httpd/conf/httpd.conf或/etc/init.d/httpd

2. IIS6.0+win2003 配置文档

C:/Windows/system32/inetsrv/metabase.xml

3. IIS7.0+WIN 配置文档

C:WindowsSystem32inetsrvconfigapplicationHost.config

3.2.2.SSH log

条件:需要知道ssh-log的位置,且可读。

ssh笔记默认方向:

1./var/log/auth.log

2./var/log/secure

利用:

1.用ssh相连:

ssh ‘ ’@remotehost

之后会提示输入密码,随便输入就能。
PHP文件包含小总结

2.接着利用文档包涵,包涵笔记文档:

PHP文件包含小总结

3.3.Getshell之environ

条件:

php以cgi方式运行,这种environ才会保持UA头。environ文档存储位置已知,且有权限访问environ文档。environ文档默认位置:

proc/self/environ

利用:

1.proc/self/environ中会保存user-agent头。如果在user-agent中插入php标识符,则php标识符会被写入到environ中。之后再包涵它,即可。

2.例如我们现在访问两个网站,使用burpsuite抓包,将恶意标识符插入到user-agent中。
PHP文件包含小总结

3.利用文档包涵漏洞去包涵proc/self/environ,获得成功继续执行php标识符。

PHP文件包含小总结

3.4.Getshell之利用phpinfo

条件:存在phpinfo页面并且存在文档包涵漏洞

PHP文件包含小总结

原理:

当我们给PHP推送POST数据包时,如果数据包里包涵文档区块,PHP就会将文档保存成两个临时文档,方向通常为:/tmp/php[6个随机字符],这个临时文档,在允诺结束后就会被删除。因为phpinfo页面会将允诺上下文中的所有变量打出来,所以我们如果向phpinfo页面推送包涵文档区块的数据包,就能在返回包里找到临时文档名,也就是$_FILES变量中的内容。

利用:

首先我们使用vulhub的脚本(https://github.com/vulhub/vulhub/blob/master/php/inclusion/exp.py),他能实现包含临时文档,而这个临时文档的内容是:<?php fileputcontents(‘/tmp/p’,<?=eval($_REQUEST[1])?>’)?>。获得成功包涵这个文档后就会生成新的文档/tmp/p,这个文档就会永久的留在目标机器上。
PHP文件包含小总结
写入获得成功以后,我们利用文档包涵来继续执行任意指示。
PHP文件包含小总结

原理:

那么为啥vulhub的脚本是如何做到在临时脚本文档删除前去包涵的呢,其实就是用到了条件竞争,具体流程大致如下:

首先推送包涵webshell的数据包给phpinfo页面,并用大量的垃圾数据将header和get等位置填满。因phpinfo页面会将所有数据打印出来,第两个步骤中的垃圾数据就会将phpinfo页面撑的非常大。而php默认输出缓冲区大小为4096,也能理解为php每次返回4096个字节给socket相连。所以,这里间接操作原生socket,每次读取4096个字节。只要我们读取到字节里包涵临时文档名,就马上推送文档包涵漏洞利用的数据包。因为第两个数据包的socket相连没结束,所以临时文档还没删除,我们就能文档包涵获得成功。

3.5.Getshell之上传文档

条件:有上传点,知道上传上去的文档名和存放目录。

利用:

这里用两个靶场单纯演示呵呵,找个文档上传点,上传两个暗含php恶意标识符的图片。
PHP文件包含小总结
我们现在已知文档名称和方向,能利用文档包涵漏洞去包涵这个图片,就能获得成功继续执行php标识符了。
PHP文件包含小总结

4.应对措施

1、在很多场景中都需要去包涵web目录之外的文档,如果php配置了open_basedir,则会包涵失败。

2、对能包涵的文档进行限制,能采用白名单的方式,或设置能包涵的目录。

3、对危险字符进行过滤。

4、尽量不使用动态包涵等等

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务