PHP代码审计:本地文件包含漏洞

原文链接: https://blog.csdn.net/God_XiangYu/article/details/97900649

当你的才华

还撑不起你的野心时

那你就应该静下心来学习


       代码审计学习线上实验,都是CE一边实操,一边整理的笔记,方便以后翻看时,可快速查阅。

目录

文件包含漏洞

文件包含漏洞分类

 本地文件包含漏洞实例


文件包含漏洞

   文件包含漏洞严格来说,属于"代码注入"的一种,其原理就是注入一段用户能控制的脚本或代码,并让服务端执行, 来完成恶意攻击

简介:

       开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。

       开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用, 但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的,造成文件包含漏洞。

常见的文件包含相关函数有:


  
  
  1. include()
  2. require()
  3. include_once()
  4. require_once()

include():

       执行到include时才包含文件,找不到被包含文件时只会产生警告,代码会继续执行

require():

       程序开始运行就预先包含文件,找不到被包含的文件时会产生致命错误,并停运行

include_once()和require_once():

       功能和上面一样,但文件中代码已被包含则不会再次包含

 

文件包含漏洞分类:

  • 本地文件包含:包含本地文件,主要出现在模块加载、模板加载和cache调用之处

  • 远程文件包含:包含的文件位于远程服务器上,需要设置allow_url_include = on

 本地文件包含漏洞实例

代码如下:

把一下几个php放在同一个目录文件里面fileinclude.php、fileinclude_black.php、fileinclude_white.php、remotefile.php、file.php、local.php、right.php、file.txt

fileinclude.php


  
  
  1. if ( isset($_GET[ 'file'])) {
  2. include($_GET[ 'file']);
  3. }
  4. else{
  5. echo "使用 file 参数包含文件";
  6. }
  7. ?>

fileinclude_black.php


  
  
  1. <?php
  2. header( "Content-Type: text/html; charset=utf-8");
  3. if ( isset($_GET[ 'file'])) {
  4. $file = $_GET[ 'file'];
  5. $file = str_replace( "http:", "", $file);
  6. $file = str_replace( "https:", "", $file);
  7. include($file);
  8. }
  9. else{
  10. echo "使用 file 参数包含文件";
  11. }
  12. ?>

fileinclude_white.php


  
  
  1. <?php
  2. header( "Content-Type: text/html; charset=utf-8");
  3. if ( isset($_GET[ 'file'])) {
  4. $file = $_GET[ 'file'];
  5. if($file != "right.php")
  6. {
  7. echo "错误!不能加载此文件!";
  8. exit;
  9. }
  10. include($file);
  11. }
  12. else{
  13. echo "使用 file 参数包含文件";
  14. }
  15. ?>

remotefile.php


  
  
  1. <?php
  2. include($_GET[ 'file']);
  3. ?>

file.php


  
  
  1. <?php
  2. echo '你已成功加载file.php';
  3. ?>

local.php


  
  
  1. <?php
  2. if( !ini_get( 'display_errors') ) {
  3. ini_set( 'display_errors', 'On');
  4. }
  5. error_reporting(E_ALL);
  6. if ( isset($_GET[ 'file'])) {
  7. $f =$_GET[ 'file'];
  8. if ($f){
  9. }
  10. else{
  11. print( "No File Included");
  12. }
  13. }
  14. ?>

right.php


  
  
  1. <?php
  2. echo "right.php 加载成功";
  3. ?>

创建一个file.txt 文本,里面存在跟file.php 一样的内容


  
  
  1. <?php
  2. echo '你已成功加载file.php';
  3. ?>

访问fileinclude.php

输入?file=file.php,加载同目录下的file.php文件中的代码 

成功执行了file.php文件中的代码,使用echo输出了字符串,如果file.php中的代码是一些通用的函数模块,这种代码复用方式无疑会给开发者代码非常大的便捷,而且后期修改也不同到每个文件中修改,只需修改file.php就可以了,类似于配置文件得作用。 但是这里未对用户的输入过滤,所以会出现意料之外的危险。

比如包含一些linux系统上的敏感文件:

输入?file=/etc/passwd

可以看到成功执行/etc/passwd 命令

值得注意的是,被包含的文件无论是不是以.php结尾,服务器都会以php代码的方式解析它。

 比如我们输入?file=file.txt(和file.php内容一样):

PS:

       这个特点使得文件包含漏洞经常和文件上传漏洞结合使用。

       比如有些地方可以上传头像,图片等,但是由于上传的限制,一般只能上传jpg,png的图片格式,代码无法被直接加载执行,所以这里先上传.jpg .png等结尾的图片,图片的内容为一句话木马,然后通过本地文件包含的方式将图片包含进来,代码就执行了


我不需要自由,只想背着她的梦

一步步向前走,她给的永远不重


猜你喜欢

转载自blog.csdn.net/bylfsj/article/details/102731840
今日推荐