0x00 前言
php作为一门常用的脚本语言,本身带有不少能用于文件包含的预设函数。它们既给文件操作与多文件系统的架构组织带来便利,也会因为使用不当而埋下相当大的隐患。其中,比较常用的有
- require
- require_once
- include
- include_once
- highlight_file
- show_source
- readfile
- file_get_contents
- fopen
从攻击来源看,通过文件包含漏洞进行的攻击(下简称“攻击”)可大致分为本地文件包含、远程文件包含;从攻击手段看,攻击可大略分为主要使用截断进行的攻击、主要利用内置协议的攻击等,当然还有利用xss等手段进行的攻击,可能会在后续系列中介绍。攻击的结果一般是任意文件读取、Get shell等
无论是哪种攻击方式,几乎都有一个共同点,那就是源码里将用户输入变量(无论是否经过过滤)作为参数传入了上述的文件包含函数中,最简单的例子便是
<?php
include $_GET['file'];
?>
只要修改一下file的值,就可以利用include的运行、跳转功能来运行我们上传的恶意文件或是读取本应对访问者不可见的文件(.htacess、各类配置文件等等)。而在实际攻击时,对方的部署往往没有那么简单,而是经过了各类过滤、拼接、权限控制,这时候就要用到截断等方式进行绕过了。
0x01 利用截断进行的攻击
由于截止本文发布,笔者对此的了解都不深,故只作简单叙述,之后会更新或是在下一篇中详述
截断往往用于绕过
<?php
include($_GET['file'].".html");
?>
等拼接,其中最著名的就是利用%00
进行的截断,php会无视%00
后的内容从而实现截断,但是据说在5.3.4的版本后就已经修复了这个漏洞。除此之外,还有利用路径长度的截断,例如
?file=../../../../../../../../../etc/passwd/././././././.[…]/./././././.
linux系统下需要大于4096,windows下需要大于256
又如利用点号长度的截断,当路径中包含超过256个点号时windows下就会忽略后面的内容
截断1.PNG 截断.PNG
0x02 利用内置协议的攻击
PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。 除了这些封装协议,还能通过 stream_wrapper_register() 来注册自定义的封装协议
引自官方手册
首先上图,一图流解析常见的伪协议攻击方法,图引自Freebuf专栏
下面将对其进行解释
1. php.ini中的设置
php的设置文件中有如下几项设置,它们的开关与否直接决定了我们能使用哪些攻击方法、攻击效果如何
ini.PNG
其中最重要的就是前面两项,allow_url_fopen和allow_url_include的设置,其具体释义在上方英文里有,大意就是远程文件打开和远程文件包含。这两项的开关与内置协议的关系如图一。因此,在有条件的情况下先试图读取这两项的配置能帮助我们快速找到思路
网友评论